4.9.3 TCP/IP栈调优与内核参数(sysctl)

TCP/IP栈调优与内核参数(sysctl)#

TCP/IP 栈调优的目标是提升吞吐、降低延迟、减少丢包与连接失败率。本节给出可执行示例、命令解释、排错与练习,形成“观测—调整—验证—回滚”的闭环。

1. 原理草图:数据包从应用到网卡的关键队列#

文章图片

2. 基线观测与关键命令(含解释)#

2.1 连接队列与状态

# 查看TCP连接状态分布(重点关注 SYN-SENT/SYN-RECV/TIME-WAIT)
ss -s

# 查看监听队列与溢出情况(Recv-Q/Send-Q)
ss -lntp

# 解释:
# ss -s:汇总连接状态,判断是否出现SYN积压或TIME_WAIT过多
# ss -lntp:监听端口队列,Recv-Q接近Send-Q可能队列饱和

2.2 丢包与重传

# 统计TCP重传、丢包等
netstat -s | egrep -i "retrans|listen|overflow|drop"

# 解释:
# retrans:重传次数高可能链路或拥塞控制不合适
# listen overflow:监听队列溢出,需调大somaxconn/tcp_max_syn_backlog

2.3 网卡队列与软中断

# 查看网卡丢包与错误
ip -s link show eth0

# 查看软中断占比(NET_RX/NET_TX偏高可能瓶颈在CPU)
cat /proc/softirqs | egrep -i "NET_RX|NET_TX"

3. 关键内核参数分类与示例(含解释)#

以下参数使用 sysctl -w 临时生效,落盘见第 4 节。

3.1 连接建立与握手

# 半连接队列长度
sysctl -w net.ipv4.tcp_max_syn_backlog=8192

# SYN-ACK 重试次数(降低可缩短失败回收)
sysctl -w net.ipv4.tcp_synack_retries=3

# 开启 SYN Cookies 抵御 SYN Flood
sysctl -w net.ipv4.tcp_syncookies=1

3.2 Accept 队列

# 全局 accept 队列上限
sysctl -w net.core.somaxconn=4096

# 队列溢出时直接拒绝,便于客户端快速失败重试
sysctl -w net.ipv4.tcp_abort_on_overflow=1

3.3 TIME_WAIT 与端口

# FIN-WAIT-2 超时
sysctl -w net.ipv4.tcp_fin_timeout=30

# TIME_WAIT 连接重用(内网短连接可考虑)
sysctl -w net.ipv4.tcp_tw_reuse=1

# 临时端口范围
sysctl -w net.ipv4.ip_local_port_range="10240 65535"

3.4 缓冲区与吞吐

# 最大收发缓冲区
sysctl -w net.core.rmem_max=134217728
sysctl -w net.core.wmem_max=134217728

# TCP 动态缓冲区(min default max)
sysctl -w net.ipv4.tcp_rmem="4096 87380 134217728"
sysctl -w net.ipv4.tcp_wmem="4096 65536 134217728"

# 窗口扩展(高带宽延迟积链路)
sysctl -w net.ipv4.tcp_window_scaling=1

3.5 拥塞控制与队列

# 查看当前拥塞控制算法
sysctl net.ipv4.tcp_congestion_control

# 切换到 BBR(内核支持情况下)
sysctl -w net.ipv4.tcp_congestion_control=bbr

# 设置默认队列管理算法
sysctl -w net.core.default_qdisc=fq

3.6 内核网络资源

# 网卡接收队列长度
sysctl -w net.core.netdev_max_backlog=16384

# TIME_WAIT 最大数量
sysctl -w net.ipv4.tcp_max_tw_buckets=200000

4. sysctl 配置与生效方式(完整示例)#

4.1 临时生效(重启失效)

sysctl -w net.core.somaxconn=4096
sysctl -w net.ipv4.tcp_max_syn_backlog=8192

4.2 持久化配置(推荐)

# 文件:/etc/sysctl.d/99-tcp-tuning.conf
cat > /etc/sysctl.d/99-tcp-tuning.conf << 'EOF'
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 10240 65535
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 200000
EOF

# 使配置生效
sysctl --system

5. 场景化调优示例(含验证步骤)#

5.1 高并发短连接(API 网关)

# 1) 调整
sysctl -w net.ipv4.ip_local_port_range="10240 65535"
sysctl -w net.core.somaxconn=4096
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
sysctl -w net.ipv4.tcp_tw_reuse=1

# 2) 验证
ss -s
ss -lntp | head -20
netstat -s | egrep -i "listen|overflow"

5.2 长连接高吞吐(日志/消息传输)

# 1) 调整
sysctl -w net.core.rmem_max=134217728
sysctl -w net.core.wmem_max=134217728
sysctl -w net.ipv4.tcp_rmem="4096 87380 134217728"
sysctl -w net.ipv4.tcp_wmem="4096 65536 134217728"
sysctl -w net.ipv4.tcp_congestion_control=bbr

# 2) 验证(观察吞吐与重传)
netstat -s | egrep -i "retrans|segments"

6. 排错与回滚#

6.1 常见问题定位

# 连接大量失败:检查监听队列溢出
netstat -s | egrep -i "listen|overflow"

# TIME_WAIT 过多:检查端口范围与短连接模式
ss -tan state time-wait | wc -l

# 吞吐低:检查拥塞算法与窗口
sysctl net.ipv4.tcp_congestion_control
sysctl net.ipv4.tcp_rmem net.ipv4.tcp_wmem

6.2 回滚到默认(示例)

# 备份当前值
sysctl -a | egrep "somaxconn|tcp_max_syn_backlog|tcp_tw_reuse" > /root/sysctl.backup

# 回滚示例
sysctl -w net.ipv4.tcp_tw_reuse=0
sysctl -w net.core.somaxconn=128
sysctl -w net.ipv4.tcp_max_syn_backlog=2048

7. 练习#

  1. 使用 ss -s 记录当前连接状态基线,并保存到文件。
  2. somaxconn 从默认值调整到 4096,观察 ss -lntp 中 Recv-Q 的变化。
  3. 在测试环境启用 bbr,对比 netstat -s 中重传数变化。
  4. 故意将 tcp_fin_timeout 设为 10 秒,观察是否出现异常断连,再回滚。