压测到两千并发时部分请求直接超时,服务端没有错误日志,网络状态里能看到大量连接请求得不到回应。
排查方向其实有限,先把可能性排一排。内核半连接队列上限太小,握手包被丢弃;应用监听队列长度设置偏小;突发流量让队列瞬间打满。
上来先看队列溢出计数
netstat -s | grep -i listen
再往下查当前队列上限
sysctl net.core.somaxconn net.ipv4.tcp_max_syn_backlog
调大并持久化
sysctl -w net.core.somaxconn=4096
同步调大应用侧队列
grep -n backlog /etc/nginx/nginx.conf
这类问题以前遇到过,但这次的触发条件和上次不一样。
这类改动我都写进变更记录,过两周再出问题时能对上号。
我习惯把每一步的执行时间和结果记在一边,后面复盘省事。
别只看报错消失,验证要多做一步。溢出计数不再增长,两千并发下连接建立正常,超时比例回到预期。
内核参数和应用配置要一起改,只调一边的话实际队列长度仍取两者较小值。报错文案容易误导,真正的原因往往在相邻那一层的日志里。