这类问题我又碰上了一次。预发环境八核机器压测能到八千 QPS,同样代码上线只有三千,监控里线上 CPU 已经九成,预发那台才五成,代码分支完全一致。

第一反应是「线上前面多一层 WAF,多了一次转发和一次建连」,验证下来不成立。

排查方向其实有限,先把可能性排一排。预发用的是高主频实例,线上是共享型,单核算力差三成;预发没开鉴权、限流和审计这些中间件;线上数据库跨可用区访问,每次查询多两毫秒。

动手时先对比两台的 CPU 型号与当前主频

lscpu | grep -E 'Model name|MHz'

再往下用同一基准跑单核算力

sysbench cpu --cpu-max-prime=20000 run

量一下线上链路多出来的往返

curl -w '%{time_connect} %{time_starttransfer}\n' -o /dev/null -s https://api.example.com/ping

等前面都确认过,再把中间件在预发打开后重压

wrk -t8 -c400 -d120s --latency http://pre.internal:8080/ping

改完先别撤,确认这几项。两边的单核算力和链路耗时对齐后,压测结果与线上差距缩到两成以内,剩下的差异项都能逐条解释。

容易忽略的是,压测环境的实例规格、中间件、网络路径要尽量贴近线上,否则数字只能看趋势;实在对不齐就把差异项列出来做折算。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189