ss -s cat /proc/softirqs | grep NET_RX cat /proc/interrupts | grep eth0
压测到 5000 QPS 时,8 核机器上 CPU0 的 si 占到 98%,其余核只有 20%,接口 P99 从 30 毫秒涨到 400 毫秒。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,每个短连接都要走三次握手和四次挥手,内核在软中断里处理这些包,默认全部落在收到 SYN 的那个核上。连接数越多,单核软中断越先饱和。
这次卡住的地方就在「短连接开销」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
处理上按这个顺序:客户端开启 keep-alive 复用连接;连接池保底留几个空闲连接;开 RPS 和 RFS 把软中断分散到多核;确认中间设备没有强制关闭短连接。
改完只确认一件事:改成长连接后 QPS 提到 1.4 万,CPU0 的 si 降到 25%,P99 回到 45 毫秒。
