4、计算资源优化(上):实例规格选型、弹性伸缩策略与Spot实例的最佳实践

大家好,我是你们的老朋友。今天咱们聊聊计算资源优化,这是云成本里的大头,也是我最常被问到的话题。

说白了,计算资源优化就三件事:选对机器、用对策略、薅对羊毛。我见过太多团队,一上来就上最大的实例,结果CPU利用率不到10%,钱全打水漂了。嗯,咱们一个一个说。

4.1 实例规格选型:别让钱花在闲置上

选实例规格,说白了就是给业务挑最合适的“车”。你开个跑车去拉货,肯定不划算。

核心原则:匹配业务特征,拒绝“大炮打蚊子”。

我个人习惯把业务分成三类:

  • 计算密集型:比如视频转码、科学计算。这类业务CPU是瓶颈,选C系列(如AWS的C5、阿里云的ECS计算型)。
  • 内存密集型:比如Redis、内存数据库。内存是命根子,选R系列(如AWS的R5、阿里云的ECS内存型)。
  • 通用型:比如Web服务器、微服务。啥都干一点,选M系列(如AWS的M5、阿里云的ECS通用型)。

我在项目中遇到过一件事:有个客户跑一个轻量级的Java应用,用了32核64G的实例。我一看监控,CPU平均利用率才5%。我建议他换成8核16G的,性能完全够,成本直接降了75%。

小技巧: 选型前,先跑一周的监控。看看CPU、内存、网络IO的峰值和均值。别凭感觉选,数据说话。

4.1.1 实例族的选择:不只是看大小

同一个系列里,还有不同代际。比如AWS的C5和C6g,后者用了ARM架构,性价比更高。但要注意,你的软件得支持ARM。

我建议:优先选最新代际的实例。新代际通常性能更好,价格反而更低。云厂商为了推广新硬件,经常有折扣。

业务类型 推荐实例族 典型场景
计算密集型 C5 / C6g / 计算型c7 视频转码、批处理、游戏服务器
内存密集型 R5 / R6g / 内存型r7 Redis、内存数据库、SAP HANA
通用型 M5 / M6g / 通用型g7 Web服务器、微服务、中小型数据库
GPU密集型 P3 / P4 / GPU型gn7 AI训练、图形渲染、科学计算
注意: 别只看vCPU数量。有些实例是“突发性能”的(如AWS的T系列),平时给你一个基线,突发时用积分。如果业务长期高负载,千万别选T系列,积分用完了性能会暴跌。我曾经有个客户,线上业务用了T3实例,一到高峰期就卡死,排查了半天才发现是积分用完了。

4.2 弹性伸缩策略:让资源跟着业务跑

弹性伸缩,说白了就是“忙时多开,闲时少开”。这是云计算的精髓,也是省钱的核心手段。

但很多人用错了。我见过有人设了一个伸缩策略:CPU超过80%就加机器,低于20%就减机器。结果呢?业务一波动,机器频繁启停,反而更不稳定。

核心原则:伸缩策略要“稳准狠”,别让系统来回震荡。

4.2.1 基于指标的伸缩:别只看CPU

CPU利用率是个好指标,但不是万能的。比如一个Web应用,可能CPU不高,但请求队列已经排了很长了。这时候应该看请求延迟队列深度

我建议的组合策略:

  • 主指标:CPU利用率 + 内存利用率(基础监控)
  • 辅助指标:请求延迟、队列深度、连接数(业务监控)
  • 冷却时间:加机器后,至少等3-5分钟再判断是否继续加。减机器时,冷却时间要更长,比如10分钟。
避坑指南: 我曾经给一个电商客户做优化,他们用了“CPU超过70%就加一台”的策略。结果双十一流量暴增,CPU瞬间冲到90%,策略触发,加了一台。但新机器启动需要2分钟,这2分钟内CPU继续飙升,又触发加机器……最后加了20台,流量高峰过去了,又得慢慢减。这就是典型的“震荡”。后来我改成“CPU超过80%持续5分钟才加机器”,问题就解决了。

4.2.2 基于时间的伸缩:可预测的省钱利器

如果你的业务有规律,比如白天人多、晚上人少,或者工作日忙、周末闲,那基于时间的伸缩是最省钱的。

举个例子:一个在线教育平台,晚上7点到10点是高峰期。我建议他们设一个定时策略:每天下午6点开始加机器,晚上10点开始减机器。这样既保证了用户体验,又避免了白天资源浪费。

# 伪代码示例:基于时间的伸缩策略
# 每天18:00 增加5台实例
schedule_scale_out: 
  cron: "0 18 * * *"
  action: add_instances(5)

# 每天22:00 减少5台实例
schedule_scale_in:
  cron: "0 22 * * *"
  action: remove_instances(5)
小技巧: 时间策略和指标策略可以结合使用。比如白天用时间策略保底,晚上用指标策略应对突发流量。这样既省钱又安全。

4.3 Spot实例:云上的“打折机票”

Spot实例,说白了就是云厂商的闲置资源,以极低的价格卖给你。但有个缺点:云厂商随时可能回收。你想想看,这就像打折机票,便宜但可能被改签。

核心原则:用Spot实例,必须做好“随时被回收”的准备。

4.3.1 什么业务适合用Spot?

不是所有业务都能用Spot。我总结了三类适合的场景:

  • 无状态应用:比如Web服务器、微服务。挂了就重启,不影响数据。
  • 批处理任务:比如大数据分析、视频转码。任务可以中断重跑。
  • CI/CD流水线:比如编译、测试。跑完就销毁,无所谓中断。

不适合的场景:数据库、有状态服务、长时间运行的业务。

注意: 我曾经有个客户,把数据库跑在Spot实例上。结果云厂商回收了,数据库直接挂了,数据丢了半天。嗯,从那以后,我再也不敢建议别人把数据库放Spot上了。

4.3.2 Spot实例的最佳实践

用Spot实例,核心就一句话:做好容错,拥抱变化

我建议的做法:

  1. 混合使用:用On-Demand实例做“底座”,Spot实例做“弹性层”。比如Web服务器,用2台On-Demand保底,再开8台Spot应对流量高峰。
  2. 设置中断通知:云厂商会在回收前2分钟发通知。你的应用要能监听这个通知,优雅地退出。
  3. 使用Spot实例池:别只依赖一种实例类型。比如同时用C5和C5a,如果一个被回收了,自动切换到另一个。
  4. 自动重试:如果Spot被回收,自动启动一个新的Spot实例。如果Spot价格太高,自动回退到On-Demand。
# 伪代码示例:Spot实例的容错策略
def handle_spot_termination():
    # 监听中断通知
    if receive_termination_notice():
        # 优雅退出:保存状态、断开连接
        save_state()
        disconnect_clients()
        # 启动新的Spot实例
        launch_new_spot_instance()
避坑指南: 我曾经用Spot实例跑一个批处理任务,结果任务跑了3个小时,快结束时Spot被回收了,前功尽弃。后来我改成“检查点”模式:每10分钟保存一次中间结果。即使被回收,也能从最近一个检查点继续跑。这样虽然慢一点,但至少不会白干。

4.3.3 Spot实例的成本对比

Spot实例的价格通常是On-Demand的10%-30%。但要注意,价格会波动。高峰期可能涨到50%,甚至比On-Demand还贵。

我建议:设置价格上限。比如,如果Spot价格超过On-Demand的80%,就自动切换到On-Demand。这样既省钱又安全。

实例类型 On-Demand价格($/小时) Spot价格($/小时) 节省比例
m5.large 0.096 0.019 80%
c5.xlarge 0.170 0.034 80%
r5.large 0.126 0.025 80%

你看,Spot实例能省80%的钱。但前提是,你得用对地方。

好了,这一章就聊到这儿。下一章咱们继续聊计算资源优化的下半部分:容器化、Serverless和GPU优化。到时候见!