4、计算资源优化(下):容器化改造与资源限制,Serverless 架构的成本优势,GPU 资源调度与共享

4.1 容器化改造:从“大锅饭”到“小份菜”

说实话,很多团队做容器化改造,初衷都是“别人都在做,我也要做”。但真正落地后才发现,容器化本身不省钱,省钱的是你如何用它来管资源。

我见过最典型的场景:一台物理机跑一个 Java 应用,内存给了 32G,实际只用 8G。剩下的 24G 就这么空着,谁也不敢动。为什么?因为怕业务高峰期扛不住。这就是典型的“大锅饭”思维——资源给你了,你用不完是你的事,但你不能让我不够用。

容器化改造的核心,说白了就是把“大锅饭”变成“小份菜”。每个容器只拿自己够用的资源,剩下的资源可以给别的容器用。这样整体利用率就上去了。

核心收益:

  • 资源利用率从 20%-30% 提升到 60%-80%
  • 部署密度提升 3-5 倍
  • 弹性伸缩能力从小时级降到秒级

4.2 Requests 和 Limits:别让容器“饿死”也别让它“撑死”

容器化改造中最容易踩的坑,就是 Requests 和 Limits 的设置。我刚开始做 Kubernetes 时,也犯过“全给 Limits 设很大”的错误。结果呢?节点资源被撑爆,Pod 被 OOM Kill,业务直接挂了。

Requests 是什么? 它是容器启动时“保证能拿到”的资源量。调度器会根据这个值来决定把 Pod 放在哪个节点上。

Limits 是什么? 它是容器“最多能用”的资源量。超过这个值,容器会被限制甚至杀掉。

我曾经踩过的坑:

有一次,我把一个 Java 应用的 Requests 设成了 2C4G,Limits 设成了 4C8G。结果节点上跑了 3 个这样的 Pod,每个 Pod 实际只用了 1C2G。但调度器以为每个 Pod 需要 2C4G,所以节点上还有大量空闲资源,却调度不了新的 Pod。这就是典型的“资源碎片”问题。

我的建议是:Requests 和 Limits 不要设成一样。Requests 按实际使用量的 80% 来设,Limits 按峰值的 120% 来设。这样既能保证资源不浪费,又能应对突发流量。

一个小技巧:

用 VPA(Vertical Pod Autoscaler)跑一段时间,它会根据历史数据推荐合理的 Requests 和 Limits 值。我习惯先用 VPA 跑一周,再手动调整。

4.3 Serverless 架构:按需付费的“真香”体验

你想想看,如果你的业务有明显的波峰波谷,比如白天流量大、晚上流量小,或者工作日忙、周末闲,那用传统方式就是“全天候烧钱”。

Serverless 架构的好处就在于:你不用为闲置资源付费。没有请求时,函数根本不运行,也就不会产生费用。

我在项目中遇到过这样一个场景:一个数据处理任务,每天凌晨跑一次,每次跑 10 分钟。如果用一台 4C8G 的 ECS 来跑,一个月要花 500 多块。但换成 Serverless 函数,每次执行只花几毛钱,一个月下来不到 20 块。这就是“真香”体验。

Serverless 的成本优势体现在:

  • 零闲置成本:没有请求时,不产生任何费用
  • 细粒度计费:按实际执行时间和内存消耗计费,精确到毫秒
  • 自动弹性:流量从 0 到 10 万 QPS,自动伸缩,无需人工干预
  • 运维成本低:不用管操作系统、补丁、扩容等琐事

适用场景:

  • 定时任务、批处理作业
  • API 网关后端、Webhook 处理
  • 事件驱动型任务(如文件上传后处理)
  • 低频访问的微服务

但 Serverless 也不是万能的。如果你的业务是持续高并发、长连接、或者对冷启动敏感,那 Serverless 可能并不适合。嗯,这里要注意:冷启动延迟是 Serverless 的硬伤,一般会有 100ms-1s 的延迟,对延迟敏感的业务要慎重。

4.4 GPU 资源调度与共享:让每一块 GPU 都物尽其用

GPU 有多贵,做 AI 的同学都懂。一块 A100 就要十几万,如果利用率只有 30%,那简直是暴殄天物。

我见过最夸张的情况:一个团队买了 8 块 V100,每块 GPU 上只跑一个模型训练任务,训练完了就空着。我问他们为什么不共享?他们说“怕互相影响”。

其实,GPU 共享技术已经很成熟了。主要有几种方式:

  • MIG(Multi-Instance GPU):NVIDIA 官方技术,可以把一块 A100 切分成最多 7 个独立实例,每个实例有独立的显存和计算单元
  • vGPU:通过虚拟化技术,把一块 GPU 分给多个虚拟机使用
  • 时间片调度:多个任务轮流使用 GPU,适合推理场景
  • 显存隔离 + 计算共享:每个任务分配固定显存,计算资源按需分配

我的实践经验:

在 Kubernetes 中,我习惯用 Volcano 或 Hamid 来做 GPU 调度。它们支持 GPU 共享、显存隔离、优先级抢占等功能。比如,一个推理服务只需要 2G 显存,但整块 GPU 有 16G,那就可以把剩下的 14G 分给其他任务。这样一块 GPU 能同时跑 5-6 个推理服务,利用率从 20% 提升到 80%。

GPU 共享的注意事项:

  • 训练任务对显存要求高,建议用 MIG 做硬隔离
  • 推理任务对延迟敏感,建议用时间片调度,避免争抢
  • 混合部署时,要设置好 QoS 等级,保证高优任务不受影响

我曾经踩过的坑:

有一次,我把一个训练任务和一个推理任务放在同一块 GPU 上,没做显存隔离。结果训练任务把显存吃光了,推理任务直接 OOM,线上服务挂了。后来我改用 MIG 做硬隔离,才彻底解决这个问题。

4.5 本章知识体系

下面这张图,是我梳理的本章核心逻辑。你可以把它当作一个“决策地图”:

计算资源优化决策地图 计算资源优化 容器化改造 Serverless 架构 GPU 资源调度 Requests/Limits 设置 资源碎片治理 VPA 自动调优 按需付费 零闲置成本 自动弹性伸缩 MIG 硬隔离 vGPU 虚拟化 时间片调度 核心目标:提升资源利用率,降低单位计算成本 容器化 → 消除资源碎片,提升部署密度 Serverless → 消除闲置成本,按需付费 GPU 共享 → 一块 GPU 当多块用

4.6 总结

计算资源优化,说白了就是三件事:让资源不浪费、让成本不虚高、让性能不妥协

容器化改造是基础,把“大锅饭”变成“小份菜”;Requests/Limits 是精细化管理,别让容器“饿死”也别让它“撑死”;Serverless 是极致弹性,不为闲置资源买单;GPU 共享是硬核技术,让每一块 GPU 都物尽其用。

我个人的习惯是:先做容器化,再调 Requests/Limits,然后看业务场景决定是否上 Serverless,最后才考虑 GPU 共享。因为 GPU 共享的技术门槛最高,风险也最大,需要充分的测试和灰度。

嗯,这一章的内容就到这里。记住:优化不是一蹴而就的,而是一个持续迭代的过程。每优化一步,成本就降一点,这就是运维的价值所在。


专注资料整理