跳转至

somaxconn

Overview

在 Linux 系统中,somaxconn(socket maximum connections)是一个内核参数,用于 限制 socket 监听队列(listen backlog)的最大长度。它控制了当一个服务(如 Nginx、Redis、MySQL、Node.js 服务等)调用 listen() 时,允许在等待处理的连接请求队列中最多可以有多少个连接。

如果连接请求过多而队列满了,新的连接可能会被丢弃或拒绝,导致“连接超时”或“connection refused”错误。

默认值通常是:

128(旧版本)
4096(较新版本,如 CentOS 7+/Ubuntu 18.04+)

查看和配置somaxconn

查看somaxconn当前值

cat /proc/sys/net/core/somaxconn

配置somaxconn

临时调整

sudo sysctl -w net.core.somaxconn=65535

永久调整

sudo vim /etc/sysctl.conf
net.core.somaxconn = 65535
sudo sysctl -p

创建专用配置文件(推荐)

sudo vim /etc/sysctl.d/99-somaxconn.conf
net.core.somaxconn = 65535
sudo sysctl --system

验证

sysctl net.core.somaxconn
# 输出应为 65535

检查服务连接队列(可选)

ss -lnt

输出示例:

State      Recv-Q Send-Q     Local Address:Port     Peer Address:Port
LISTEN     0      65535            *:80                 *:*
  • Recv-Q:当前等待 accept 的连接数
  • Send-Q:就是 somaxconn 和应用 backlog 的最小值(取小的那个)

推荐值(根据场景)

普通 Web 服务 4096 ~ 16384
高并发服务(如 API 网关、Redis) 32768 ~ 65535
超高并发/压测环境 65535

优化网络性能相关参数

这些参数用于控制 SYN 队列,与 somaxconn 配合使用效果更好。

# 调大接受连接队列(全连接队列上限)
net.core.somaxconn = 65535

net.core.netdev_max_backlog = 5000
# 增加网络设备接收队列长度
net.ipv4.tcp_max_syn_backlog = 65535
# 启用 SYN Cookies(防止 SYN Flood 攻击)
net.ipv4.tcp_syncookies = 1

应用层配合

即使你把 somaxconn 调大,应用程序本身也必须在 listen() 时指定足够大的 backlog 参数,否则仍然受限。

  • Nginx
server {
    listen 80 backlog=65535;
    # ...
}
  • Node.js
server.listen(3000, '0.0.0.0', 65535, () => {
  console.log('Server running');
});
// 第三个参数是 backlog
  • Python(socket)
sock.listen(65535)
  • Redis(redis.conf)
tcp-backlog 65535