调整内核网络参数提升高并发连接处理能力,核心是先扩大握手队列和本地端口范围,再控制TIME_WAIT回收,最后把文件句柄和缓冲区一起放开。
Linux内核网络参数优化高并发连接,先把握手队列改对
高并发连接卡在建立阶段,多数情况不是带宽不够,而是内核里两个队列满了,TCP三次握手时,连接先进入半连接队列,完成握手后移入全连接队列等待应用accept,如果应用处理不过来,全连接队列被打满,新的连接会被直接丢弃或重置。
内核侧有两个关键参数:
net.core.somaxconn:全连接队列的上限,常见默认值是128,部分发行版是4096,Nginx、Redis这类应用在listen时指定的backlog如果超过内核值,内核会按这个值截断。net.ipv4.tcp_max_syn_backlog:半连接队列的长度参考值,默认通常1024,高并发建连时,这个值不够会看到SYN丢弃。
操作路径:
sysctl -w net.core.somaxconn=4096
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
写入/etc/sysctl.conf后执行sysctl -p持久化,查看生效值用sysctl net.core.somaxconn。
光改内核不顶用,应用层listen(fd, backlog)也要跟着调大,Nginx用listen 80 backlog=4096,就完整了,不然内核扩大了,应用却还按128排队,高并发照样打不进来。
高并发连接数怎么调整内核参数?从somaxconn和tcp_max_syn_backlog入手
高并发连接数怎么调整内核参数,先看半连接队列,半连接队列不是无限大,收到SYN后如果队列满了,内核的行为取决于tcp_syncookies。
net.ipv4.tcp_syncookies=1:开启SYN Cookie,队列满时不再直接丢弃SYN,而是用Cookie应答,能扛住一定程度的SYN Flood。net.ipv4.tcp_syn_retries=3:客户端SYN重试次数,降低可以更快释放半连接资源。net.ipv4.tcp_synack_retries=3:服务端SYN+ACK重试次数,降低可减少半连接占用时间。net.ipv4.tcp_abort_on_overflow=0:保持默认,避免全连接队列满时直接发RST,给客户端重试机会。
实操步骤:
- 观察当前队列溢出情况:
netstat -s | grep -i listen,重点看times the listen queue of a socket overflowed和SYNs to LISTEN sockets dropped。 - 压测时执行
ss -s,重点看synrecv和estab数量。 - 按下表调整参数。
- 再次压测,若溢出计数不再增长说明生效。
| 参数 | 默认值(多数发行版) | 高并发建议值 | 作用 |
|---|---|---|---|
| net.core.somaxconn | 128或4096 | 4096/8192 | 全连接队列上限 |
| net.ipv4.tcp_max_syn_backlog | 1024 | 8192 | 半连接队列长度 |
| net.ipv4.tcp_syncookies | 1或0 | 1 | 队列满时防丢弃 |
| net.ipv4.tcp_syn_retries | 6 | 3 | 客户端SYN重试 |
| net.ipv4.tcp_synack_retries | 5 | 3 | 服务端SYN+ACK重试 |
Nginx高并发内核参数调优:TIME_WAIT与端口范围这样配
Nginx作为反向代理时,会产生大量短连接,短连接主动关闭后,TIME_WAIT状态会持续2MSL,通常60秒,连接量大时,TIME_WAIT堆积会占满端口,导致出站连接报connect: cannot assign requested address。
优先调整这几个参数:
net.ipv4.tcp_tw_reuse=1:允许将TIME_WAIT连接用于新的出站连接,前提是时间戳开启,这个参数安全,对Nginx代理场景帮助明显。net.ipv4.tcp_timestamps=1:tcp_tw_reuse依赖它,保持开启。net.ipv4.tcp_fin_timeout=30:缩短FIN_WAIT_2的等待时间,减少连接残留。net.ipv4.ip_local_port_range=10000 65000:扩大本地端口范围,避免高并发下端口不够用。
行业共识认为,tcp_tw_recycle在NAT环境下会带来丢包风险,且新版内核已移除,线上不建议开启。
执行命令:
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_timestamps=1
sysctl -w net.ipv4.tcp_fin_timeout=30
sysctl -w net.ipv4.ip_local_port_range="10000 65000"
如果已经出现cannot assign requested address,先查端口占用:
ss -tan state time-wait | wc -l
TIME_WAIT数量长期接近端口范围上限,就说明该扩大范围或复用连接。
服务器高并发网络参数设置,别只盯着sysctl
很多人调完sysctl就收工,高并发一到,内核socket缓冲区小,丢包来了,或者进程报“Too many open files”,服务器高并发网络参数设置要覆盖三块:sysctl、limits、应用systemd。
- 文件句柄:
fs.file-max=6553500控制系统级上限,ulimit -n控制进程级,Nginx worker进程数多,每个进程都要够。 - 修改
/etc/security/limits.conf:
root soft nofile 655350
root hard nofile 655350
soft nofile 655350
hard nofile 655350
- systemd服务里加
LimitNOFILE=655350,否则limits.conf对systemd管理的服务可能不生效。 - socket缓冲区:
net.core.rmem_max、net.core.wmem_max可以设到16777216,net.ipv4.tcp_rmem和net.ipv4.tcp_wmem按“最小值 默认值 最大值”三档调整,高并发小请求场景,默认值足够;大流量长连接场景,调大避免接收窗口过小丢包。
查看进程限制:
cat /proc/12345/limits | grep "open files"
把12345换成Nginx master进程PID,如果LimitNOFILE没生效,检查systemd单元的LimitNOFILE配置并执行systemctl daemon-reload。
调整内核网络参数提升并发能力,先做基线验证再上线
调整不是一锤子,上线前先做基线验证。
具体步骤:
- 备份
。/etc/sysctl.conf
- 逐项修改,不要一次全上,避免某个参数与业务冲突。
- 在被测机执行
sysctl -p,再启动或重载应用。 - 用
wrk -t 16 -c 5000 -d 60s http://127.0.0.1/或ab -n 200000 -c 2000做对比压测。 - 压测时开两个终端,一个跑
ss -s,一个跑watch -n 1 'netstat -st | grep -E "overflowed|SYNs to LISTEN"',看队列丢弃是否还在增长。 - 观察
dmesg里是否有TCP: request_sock_TCP: Possible SYN flooding,有就再加大半连接队列。
别一次性把所有参数拉到最大。tcp_max_tw_buckets如果设得太小,系统会拒绝TIME_WAIT连接;设太大又浪费内存,这个参数多数情况不用动,靠tcp_tw_reuse和端口范围更稳妥。
调整内核网络参数提升高并发连接处理能力,不需要把所有参数背下来,盯住握手队列、TIME_WAIT、端口范围、文件句柄这四块,配合压测验证,就能让单机扛住更高并发。
调整内核网络参数提升并发能力:常见问题快查
Linux高并发服务器内核参数调整后需要重启系统吗?
大多数内核网络参数使用sysctl -p立即生效,不需要重启系统,文件句柄limits修改通常需要重新登录或重启服务,systemd服务的LimitNOFILE需要执行systemctl daemon-reload并重启该服务。
Nginx高并发内核参数调优中ip_local_port_range设多少合适?
常见设置是10000 65000,这样可用端口数量从默认的不到30000个提升到55000个,如果单机Nginx的出站连接数经常超过55000,需要检查业务逻辑或多机分摊,单纯扩大范围会挤占系统资源。
调整内核网络参数提升并发能力时net.core.somaxconn是不是越大越好?
不是。net.core.somaxconn只影响全连接队列上限,设到8192通常足够,如果应用accept速度跟不上,队列再大也会被填满,关键还是调大应用backlog并提升处理速度,内核参数只是给突发流量留缓冲。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/658523.html


![IO多路复用-[多线程网络并发通信 epoll]](https://i0.hdslb.com/bfs/archive/1dedc8d8a21d5fe475064162129c46f002160c35.png)


