服务端 send 偶尔阻塞 3.1 秒才返回,tcpdump 里这段时间窗口一直是 0,ss -ti 显示 send-q 已经到 65536。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,对端应用读得慢,接收窗口降到 0,发送缓冲区满了之后 send 只能等。默认缓冲区 64K,一条 500KB 的响应要分好几次才能写完。
「发送缓冲区阻塞」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。报错里带路径的,先去看那个路径在不在、权限对不对。
ss -tinp | grep 8000 sysctl net.ipv4.tcp_wmem
同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
具体做法是,用 ss -ti 看 send-q 和窗口;确认对端消费速度是否跟不上;改成分片发送并及时让出;必要时调大 SO_SNDBUF 并给发送加超时。
最后用这个标准收尾,改成分片发送后单次 send 耗时稳定在 5 毫秒内,没有再出现 3 秒卡顿。
