内核参数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) 监听套接字时,系统会维护两个队列:
- 已完成三次握手的连接(等待被
accept()的连接); - 正在进行三次握手的连接(SYN 队列,受
tcp_max_syn_backlog限制);
其中,已完成三次握手的连接队列长度不能超min(backlog, net.core.somaxconn)。
如果超过这个限制,新连接将被丢弃或拒绝,表现为“连接被拒绝”或“超时”。
示例
- 如果你在应用中设置了
listen(fd, 1024),但net.core.somaxconn是128,那么实际上排队队列大小被限制为128。 - 在高并发环境(如 Redis 响应突发流量)中,这个值建议调大,比如设置为
1024或更高:
1 | sysctl -w net.core.somaxconn=1024 |
注意事项:
- Redis 也有配置项
tcp-backlog,它会传给listen()函数,建议两者一起调整。 - 修改此参数仅在当前运行时有效,如需永久生效,请加入
/etc/sysctl.conf或/etc/sysctl.d/*.conf中:
1 | # 永久修改 |
如果你是在 Docker 中设置,也可以在 docker-compose.yml 里用:
1 | sysctls: |