log_format timing '$request_time $upstream_connect_time '
'$upstream_header_time $upstream_response_time';
awk '{print $NF}' access.log | sort -rn | head -20
用户反馈下单页要转十几秒,翻 access.log 每条 request_time 都不到 1 秒,自己去复现又很正常,查了两天没结论。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,只看了总耗时,没拆 upstream_connect、upstream_header 和 upstream_response 三段,慢在排队、慢在后端还是慢在回包分不出来。
「慢请求定位」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
别只看报错的最后一行,往上看几行,真正的起因通常在上面。
处理上按这个顺序:log_format 里把三个 upstream 时间都打出来;按 p99 排序找最慢的 uri 而不是看平均值;再拿 traceId 去应用侧对具体的 span。
改完只确认一件事:能指出慢在哪一段,针对性改完后 p99 从八秒落到 800 毫秒。
