分析一次由PMTU黑洞导致的TCP Send-Q堆积问题
TLDR
这几天在一台源端机器上的内网长连接服务经常遇到一个网络问题:收包正常,发包卡住。卡住时43112长连接的Send-Q持续堆积,抓包能看到IP Total Length=1500的TCP包不断重传。
用ping -M do -s 1472探测目标机器时,Linux收到mtu=1476的错误并更新本地PMTU缓存。缓存更新后,业务连接发包变小,服务恢复。
这说明原因不在应用没有读socket,也不是本机网卡丢包。更合理的解释是:源端机器到部分10.x目标的路径实际只能通过1476字节IP包,但TCP连接一开始仍按1500字节IP包发送。长期看,要么让路径上的PMTU发现稳定工作,要么在主机或网关上明确限制这条路径的MTU策略。