性能案例模板

要点

  • 性能案例记录瓶颈定位、优化手段、指标对比
  • 重点是定位过程——怎么找到瓶颈的,而不是直接给优化方案
  • 用数据说话——优化前后的指标对比,P50/P95/P99
  • 性能优化通常有取舍——写清楚代价(复杂度、内存、开发成本)

1. 适用场景

性能案例用于记录系统性能问题的定位和优化过程。

典型场景:

  • 接口响应时间过长
  • 系统吞吐量不足
  • 内存占用过高
  • CPU 使用率异常
  • 数据库查询慢

2. 模板结构

# [性能问题标题]
 
## 背景
 
什么系统、什么接口、什么性能指标、目标是多少。
 
## 问题描述
 
- 现象:P99 延迟 2 秒,目标 200ms
- 影响:用户体验差,转化率下降 10%
- 触发条件:订单量 > 10 万/天时出现
 
## 瓶颈定位
 
### 第一步:监控数据
 
- P50: 50ms, P95: 200ms, P99: 2000ms
- CPU: 30%, 内存: 40%, 数据库连接: 80%
- 结论:CPU 和内存正常,数据库连接可能是瓶颈
 
### 第二步:链路追踪
 
- 订单 API → 用户服务(20ms)→ 商品服务(30ms)→ 订单数据库(1800ms)
- 结论:瓶颈在订单数据库
 
### 第三步:慢查询分析
 
- 开启慢查询日志,发现 3 条慢查询
- 最慢的查询:查询订单列表,平均耗时 1.5 秒
- 原因:缺少索引,全表扫描
 
## 优化方案
 
### 方案 1:添加索引
 
`orders` 表的 `user_id``created_at` 字段添加复合索引。
 
效果:
- 查询时间从 1.5s 降到 50ms
- P99 延迟从 2s 降到 150ms
 
代价:
- 写入性能下降 10%(索引维护开销)
- 磁盘空间增加 2GB
 
### 方案 2:查询优化(备选)
 
把关联查询拆成两次查询,减少 JOIN 开销。
 
效果:
- 查询时间从 1.5s 降到 200ms
- 但需要改代码,影响范围大
 
## 结果
 
采用方案 1(添加索引):
 
| 指标 | 优化前 | 优化后 | 改善 |
|------|--------|--------|------|
| P50 | 50ms | 30ms | 40% |
| P95 | 200ms | 80ms | 60% |
| P99 | 2000ms | 150ms | 92% |
| QPS | 500 | 800 | 60% |
 
## 复盘
 
- 瓶颈定位的关键是链路追踪,快速定位到数据库
- 慢查询监控要提前建设,不要等出问题再开
- 索引不是万能的,写入密集的场景要权衡
- 后续行动:添加慢查询实时监控告警

3. 写作要点

定位过程比方案更重要

不要直接写「添加索引解决了问题」。要写:

  • 怎么发现性能问题(监控、用户反馈)
  • 怎么定位瓶颈(链路追踪、慢查询日志、火焰图)
  • 为什么是这个瓶颈(证据)

用数据说话

性能案例必须有数据:

  • 优化前后的指标对比(P50/P95/P99、QPS、吞吐量)
  • 资源使用率(CPU、内存、磁盘、网络)
  • 具体的改善百分比

写清楚取舍

性能优化通常有代价:

  • 添加索引 → 写入性能下降
  • 增加缓存 → 数据一致性复杂度
  • 异步处理 → 最终一致性

写清楚代价,读者才能判断是否值得。

定位方法论

常用的性能定位方法:

  • 监控指标:P50/P95/P99、QPS、资源使用率
  • 链路追踪:分布式系统的调用链路,找到最慢的环节
  • 慢查询日志:数据库的慢查询,分析索引和查询计划
  • 火焰图:CPU 热点分析,找到耗时的函数
  • 内存分析:内存泄漏、GC 频率

4. 常见误区

只写方案,不写定位过程

「添加索引解决了问题」不是案例,是操作手册。要写:怎么发现慢、怎么定位到数据库、怎么确认是索引问题。

没有数据对比

「性能提升了」不是结论。要写:P99 从 2s 降到 150ms,提升 92%。

忽略取舍

「添加索引是最佳方案」太绝对。要写:添加索引提升了查询性能,但写入性能下降 10%,在可接受范围内。

总结

性能案例的核心是瓶颈定位过程。用数据说话(优化前后对比),写清楚定位方法(链路追踪、慢查询日志),承认取舍(索引影响写入性能)。