3、成本指标设计:核心指标定义与分摊模型
成本指标设计,说白了就是给每一分钱找到主人。我见过太多团队,资源用了不少,月底一算账,谁也说不出钱花在哪。嗯,这节课我们就来解决这个问题。
3.1 核心指标定义:CPU / 内存 / 存储 / 网络
先聊最基础的。每个资源维度,我都习惯定义三个层级的指标:总量、使用量、浪费量。为什么是三个?因为只看使用率会骗人。
核心原则:所有指标必须可量化、可追溯、可归因。不能量化的指标,等于没定义。
3.1.1 CPU 指标
CPU 是成本大头,也是最容易产生浪费的地方。我个人习惯这样定义:
| 指标名称 | 定义 | 计算方式 |
|---|---|---|
| CPU 总核时 | 集群/租户可用的 CPU 总容量 | 核数 × 运行时长 |
| CPU 有效使用率 | 任务实际消耗 / 分配总量 | SUM(任务实际核时) / SUM(分配核时) |
| CPU 闲置率 | 已分配但未使用的比例 | 1 - 有效使用率 |
| CPU 峰值/均值比 | 资源波动的剧烈程度 | P99 使用量 / 平均使用量 |
避坑指南:我曾经遇到一个项目,CPU 平均使用率只有 30%,但峰值经常冲到 90%。如果只看平均值,你会觉得资源很充裕;但实际调度时,高峰期大量任务在排队。所以峰值/均值比这个指标,一定要加上。
3.1.2 内存指标
内存比 CPU 更棘手。CPU 用不完可以等,内存用完了直接 OOM。我建议这样定义:
| 指标名称 | 定义 | 计算方式 |
|---|---|---|
| 内存总容量 | 集群可用的内存总量 | 节点内存 × 节点数 |
| 内存实际占用 | 任务实际使用的内存 | 通过监控系统采集 |
| 内存申请溢出率 | 申请量远大于实际使用量的比例 | (申请量 - 实际量) / 申请量 |
| OOM 事件频率 | 内存不足导致任务失败的次数 | 按天/周统计 |
你想想看,很多开发为了省事,内存申请直接翻倍填。结果就是集群看起来满了,实际利用率不到一半。这个「申请溢出率」就是专门抓这种行为的。
3.1.3 存储指标
存储成本是慢刀子割肉。我见过最夸张的一个案例,某团队 HDFS 上存了 3 年的临时数据,占了 40TB,从来没人清理。存储指标要这样设计:
| 指标名称 | 定义 | 计算方式 |
|---|---|---|
| 存储总容量 | 可用存储空间 | 磁盘容量 × 副本数 |
| 存储使用量 | 实际占用的空间 | 按目录/表统计 |
| 冷数据占比 | 超过 N 天未访问的数据比例 | 冷数据量 / 总数据量 |
| 存储成本密度 | 每 TB 存储的月成本 | 存储总成本 / 存储总量 |
注意:存储的副本数很容易被忽略。你以为用了 10TB,实际占用了 30TB(3副本)。成本计算时一定要把副本系数算进去,否则预算会严重偏差。
3.1.4 网络指标
网络成本在云环境中尤其突出。跨 AZ、跨 Region 的数据传输,单价高得吓人。我习惯这样定义:
| 指标名称 | 定义 | 计算方式 |
|---|---|---|
| 网络出向流量 | 流出集群/区域的流量 | 按网卡/端口统计 |
| 跨域流量占比 | 跨 AZ/Region 流量占总流量的比例 | 跨域流量 / 总流量 |
| 带宽利用率 | 实际带宽 / 购买带宽 | 峰值带宽 / 总带宽 |
| 数据传输成本 | 每 GB 流量的费用 | 网络总费用 / 总流量 |
3.2 成本分摊模型
指标定义好了,接下来就是分账。成本分摊模型,说白了就是解决「这笔钱该谁出」的问题。我见过三种主流模型,各有适用场景。
3.2.1 按实际使用量分摊
最公平的方式。谁用了多少资源,就付多少钱。适合资源隔离做得好的场景。
# 分摊公式示例
租户A费用 = 租户A实际CPU核时 × CPU单价
+ 租户A实际内存GB时 × 内存单价
+ 租户A实际存储GB月 × 存储单价
我的经验:这种模型看起来公平,但有个坑——公共资源没人买单。比如 HDFS NameNode、YARN ResourceManager 这些组件,是所有租户共享的。我建议单独拎出来,按比例分摊到各租户头上。
3.2.2 按固定比例分摊
简单粗暴。适合业务相对稳定、资源使用波动不大的团队。
| 租户 | 分摊比例 | 月费用(总成本100万) |
|---|---|---|
| 业务线A | 40% | 40万 |
| 业务线B | 35% | 35万 |
| 基础设施 | 25% | 25万 |
这种模型的好处是简单,坏处是容易养懒汉。业务线A明明可以优化资源,但因为固定比例,优化了也省不了钱,动力不足。
3.2.3 混合分摊模型
我个人最推荐的方式。把成本拆成三部分:
- 基础成本(30%):按固定比例分摊,覆盖公共组件
- 使用成本(60%):按实际用量分摊,多劳多得
- 惩罚成本(10%):对浪费行为加收,比如申请了不用
核心思路:基础成本保底,使用成本公平,惩罚成本倒逼优化。三管齐下,才能让每个团队都有动力去省钱。
3.3 标签体系设计
指标和模型都定了,怎么把成本准确打到每个团队头上?靠标签。标签体系是成本可视化的地基,地基不稳,上面全是歪楼。
3.3.1 标签设计原则
我总结了三要三不要:
- 要统一:全公司用同一套标签规范,别各搞各的
- 要自动:能自动打标签就别手动,人一定会忘
- 要可追溯:每个标签都能查到是谁、什么时候、为什么打的
- 不要太多:标签数量控制在 20 个以内,多了没人维护
- 不要嵌套:标签之间不要有层级依赖,扁平化最好
- 不要变来变去:标签命名和分类一旦确定,至少用一年
3.3.2 标准标签模板
这是我目前在用的标签体系,你可以直接参考:
| 标签分类 | 标签名 | 示例值 | 说明 |
|---|---|---|---|
| 业务归属 | business_line | 电商、搜索、推荐 | 一级业务线 |
| 团队归属 | team | 算法组、数仓组 | 二级团队 |
| 应用名称 | app_name | 用户画像、实时ETL | 具体任务/应用 |
| 环境 | env | prod、test、dev | 生产/测试/开发 |
| 资源类型 | resource_type | cpu、memory、storage | 资源维度 |
| 成本中心 | cost_center | CC-1001 | 财务核算用 |
曾经踩过的坑:我们一开始把标签设计成三层嵌套结构,比如「电商-搜索-算法」。结果查询成本时,SQL 写得巨复杂,而且一旦中间层改名,所有历史数据全对不上。后来改成扁平标签,用组合查询代替层级,清爽多了。
3.3.3 标签落地流程
光有设计不行,得能落地。我建议按这个步骤来:
- 定义阶段:拉上财务、运维、业务三方,一起敲定标签规范
- 打标阶段:在资源创建时自动打标,比如通过 CI/CD 流水线注入
- 校验阶段:每天跑一次标签覆盖率检查,没打标的资源标红
- 审计阶段:每月抽查标签准确性,错标、漏标的通报整改
3.4 知识体系总览
下面这张图,把本章的核心逻辑串起来了。从指标定义到分摊模型,再到标签体系,环环相扣。
嗯,到这里,成本指标设计的核心内容就讲完了。指标定义让你知道「看什么」,分摊模型让你知道「怎么分」,标签体系让你知道「分给谁」。三者配合,才能把成本账算清楚。