专栏: 基础设施管理
难度: 进阶
标签: Linux 内核参数 sysctl 高并发 TCP调优
前言
当服务压测到几万QPS时,应用本身没问题,但连接失败、延迟飙高,这时候就需要调整内核网络参数。本文整理了生产中最实用的调优方案,附完整配置。
一、问题场景
常见症状:
- accept: Too many open files
- connect: Cannot assign requested address
- 大量 TIME_WAIT 状态连接
- SYN flood 或连接队列溢出
二、核心参数详解
2.1 文件描述符限制
# 查看当前限制
ulimit -n
# 临时修改(当前会话)
ulimit -n 1048576
# 永久修改
cat >> /etc/security/limits.conf << 'EOF'
* soft nofile 1048576
* hard nofile 1048576
root soft nofile 1048576
root hard nofile 1048576
EOF
# 查看系统级最大文件描述符数
sysctl fs.file-max
2.2 TCP连接队列
# 半连接队列大小(SYN队列)
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
# 全连接队列大小(accept队列)
sysctl -w net.core.somaxconn=65535
# 注意:应用的 listen() 的 backlog 参数也要跟着调大
2.3 TIME_WAIT 优化
# 开启TIME_WAIT的快速回收(NAT环境下不建议开)
sysctl -w net.ipv4.tcp_tw_reuse=1
# 允许将TIME_WAIT的端口分配给新连接
sysctl -w net.ipv4.tcp_tw_recycle=0 # 不建议开,会导致NAT问题
# TIME_WAIT最大数量
sysctl -w net.ipv4.tcp_max_tw_buckets=200000
2.4 端口范围扩展
# 可用的临时端口范围(客户端发起连接时使用)
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
2.5 TCP keepalive(保活)
# 连接空闲多久开始发keepalive探测(秒)
sysctl -w net.ipv4.tcp_keepalive_time=600
# 每次探测间隔(秒)
sysctl -w net.ipv4.tcp_keepalive_intvl=60
# 探测次数(超过这个次数认为连接断开)
sysctl -w net.ipv4.tcp_keepalive_probes=3
三、完整生产配置
将以下内容写入 /etc/sysctl.d/99-network-tuning.conf:
# 文件描述符
fs.file-max = 1048576
# TCP连接队列
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 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
# TIME_WAIT优化
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 200000
net.ipv4.ip_local_port_range = 1024 65535
# TCP keepalive
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 3
# 快速回收FIN_WAIT2状态
net.ipv4.tcp_fin_timeout = 15
# 开启SYN cookies(防SYN flood)
net.ipv4.tcp_syncookies = 1
# 禁用ICMP重定向(安全加固)
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
# 应用配置
sysctl -p /etc/sysctl.d/99-network-tuning.conf
# 验证
sysctl net.core.somaxconn
四、验证调优效果
# 查看当前TCP连接状态统计
ss -s
# 查看TIME_WAIT连接数量
ss -ant | grep TIME-WAIT | wc -l
# 查看监听队列溢出情况
netstat -s | grep -i overflow
# 实时观察连接数变化
watch -n 1 'ss -s'
结语: 内核参数调优不是银弹,要根据业务特点做针对性调整。调整前一定备份原始配置,调整后持续监控效果。






