Linux内核网络栈的默认参数面向通用场景,在高并发服务器环境下往往成为性能瓶颈。通过调整TCP连接复用、缓冲区大小、backlog队列等内核参数,可以显著提升服务器吞吐量和响应延迟。本文以CentOS/Ubuntu系统为例,讲解关键网络参数的调优方法。
TCP连接复用与TIME_WAIT状态优化
高并发短连接场景下,服务器会积累大量TIME_WAIT状态的socket,占用端口资源和内存。通过开启TCP复用,允许将TIME_WAIT状态的socket重新用于新连接:
# 查看当前TIME_WAIT数量
ss -ant | grep TIME-WAIT | wc -l
# 修改内核参数
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_fin_timeout=30
# 永久生效
cat >> /etc/sysctl.d/99-network-tuning.conf << 'EOF'
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
EOF
sysctl -p /etc/sysctl.d/99-network-tuning.conf
tcp_tw_reuse=1允许客户端在TIME_WAIT状态下复用本地端口建立新连接,对于服务器端(被动关闭方)效果有限。tcp_fin_timeout控制FIN-WAIT-2状态持续时间,默认60秒可缩短到30秒。
TCP缓冲区与窗口大小调优
内核为每个TCP连接维护发送和接收缓冲区,默认值偏小。对于高带宽延迟网络(BDP较大的链路),需要增大缓冲区以充分利用带宽:
# 查看当前缓冲区设置
sysctl net.ipv4.tcp_rmem
sysctl net.ipv4.tcp_wmem
sysctl net.core.rmem_max
sysctl net.core.wmem_max
# 调优配置
cat >> /etc/sysctl.d/99-network-tuning.conf << 'EOF'
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.core.rmem_default = 262144
net.core.wmem_default = 262144
EOF
sysctl -p /etc/sysctl.d/99-network-tuning.conf
缓冲区最大值设为64MB可支持千兆带宽下约500ms RTT的链路。开启TCP窗口缩放后,内核会根据BDP自动在min/max范围内调整缓冲区大小。
连接队列与SYN Flood防护
内核维护两个连接队列:SYN队列(半连接)和ACCEPT队列(全连接)。当队列满时,新连接被丢弃,客户端表现为连接超时或拒绝。高并发服务器需要调大队列长度:
# 查看当前队列溢出统计
netstat -s | grep -i "overflowed|dropped"
# 调优配置
cat >> /etc/sysctl.d/99-network-tuning.conf << 'EOF'
net.ipv4.tcp_max_syn_backlog = 65535
net.core.somaxconn = 65535
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
EOF
sysctl -p /etc/sysctl.d/99-network-tuning.conf
应用程序层面的listen() backlog参数也需要相应调大,否则内核somaxconn的调大无效果。Nginx配置示例:
# nginx.conf
events {
worker_connections 65535;
}
listen 80 backlog=65535;
# 确认实际生效的backlog
ss -lnt | grep :80
# 输出中Send-Q列即为实际backlog值
keepalive连接保活与TCP Fast Open
长连接场景下,keepalive机制定期发送探测包检测连接存活。默认配置过于保守,可缩短探测间隔更快发现死连接:
cat >> /etc/sysctl.d/99-network-tuning.conf << 'EOF'
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
EOF
sysctl -p /etc/sysctl.d/99-network-tuning.conf
TCP Fast Open(TFO)允许在TCP握手阶段携带数据,减少一个RTT延迟。需要客户端和服务端同时支持:
# 内核开启TFO
sysctl -w net.ipv4.tcp_fastopen=3
# 3 = 同时支持客户端和服务端
# 服务端应用层设置TCP_FASTOPEN
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_TCP, socket.TCP_FASTOPEN, 5)
sock.bind(('0.0.0.0', 8080))
sock.listen(65535)
网卡中断优化与RPS/RFS
多核服务器上,网卡中断默认绑定到固定CPU核心,导致单核处理瓶颈。通过RPS(Receive Packet Steering)将网络包处理分散到多核:
# 查看网卡中断绑定情况
cat /proc/interrupts | grep eth0
# 为每个RX队列设置RPS掩码
for i in $(ls /sys/class/net/eth0/queues/rx-*/rps_cpus); do
echo "ff" > $i
done
# 启用RFS(Receive Flow Steering)
echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
for i in $(ls /sys/class/net/eth0/queues/rx-*/rps_flow_cnt); do
echo 4096 > $i
done
性能验证与监控
调优后使用iperf3进行带宽和延迟测试,结合ss和nstat工具观察连接状态变化:
# 服务端
iperf3 -s
# 客户端测试
iperf3 -c server_ip -t 60 -P 8
# 监控TCP状态分布
ss -ant | awk '{print $1}' | sort | uniq -c
# 监控内核网络计数器
nstat -az | grep -E "TcpExt|Tcp:"
合理调整内核网络参数能够在不增加硬件投入的前提下提升服务器并发处理能力。生产环境建议逐步调整并持续监控,避免一次性大范围修改导致服务异常。每次修改单一参数后进行压力测试,确认效果再继续下一步。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-nei-he-wang-luo-can-shu-diao-you-yu-tcp-lian-jie-fu/