压测到两千并发时部分请求直接超时,服务端没有错误日志,网络状态里能看到大量连接请求得不到回应。

排查方向其实有限,先把可能性排一排。内核半连接队列上限太小,握手包被丢弃;应用监听队列长度设置偏小;突发流量让队列瞬间打满。

上来先看队列溢出计数

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

这类问题以前遇到过,但这次的触发条件和上次不一样。

这类改动我都写进变更记录,过两周再出问题时能对上号。

我习惯把每一步的执行时间和结果记在一边,后面复盘省事。

别只看报错消失,验证要多做一步。溢出计数不再增长,两千并发下连接建立正常,超时比例回到预期。

内核参数和应用配置要一起改,只调一边的话实际队列长度仍取两者较小值。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189