Linux网络调优需协同TCP参数、瓶颈识别与tc带宽管理:启用窗口缩放、合理设置缓冲区、采用BBR算法、禁用空闲慢启动;通过ss、/proc/net/snmp等定位丢包、分片、超时问题;用HTB+fq_codel组合实现端口级限速与低延迟保障。

Linux网络调优的核心在于合理设置TCP/IP协议栈参数,并结合流量控制(tc)实现带宽精细化管理。单纯修改sysctl参数效果有限,必须与队列规则、调度策略、应用行为协同优化。以下从关键参数、常见瓶颈、tc实操三方面展开。
一、影响吞吐与延迟的关键TCP参数
这些参数直接影响连接建立、数据传输和拥塞响应:
- net.ipv4.tcp_window_scaling=1:启用窗口缩放,支持大于64KB的接收窗口,对高带宽延时积(BDP)链路必不可少;
- net.ipv4.tcp_rmem 和 net.ipv4.tcp_wmem:三元组分别定义最小/默认/最大缓冲区大小,建议根据实际带宽和RTT计算后调整,例如千兆网+20ms RTT,BDP约2.5MB,可设为“4096 262144 4194304”;
-
net.ipv4.tcp_congestion_control=bbr:启用BBR拥塞控制算法,比传统CUBIC更适应动态网络,需内核4.9+,启用前确认模块已加载(
modprobe tcp_bbr); - net.ipv4.tcp_slow_start_after_idle=0:避免空闲连接重启慢启动,适合长连接服务如API网关或数据库连接池。
二、识别并缓解典型网络瓶颈
调优前先定位问题根源,避免盲目修改:
- 用
ss -i查看单连接的cwnd、rtt、retrans、rto等字段,判断是否频繁重传或窗口受限; - 运行
cat /proc/net/snmp | grep -A 1 'Tcp:'检查“RetransSegs”持续增长,指向丢包或乱序; - 若
netstat -s | grep -i "packet reassembles"数值高,说明分片多或MTU不匹配,可尝试在路径上统一MTU或禁用TCP分段卸载(ethtool -K eth0 tso off gso off); - 观察
/proc/net/netstat中“TCPTimeouts”,值高反映超时重传严重,常因丢包或对端响应慢导致。
三、用tc实现精准带宽管理
tc不是限速开关,而是构建可控的排队模型。推荐HTB + fq_codel组合:
- 先清空原有规则:
tc qdisc del dev eth0 root 2>/dev/null; - 添加根qdisc,设定总出口带宽(如100Mbit):
tc qdisc add dev eth0 root handle 1: htb default 30; - 创建主类(1:1),分配100Mbit:
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit; - 为SSH(端口22)单独划出2Mbit保障带宽:
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 2mbit ceil 4mbit; - 绑定过滤器,按端口分流:
tc filter add dev eth0 protocol ip parent 1:0 u32 match ip dport 22 0xffff flowid 1:10; - 在每个leaf class下挂fq_codel提升公平性与低延迟:
tc qdisc add dev eth0 parent 1:10 fq_codel。
四、验证与持续观测
调优后必须验证效果,而非仅看参数生效:
- 用
iperf3 -c server -b 0 -t 30测试全速吞吐,对比调优前后差异; - 用
ping -q -c 30 server和mtr --report-wide server观察延迟抖动变化; - 监控
tc -s class show dev eth0中dropped、overlimits、qlen等指标,确认限速未引发非预期丢包; - 长期运行中关注
/proc/net/snmp中“TCPSynRetrans”和“TCPAbortOnMemory”,异常升高说明内存压力或SYN队列不足(需调大net.ipv4.tcp_max_syn_backlog)。










