当前位置:首页>Linux>Linux TCP 性能优化与内核参数调优实战

Linux TCP 性能优化与内核参数调优实战

  • 2026-10-11 06:49:07
Linux TCP 性能优化与内核参数调优实战

Linux TCP 性能优化与内核参数调优实战

一、TCP 协议栈回顾与性能瓶颈定位

TCP 核心特性:可靠传输、拥塞控制、流量控制、超时重传。

常见性能瓶颈:

  • 连接数受限(backlog、端口范围)。
  • 缓冲区过小(内存拷贝开销)。
  • TIME_WAIT 堆积(端口耗尽)。
  • 拥塞窗口增长慢。
  • SYN 队列溢出。
  • 频繁上下文切换 / softirq 高。

监控工具:

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:高延迟长肥管道:

  • 增大缓冲区 + BBR 算法,吞吐提升显著。
  • 测试工具:iperf3 -c server -P 10

压力测试:

ab -n 100000 -c 1000 http://localhost/
wrk -t12 -c400 -d30s http://example.com

观察指标:

  • retransmits 低
  • RTT 稳定
  • throughput 高

五、进阶优化技巧

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,结合配置管理工具。

最新文章

随机文章