net.core.somaxconn是控制TCP全连接队列上限的关键参数,实际生效值为min(backlog应用参数, somaxconn),必须同步调高应用层listen backlog、net.ipv4.tcp_max_syn_backlog及net.core.netdev_max_backlog,并重启服务才能解决高并发监听队列溢出问题。

net.core.somaxconn 是 Linux 内核中控制已完成三次握手的 TCP 连接等待队列(Accept 队列)最大长度的关键参数。它不直接决定能建多少连接,而是决定“已建立但还没被应用 accept 走”的连接最多能排几个。在 Upstream 集群压测场景下,若该值过小,会成为吞吐瓶颈——尤其当后端服务(如 Nginx、Envoy、自研网关)处理 accept 较慢,或突发流量冲击时,新连接被内核直接拒绝(RST),表现为客户端 Connection refused 或上游 502/503。
要让它真正协同 Upstream 集群提升压测吞吐,不能只调一个数,而需与应用层配置、连接模型、集群拓扑联动优化。
? 1. 确认当前 somaxconn 是否已成为瓶颈
先别急着改,验证是否真卡在这:
# 查看当前值(默认常为128或1024)
sysctl net.core.somaxconn
# 检查监听端口的实际队列使用情况(例如 :80 或 :3000)
ss -lnt | awk '$4 ~ /:[0-9]+$/ {print $1, $4, $5}' | grep ":80"
# 输出示例:tcp 0 128 *:80 *:* → 表示 listen backlog 设为128,当前有0个待accept,上限128
# 若第3列(Recv-Q)长期接近甚至等于第4列(Send-Q),说明队列持续满载
再结合压测日志:
- 客户端出现大量
connect() failed (111: Connection refused) - Upstream 节点
ss -s中SYNs to LISTEN显著增长(说明 SYN 队列也溢出,需同步调tcp_max_syn_backlog)
⚙️ 2. 合理设置 somaxconn 值:不是越大越好,要匹配实际能力
推荐值:65535(即 2^16 - 1),这是多数现代内核支持的安全上限。
# 临时生效 sudo sysctl -w net.core.somaxconn=65535 # 永久生效(写入配置文件) echo "net.core.somaxconn = 65535" | sudo tee -a /etc/sysctl.d/99-network-performance.conf sudo sysctl -p /etc/sysctl.d/99-network-performance.conf
⚠️ 注意:
- 该值必须 ≥ 应用层
listen()调用传入的backlog参数(如 Nginx 的listen 80 backlog=8192;) - 若应用未显式设 backlog(如某些 Go/Python 服务默认用 128),内核仍按
min(backlog_app, somaxconn)截断——所以光调内核没用,必须两端对齐
? 3. Upstream 集群侧必须同步调整
单点调优无效,集群中每个节点都需一致,并配合以下动作:
-
Nginx 示例(/etc/nginx/nginx.conf)
Linux Security Scanner下载Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
http { # 全局监听队列扩大 server { listen 80 backlog=65535; listen 443 ssl backlog=65535; } } -
Envoy 示例(bootstrap.yaml)
在listeners的socket_options中显式设置:socket_options: - state: STATE_LISTEN level: SOCKET_LEVEL name: SO_BACKLOG int_value: 65535
自研 C++/Go 网关
listen(sockfd, 65535)中第二个参数需设为 65535(Gonet.Listen("tcp", addr)默认用系统限制,需确认 runtime 是否读取了新 somaxconn)
? 4. 压测时观察真实收益与关联指标
调完后用 wrk 或 hey 压测,对比关键指标:
| 指标 | 优化前(somaxconn=128) | 优化后(=65535) | 说明 |
|---|---|---|---|
| QPS(400并发) | 12,480 | 16,920 | +35%(见实测数据) |
| 失败率 | 1.8% | 0.0% | 连接拒绝归零 |
ss -lnt Recv-Q 峰值 |
128(持续打满) | ≤ 200 | 队列有余量 |
netstat -s \| grep "SYNs to LISTEN" |
每秒+500 | SYN 队列也不溢出(需同步调 tcp_max_syn_backlog=65535) |
✅ 小技巧:压测中用
watch -n1 'ss -lnt \| grep :80'实时盯队列水位;用cat /proc/net/sockstat看整体 socket 状态。
? 5. 必须配套调的 3 个关联参数(缺一不可)
somaxconn 单独调效果有限,必须组合:
net.ipv4.tcp_max_syn_backlog=65535
控制半连接队列(SYN_RCVD 状态),防止 SYN Flood 下连接请求被丢弃。net.core.netdev_max_backlog=65536
网卡软中断收包队列,避免突发流量在驱动层就丢包(尤其万兆网卡+多队列绑定时)。net.ipv4.tcp_tw_reuse=1+net.ipv4.tcp_fin_timeout=30
加速 TIME_WAIT 套接字复用,缓解短连接压测下的端口耗尽(Upstream 作为客户端发起连接时生效)。
这些应统一写入 /etc/sysctl.d/99-network-performance.conf 并 sysctl -p 生效。
不复杂但容易忽略










