内核参数net.core.somaxconn作用

net.core.somaxconn 是 Linux 内核中的一个参数,它定义了 每个监听套接字(listen socket)可以排队的最大连接请求数。这个值影响服务器在高并发连接下的性能表现,尤其是像 Redis、Nginx、MySQL 这样的高吞吐量服务。


参数含义详解:

  • 作用对象:对 listen() 系统调用中的 backlog 参数起限制作用。
  • 默认值(取决于系统):常见如 128
  • 单位:连接数(整数)。
  • 所在路径/proc/sys/net/core/somaxconn

工作原理(配合 listen() 的 backlog 参数):

当一个服务(如 Redis)调用 listen(fd, backlog) 监听套接字时,系统会维护两个队列:

  1. 已完成三次握手的连接(等待被 accept() 的连接);
  2. 正在进行三次握手的连接(SYN 队列,受 tcp_max_syn_backlog 限制);

其中,已完成三次握手的连接队列长度不能超min(backlog, net.core.somaxconn)
如果超过这个限制,新连接将被丢弃或拒绝,表现为“连接被拒绝”或“超时”。


示例

  • 如果你在应用中设置了 listen(fd, 1024),但 net.core.somaxconn128,那么实际上排队队列大小被限制为 128
  • 在高并发环境(如 Redis 响应突发流量)中,这个值建议调大,比如设置为 1024 或更高:
1
sysctl -w net.core.somaxconn=1024

注意事项:

  • Redis 也有配置项 tcp-backlog,它会传给 listen() 函数,建议两者一起调整。
  • 修改此参数仅在当前运行时有效,如需永久生效,请加入 /etc/sysctl.conf/etc/sysctl.d/*.conf 中:
1
2
3
# 永久修改
echo 'net.core.somaxconn = 1024' >> /etc/sysctl.conf
sysctl -p

如果你是在 Docker 中设置,也可以在 docker-compose.yml 里用:

1
2
sysctls:
net.core.somaxconn: "1024"