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 混合分摊模型

我个人最推荐的方式。把成本拆成三部分:

  1. 基础成本(30%):按固定比例分摊,覆盖公共组件
  2. 使用成本(60%):按实际用量分摊,多劳多得
  3. 惩罚成本(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 标签落地流程

光有设计不行,得能落地。我建议按这个步骤来:

  1. 定义阶段:拉上财务、运维、业务三方,一起敲定标签规范
  2. 打标阶段:在资源创建时自动打标,比如通过 CI/CD 流水线注入
  3. 校验阶段:每天跑一次标签覆盖率检查,没打标的资源标红
  4. 审计阶段:每月抽查标签准确性,错标、漏标的通报整改

3.4 知识体系总览

下面这张图,把本章的核心逻辑串起来了。从指标定义到分摊模型,再到标签体系,环环相扣。

成本指标设计知识体系 核心指标定义 成本分摊模型 标签体系设计 落地与校验 CPU指标 内存指标 存储指标 网络指标 按实际使用量分摊 按固定比例分摊 混合分摊模型 业务归属标签 环境/资源标签 成本中心标签 打标阶段 校验阶段 审计阶段 成本可视化与预警 核心逻辑:指标定义 → 分摊模型 → 标签体系 → 落地校验 → 可视化输出 每个环节缺一不可,否则成本数据就是一笔糊涂账

嗯,到这里,成本指标设计的核心内容就讲完了。指标定义让你知道「看什么」,分摊模型让你知道「怎么分」,标签体系让你知道「分给谁」。三者配合,才能把成本账算清楚。