访问日志里四百九十九状态码占了三成,用户反馈页面加载很久最后空白,服务端却没有明显的错误记录。
真正麻烦的地方在于,几个原因的现象几乎一样。后端响应时间超过客户端耐心,用户主动断开。少数情况下是页面依赖的接口串行调用,整体耗时被拖长。
还有一种情况,前置代理的超时时间比后端处理时间更短。
动手时先统计状态码分布和耗时
awk '{print $9}' access.log | sort | uniq -c | sort -rn | head
随后找出耗时最长的请求
awk '$9==499{print $7,$NF}' access.log | sort -k2 -n | tail
接着看后端处理耗时分布
tail -1000 access.log | awk '{print $NF}' | sort -n | tail
调整超时与接口并发
grep -n keepalive_timeout /etc/nginx/nginx.conf
同事提醒我看一下最近一次发布,时间点确实对得上。
别只看报错消失,验证要多做一步。四百九十九占比降到百分之一以内,页面加载耗时明显缩短,用户投诉减少。
这里还有个坑。这个状态码是客户端断开,不是服务端拒绝;只加超时不优化后端,只会把问题变成更长时间的等待。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。