Linux TCP 性能优化与内核参数调优实战
一、TCP 协议栈回顾与性能瓶颈定位
TCP 核心特性:可靠传输、拥塞控制、流量控制、超时重传。
常见性能瓶颈:
监控工具:
ss -s # 连接摘要
ss -m # 内存使用
netstat -s | grep -E 'retrans|timeout|reset'# 统计
cat /proc/net/sockstat
sar -n TCP,ETCP 1 10
内核参数查看:
sysctl -a | grep -E 'tcp|somaxconn|net.core'
二、核心内核参数调优(/etc/sysctl.conf)
监听队列优化:
net.core.somaxconn = 8192 # 默认 128,推荐 4096~65535
net.core.netdev_max_backlog = 16384 # 网卡队列
net.ipv4.tcp_max_syn_backlog = 8192 # SYN 队列
端口范围与复用:
net.ipv4.ip_local_port_range = 1024 65535 # 扩大可用端口
net.ipv4.tcp_tw_reuse = 1 # 安全复用 TIME_WAIT(客户端)
net.ipv4.tcp_tw_recycle = 0 # NAT 环境下关闭
net.ipv4.tcp_fin_timeout = 30 # 缩短 FIN_WAIT
缓冲区内存:
net.core.rmem_default = 262144
net.core.rmem_max = 16777216 # 16MB
net.core.wmem_default = 262144
net.core.wmem_max = 16777216
net.ipv4.tcp_mem = 8388608 12582912 16777216 # min pressure max (页)
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
拥塞控制算法(BBR 推荐):
# 可用算法查看
sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_congestion_control = bbr # 或 cubic, dctcp
net.core.default_qdisc = fq # 配合 BBR 使用
BBR 启用(内核需支持):
modprobe tcp_bbr
echo"tcp_bbr" >> /etc/modules-load.d/modules.conf
其他重要参数:
net.ipv4.tcp_syncookies = 1 # 防 SYN Flood
net.ipv4.tcp_max_tw_buckets = 262144 # TIME_WAIT 桶
net.ipv4.tcp_keepalive_time = 300 # 保活时间(秒)
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_slow_start_after_idle = 0 # 避免慢启动
net.ipv4.tcp_autocorking = 1
net.ipv4.tcp_fastopen = 3 # TFO 加速三次握手
应用生效:
sysctl -p
# 或临时
sysctl -w net.ipv4.tcp_congestion_control=bbr
三、应用层与中间件优化
Nginx 示例(worker 连接调优):
events {
worker_connections 8192;
use epoll;
multi_accept on;
}
http {
keepalive_timeout 65;
keepalive_requests 1000;
}
Tomcat / Java:调整 maxThreads、acceptCount。
数据库连接池:控制连接数,避免 TIME_WAIT 堆积。
Redis / Kafka:调整 backlog 与 SO_REUSEPORT。
四、生产案例与效果验证
案例1:Web 服务 QPS 从 5000 提升到 25000:
- 调整 somaxconn + tcp_max_syn_backlog + BBR。
- 结果:连接建立时间下降 40%,CPU softirq 占比降低。
案例2:大量 TIME_WAIT 导致新连接失败:
- 启用 tcp_tw_reuse + 优化应用连接复用(HTTP Keep-Alive)。
- 监控:
ss -tan state time-wait | wc -l
案例3:高延迟长肥管道:
- 测试工具:
iperf3 -c server -P 10
压力测试:
ab -n 100000 -c 1000 http://localhost/
wrk -t12 -c400 -d30s http://example.com
观察指标:
五、进阶优化技巧
SO_REUSEPORT:内核 3.9+,多个进程监听同一端口,负载均衡更好。
// 应用代码中设置 socket 选项
TCP Fast Open (TFO):减少一次 RTT。
中断亲和力:
# 绑定网卡中断到特定 CPU 核
echo 2 > /proc/irq/$(awk '/eth0/{print $1}' /proc/interrupts)/smp_affinity
巨型帧(Jumbo Frames):
ip link set eth0 mtu 9000
# 交换机、路径全链路支持
NUMA 感知:多路服务器绑定网卡与进程到同一 NUMA 节点。
eBPF + XDP:极致性能场景(DDoS 防护、自定义处理)。
六、风险控制与回滚
- 调优前备份:
sysctl -a > sysctl.backup-$(date +%F) - 监控告警:Prometheus + Grafana(tcp_retrans_segs、tcp_out_of_order 等)。
- 过度调大缓冲区可能导致内存压力,注意观察
free -h。
自动化:Ansible role 统一管理 sysctl.conf,结合配置管理工具。