公司云账单从每月 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,400 | 2C4G 竞价 | ¥1,200 | 90% |
| 低利用率生产 × 12台 | 8C16G | ¥18,900 | 4C8G | ¥9,500 | 50% |
手段二:存储生命周期管理(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,500 | 58% |
| COS 存储 + 流量 | ¥21,300 | ¥6,800 | 68% |
| 云数据库 | ¥45,600 | ¥22,000 | 52% |
| Redis | ¥18,900 | ¥9,500 | 50% |
| 带宽流量 | ¥52,100 | ¥28,000 | 46% |
| 其他 | ¥23,900 | ¥20,000 | 16% |
| 合计 | ¥259,000 | ¥127,800 | 51% |
避坑指南
- 不要一次性全量优化:先拿测试环境、离线任务开刀,验证没问题再动生产
- 竞价实例必须做无状态化:实例被回收时,业务不能挂
- 数据库降配前务必压测:用
sysbench模拟峰值流量验证 - 设置成本告警:云厂商都支持日报/周报,账单异常立即感知
# 腾讯云设置每日账单告警(超过预算 80% 发企业微信)
tccli billing CreateCostBudget \
--BudgetAmount 150000 \
--BudgetType MONTHLY \
--NoticeThreshold 0.8 \
--NoticeReceiverIds '[200001]' # 接收人 UID
小结
云成本优化不是一次性的活,建议每季度做一次全面盘点。核心原则:该花的花(核心业务),该省的省(测试、存储、闲置资源)。
最关键的三个动作:
- 用 CLI/SDK 拉数据,找到浪费大头
- 竞价实例 + 定时开关机 + 存储生命周期,这三个手段能解决 70% 的浪费
- 建立成本可视化看板,让每个团队看到自己的云消费
👤 作者简介
一枚在大中原腹地(河南)卖公有云的从业者,主营腾讯云/阿里云/火山云,曾踩坑无数,现专注AI大模型应用落地。关注公众号「公有云cloud」,围观AI前沿动态~