性能工程化是把前六章的取证能力沉淀为制度:性能预算在先、回归门禁在中、复盘归档在后。没有制度,性能好坏取决于谁在值班;有了制度,性能成为可持续管理的工程属性。本节是一份可以直接拿去落地的清单。
性能问题的最贵解法是"出事后优化"。便宜得多的解法是把性能当需求管理:
预算的价值不在数字本身,而在让取舍显式化:功能上线要不要牺牲 10ms,变成一个看得见的决策而不是无声的退化。
# 一个最小可行的性能门禁示意(基准跑三次取中位数对比基线) # bench 基线存于性能数据仓库,随主分支滚动更新
性能事故复盘最忌讳"根因:XX 服务慢,已优化"。合格的复盘卷宗包括:
| 投资 | 一次成本 | 复利 |
|---|---|---|
| 取证工具统一封装(脚本库) | 人周级 | 每次故障少 30 分钟摸索 |
| 案卷知识库 | 每案 1 小时 | 重复案件秒级对号 |
| 性能培训(本书内容的内化) | 季度半天 | 值班不再是轮盘赌 |
| 基准与门禁维护 | 持续小投入 | 回归当天发现而非用户先发现 |

清单里最值钱的一条是把"防复发"做成 CI 门禁:每次合并跑固定负载基准,关键指标劣化超过阈值即阻断。要点是固定环境与统计判据,否则门禁会因噪声误伤而被迫下线:
# .github/workflows/perf-gate.yaml 核心片段 - run: taskset -c 2 ./bench --case checkout --seed 42 | tee r.txt - run: | p99=$(grep p99 r.txt | awk '{print $2}') base=$(cat .perf-baseline/p99) python -c "import sys; sys.exit(0 if $p99 < $base*1.05 else 1)" \ || { echo "P99 回归 >5%: $p99 vs $base"; exit 1; }
基线文件由维护者定期刷新,抖动大的指标(p99)可用多次运行的中位数判据。门禁上线头一个月务必收集误报率,超过 10% 就先修测量环境,不达标的环境养不出可信门禁。
本节清单按使用者分三层:值班层(保全现场脚本、USE 一页单、决策树海报)保最快速度立案;工程师层(预算表、CI 门禁、检测器常开规范)保修复质量与防复发;团队层(案卷归档、口径对齐表、容量斜率告警)保组织记忆。三层各自有明确的所有者与更新触发条件——值班层随工具升级更新、工程师层随架构评审更新、团队层随事故复盘更新。清单不是文档,是带 owner 的活系统;没有 owner 的清单在第三次误报后就会无人问津,这是性能工程清单化最常踩的坑。
最后给一个反直觉的提醒:清单要有裁剪机制。清单项随时间只增不减,最终会长到无人执行——每季度审计一次,把过去半年从未触发、且触发也不改变行动的条目移入"归档区",保留条目都要能回答"这条在最近哪起案件里起过作用"。清单的生命力在于每一条都被信任,而不在于条数多少。结案清单的终极形态不是最全的清单,而是团队真的在用、且每次事故后都在进化的那份清单。
清单与告警的关系也值得一并理顺:告警是"清单的自动执行者",每条告警都应能追溯到清单的某一条——防复发检查项落地成了阈值,容量斜率检查项落地成了预测告警。反向审计同样成立:告警列表里找不到清单出处的那条,多半是某人临时的直觉产物,要么给它找到清单依据,要么删掉。这种双向对账能让告警系统与性能清单同频进化,避免两者各自膨胀成互不相认的两堆配置——那正是多数团队性能治理退化的起点。