TCP拥塞控制算法选型与切换
Linux内核默认使用CUBIC拥塞控制算法,该算法在高延迟高带宽链路上表现稳定但在数据中心低延迟场景下并非最优。内核4.9+引入BBR算法,通过测量瓶颈带宽和往返时延替代基于丢包的拥塞检测,在长肥管道和弱网环境中显著提升吞吐量。
查看当前系统支持的拥塞控制算法:
sysctl net.ipv4.tcp_available_congestion_control
# 输出示例: net.ipv4.tcp_available_congestion_control = reno cubic bbr
临时切换为BBR算法:
sysctl -w net.ipv4.tcp_congestion_control=bbr
永久生效需写入配置文件:
cat >> /etc/sysctl.conf << 'EOF'
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq
EOF
sysctl -p
fq(Fair Queue)队列调度器与BBR配合使用效果最佳。BBR依赖精确的往返时延测量,fq的按流公平排队机制避免了队头阻塞对RTT测量的干扰。
内核网络参数调优配置
生产环境中TCP缓冲区大小直接影响吞吐量。默认值偏小,在10Gbps以上链路上容易成为瓶颈。以下配置适用于高带宽服务器:
# TCP读写缓冲区
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
# TCP窗口缩放与时间戳
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
# 开启TCP Fast Open
net.ipv4.tcp_fastopen = 3
# 减少TIME_WAIT状态连接占用
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
# 增加连接队列
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_max_tw_buckets = 1048576
tcp_rmem和tcp_wmem三个值分别表示最小、默认、最大缓冲区。最大值设为64MB可在高延迟链路上充分利用带宽,但对于局域网低延迟环境,过大的缓冲区反而增加内存消耗且无明显收益。
连接跟踪表容量调整
高并发服务器上conntrack表满会导致连接被丢弃。默认值65536在十万级并发场景下远远不够。
# 查看当前conntrack容量
cat /proc/sys/net/netfilter/nf_conntrack_max
# 查看当前使用量
cat /proc/sys/net/netfilter/nf_conntrack_count
# 调整容量
echo 1048576 > /proc/sys/net/netfilter/nf_conntrack_max
echo 262144 > /proc/sys/net/netfilter/nf_conntrack_buckets
# 调整超时时间
echo 60 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
echo 10 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_time_wait
nf_conntrack_buckets应为nf_conntrack_max的1/4左右。哈希表桶数过少会导致冲突增加,查找效率下降。
网卡多队列与RPS/RFS配置
现代网卡支持多队列,每个队列对应一个CPU核心处理中断。但默认情况下中断可能集中在少数核心上,导致单核负载过高。
# 查看网卡队列数
ethtool -l eth0
# 设置队列数(需要网卡驱动支持)
ethtool -L eth0 combined 8
# 查看中断绑定情况
cat /proc/interrupts | grep eth0
# 手动绑定中断到不同CPU核心
for i in $(seq 0 7); do
irq=$(cat /proc/interrupts | grep "eth0.*tx-rx-${i}" | awk -F: '{print $1}' | tr -d ' ')
if [ -n "$irq" ]; then
mask=$((1 << i))
printf "%x" $mask > /proc/irq/$irq/smp_affinity
fi
done
RPS(Receive Packet Steering)和RFS(Receive Flow Steering)在软件层面分发接收包到多个CPU,适合不支持硬件多队列的网卡:
# 开启RPS,将eth0的接收包分散到所有CPU
echo ffff > /sys/class/net/eth0/queues/rx-0/rps_cpus
# 开启RFS
echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
echo 4096 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
网络性能测试与基准对比
调优后需要量化验证效果。iperf3是常用的带宽测试工具:
# 服务端
iperf3 -s
# 客户端(测试TCP吞吐)
iperf3 -c server_ip -t 60 -P 8
# 测试UDP吞吐与丢包率
iperf3 -c server_ip -u -b 10G -t 60
-P 8启动8个并发流测试多线程吞吐能力。对比调优前后的带宽、重传率、CPU使用率三项指标。BBR算法在跨地域链路上通常比CUBIC提升20%至50%吞吐量,在局域网中差异较小。
使用ss -s查看连接状态分布,nstat -z | grep Tcp查看TCP层面的统计数据(重传、乱序等),作为持续监控的基线数据。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-wang-luo-xing-neng-diao-you-shi-zhan-tcp/