这个坑值得记一笔。CentOS 7.9 上跑文件分发服务,万兆网卡单流只能跑到 3Gbps,ss -m 显示接收窗口只有 200K 左右,net.ipv4.tcp_rmem 的最大值还是 212992。

刚开始盯着「应用层读取慢,窗口开得再大也填不满」,折腾了半个多小时,排掉了。

排查方向其实有限,先把可能性排一排。tcp_rmem 的最大值卡住了自动调优的上限,窗口涨不上去;带宽时延积远大于 200K,窗口成了吞吐的硬瓶颈;网卡多队列和中断绑核没配,单核处理不过来。

先看当前的窗口和缓冲区

ss -mti 'sport = :8080' | grep -E 'rcv_space|skmem' | head -5

随后按带宽时延积估算需要多大

python3 -c 'print(10e9/8*0.04/1024, "KB")'

调大收发缓冲区上限

sysctl -w net.ipv4.tcp_rmem='4096 262144 33554432' net.ipv4.tcp_wmem='4096 262144 33554432'

等前面都确认过,再确认网卡多队列和中断分布

ethtool -l eth0 | head -10 && grep eth0 /proc/interrupts | head -4

改完先别撤,确认这几项。ss -m 里接收窗口涨到 2M 以上,单流吞吐从 3Gbps 提到 7Gbps 以上,重传率保持在 0.1% 以下。

补一句。缓冲区不是越大越好,开太大会让延迟和内存一起涨;万兆以上还要看网卡队列和中断绑核,只调内核参数收益有限。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189