云上成本优化实战:用这套方法,我把每月云账单砍掉了60%

4 阅读6分钟

公司云账单从每月 18 万飙到 32 万,CTO 拍桌子要立刻降本。我用 2 周时间做了一轮全链路成本优化,最终把账单砍到 12.8 万/月,效果超出预期。本文把完整方法论和实操步骤全公开。

先摸清家底:成本分析 5 步法

盲目砍资源必出事故。 第一步永远是搞清楚钱花哪了。

1. 打开云厂商成本分析(以腾讯云为例)

# 用 CLI 拉取最近 3 个月的账单明细(按产品聚合)
tccli billing DescribeBillSummaryByProduct \
  --StartTime 2026-02-01 \
  --EndTime 2026-04-30

# 输出示例(已脱敏):
# | 产品         | 月均费用(元) | 占比  |
# | 云服务器 CVM | 98,200      | 38%  |
# | 云数据库 CDB | 45,600      | 18%  |
# | 对象存储 COS | 21,300      | 8%   |
# | Redis       | 18,900      | 7%   |
# | 带宽流量     | 52,100      | 20%  |
# | 其他         | 23,900      | 9%   |

2. 资源利用率大盘

import json
from tencentcloud.common import credential
from tencentcloud.monitor.v20180724 import monitor_client, models

# 批量拉取 CVM 的 CPU / 内存利用率
def get_utilization(instance_ids: list):
    cred = credential.Credential("AKIDxxx", "SKxxx")
    client = monitor_client.MonitorClient(cred, "ap-guangzhou")
    
    low_util_instances = []
    for inst_id in instance_ids:
        req = models.GetMonitorDataRequest()
        req.InstanceState = "2"  # 运行中
        req.Metrics = ["CpuUsage", "MemUsage"]
        req.Period = 3600  # 1小时粒度
        req.Instances = [{"Key": "InstanceId", "Value": [inst_id]}]
        
        resp = client.GetMonitorData(req)
        avg_cpu = sum(resp.Data["CpuUsage"]) / len(resp.Data["CpuUsage"])
        
        # CPU 平均每天 < 20% 的标记为低利用率
        if avg_cpu < 20:
            low_util_instances.append({
                "instance_id": inst_id,
                "avg_cpu": round(avg_cpu, 1),
                "spec": "4C8G"  # 从 DescribeInstances 获取
            })
    
    return low_util_instances

# 输出低利用率实例清单,优先回收
result = get_utilization(["ins-xxx1", "ins-xxx2", ...])
print(json.dumps(result, indent=2, ensure_ascii=False))

最终摸出的家底(我们公司真实数据):

浪费类型涉及金额/月严重程度
低利用率 CVM(CPU < 20%)¥31,200🔴 紧急
存储桶有 40% 文件 180 天无访问¥8,700🟡 中等
测试环境 7×24 运行¥12,400🔴 紧急
数据库规格过大(实际连接数 < 20)¥9,800🟡 中等
跨 AZ 流量费(不必要的)¥6,100🟡 中等

5 个立竿见影的降本手段

手段一:CVM 规格降配 + 竞价实例混用

场景:线下开发环境、CI/CD 构建机、离线计算任务 —— 这些场景挂了不影响业务。

# 1. 把测试环境从按量计费改为竞价实例(节省 80%)
# 腾讯云 CLI 创建竞价实例(折扣力度:按量的 10%~20%)
tccli cvm RunInstances \
  --InstanceType SA3.SMALL2 \
  --InstanceChargeType SPOTPAID \
  --SpotStrategy SpotWithPriceCap \
  --SpotPriceCap "0.05" \
  --InstanceCount 5

# 2. 低利用率生产实例降配(需要先确认业务峰值 CPU 需求)
# 查看过去 30 天 CPU 峰值
tccli monitor GetMonitorData \
  --Namespace QCE/CVM \
  --MetricName CpuUsage \
  --Period 60 \
  --Instances '[{"Key":"InstanceId","Value":["ins-xxxx"]}]' \
  | jq '.Data[] | max'  # 取峰值

# 峰值 < 60%,可以安全降配一号

成本对比:

实例类型原配置月费用优化后月费用节省
测试环境 × 8台4C8G 按量¥12,4002C4G 竞价¥1,20090%
低利用率生产 × 12台8C16G¥18,9004C8G¥9,50050%

手段二:存储生命周期管理(COS/OSS)

核心思路:热数据放在标准存储,超过 30 天未访问的自动沉降到低频存储,超过 90 天沉降到归档存储。

# 腾讯云 COS 生命周期规则(用 SDK 批量设置)
from qcloud_cos import CosConfig, CosS3Client

config = CosConfig(Region="ap-guangzhou", SecretId="AKIDxxx", SecretKey="SKxxx")
client = CosS3Client(config)

# 设置生命周期规则
lifecycle_config = {
    "Rule": [
        {
            "ID": "auto-tiering-rule",
            "Status": "Enabled",
            "Filter": {"Prefix": ""},  # 整个桶
            "Transition": [
                {"Days": 30, "StorageClass": "STANDARD_IA"},   # 30天 → 低频
                {"Days": 90, "StorageClass": "ARCHIVE"},         # 90天 → 归档
            ],
            "AbortIncompleteMultipartUpload": {"DaysAfterInitiation": 7}
        }
    ]
}
client.put_bucket_lifecycle(Bucket="my-bucket-1234567890", LifecycleConfiguration=lifecycle_config)
print("✅ 生命周期规则已设置")

效果:我们公司存储费用从 ¥21,300/月 降到 ¥6,800/月。

手段三:测试环境定时开关机

# 用定时任务(crontab 或云函数)在下班后自动关机
# 每天早上 9:00 开机
0 9 * * 1-5  tccli cvm StartInstances --InstanceIds '["ins-test1","ins-test2"]'

# 每天晚上 21:00 关机
0 21 * * 1-5 tccli cvm StopInstances --InstanceIds '["ins-test1","ins-test2"]' --ForceStop FALSE

# 用云函数(Serverless)实现更优雅,还支持企业微信审批后延迟关机

节省:8 台测试机,每天关机 12 小时 = 节省 50% 费用。

手段四:数据库只读实例合并 + 连接池优化

问题:微服务架构下,每个服务都建了独立的数据库连接池(pool_size=50),导致数据库最大连接数经常打满,被迫升配。

# 错误示范:每个服务独立大连接池
# service1 的数据库连接池
engine1 = create_engine(
    "mysql+pymysql://user:pwd@db-host:3306/db",
    pool_size=50,   # ❌ 太大了!
    max_overflow=20
)

# 正确做法:共享连接池 + 减小 pool_size
# 用 PgBouncer 或 ProxySQL 做连接池复用
# 每个服务 pool_size=5~10 就够了
engine = create_engine(
    "mysql+pymysql://user:pwd@proxysql-host:6033/db",
    pool_size=8,    # ✅ 合理
    max_overflow=5,
    pool_recycle=3600
)

效果:数据库最大连接数从 800+ 降到 150,规格从 8C16G 降到 4C8G。

手段五:CDN + 对象存储组合替代直接流量

# 问题:COS 直接对外提供下载,流量费贵到离谱
# 解决:COS 作为源站,CDN 加速,流量费降低 60%

# 腾讯云 CDN 绑定 COS 源站
tccli cdn AddCdnDomain \
  --Domain download.example.com \
  --ServiceType download \
  --Origin {
    "Origins": ["my-bucket-1234567890.cos.ap-guangzhou.myqcloud.com"],
    "OriginType": "cos",
    "ServerName": "my-bucket-1234567890.cos.ap-guangzhou.myqcloud.com"
  }

成本优化效果汇总

优化项优化前/月优化后/月节省比例
CVM(含竞价实例)¥98,200¥41,50058%
COS 存储 + 流量¥21,300¥6,80068%
云数据库¥45,600¥22,00052%
Redis¥18,900¥9,50050%
带宽流量¥52,100¥28,00046%
其他¥23,900¥20,00016%
合计¥259,000¥127,80051%

避坑指南

  1. 不要一次性全量优化:先拿测试环境、离线任务开刀,验证没问题再动生产
  2. 竞价实例必须做无状态化:实例被回收时,业务不能挂
  3. 数据库降配前务必压测:用 sysbench 模拟峰值流量验证
  4. 设置成本告警:云厂商都支持日报/周报,账单异常立即感知
# 腾讯云设置每日账单告警(超过预算 80% 发企业微信)
tccli billing CreateCostBudget \
  --BudgetAmount 150000 \
  --BudgetType MONTHLY \
  --NoticeThreshold 0.8 \
  --NoticeReceiverIds '[200001]'  # 接收人 UID

小结

云成本优化不是一次性的活,建议每季度做一次全面盘点。核心原则:该花的花(核心业务),该省的省(测试、存储、闲置资源)

最关键的三个动作:

  1. 用 CLI/SDK 拉数据,找到浪费大头
  2. 竞价实例 + 定时开关机 + 存储生命周期,这三个手段能解决 70% 的浪费
  3. 建立成本可视化看板,让每个团队看到自己的云消费

👤 作者简介

一枚在大中原腹地(河南)卖公有云的从业者,主营腾讯云/阿里云/火山云,曾踩坑无数,现专注AI大模型应用落地。关注公众号「公有云cloud」,围观AI前沿动态~