性能不是一次突击

很多团队把性能当救火:上线前加机器、压一轮、修几个慢查询,上线后就不管了。等到流量涨上来,老问题又原样回来——因为瓶颈的根因从来没被真正找到过。

性能工程把这件事变成流程:先定可量化的目标,用压测让瓶颈现形,分层定位根因,再优化、再验证,最后把性能门禁做进流水线,让"快"不是一次状态,而是一条长期线。

没有目标的优化叫瞎调,没有验证的优化叫碰运气。
性能工程的四个步骤
  • 定标延迟、吞吐、资源占用,先写下数字。
  • 压测用压力把隐藏的瓶颈逼出来。
  • 定位分层排查,找到真正的根因。
  • 防护把性能门禁做进 CI,防止回潮。
性能工程示意:蓝色渐变背景一条发光性能曲线从左下向右上平滑上升,曲线前段带一个被发光调节旋钮环绕处理的瓶颈结节,曲线后段流畅上扬,底部一排三个发光优化齿轮节点,扁平科技插画
找到卡住的瓶颈结节,拧一拧,整条曲线就顺了。

先定目标:SLO 与性能预算

没有目标,就不知道优化到什么程度算完。目标要具体到数字:核心接口的延迟目标、系统能扛的并发数、允许的失败率。

维度示例目标衡量的理由
延迟下单接口 P95 小于 300 毫秒用户真实体验
吞吐单机支撑 2000 请求每秒容量是否够用
资源CPU 峰值低于 70%留出余量、防抖动

先有目标数字,压测结果才有比较的基准。

压测:让瓶颈现形

优化前先测量:用压测脚本逐步加压,同时记录延迟、吞吐和资源曲线。瓶颈通常藏在你没看的地方——连接池满了、锁竞争、慢查询、GC 停顿。

# 压测思路:逐步加压,观察拐点
1. 从低并发开始(如 50 并发)记录基线
2. 每轮翻倍加压(100, 200, 400…)
3. 记录每一轮的 P50 / P95 / 错误率 / CPU / 内存
4. 找到延迟开始陡增的那个点,那就是容量拐点
# 拐点之前系统健康,拐点之后排队开始,瓶颈通常藏在拐点前后

压测环境要尽量贴近生产:同样的数据量、同样的部署形态,否则压出来的结论不可信。

分层排查:从上到下过一遍

定位瓶颈要按层排查,每一层都有高频原因:

层高频瓶颈常用手段
应用代码循环里的慢逻辑、序列化开销Profile、火焰图
数据库慢查询、缺索引、锁等待慢日志、执行计划
缓存命中率低、热点失效命中率指标、缓存击穿处理
网络与连接连接池打满、超时重试风暴连接池监控、熔断

先看数据,再动代码——别凭感觉改,用火焰图、慢日志把根因找实。