Linux 内核参数 net.core.somaxconn 的默认值通常为 128,在高并发 Web 服务或数据库场景下,建议调整为 1024 至 65535 之间。调整该参数可扩大 TCP 监听队列长度,避免高负载下出现 Connection refused 错误,但需配合应用程序端的 backlog 设置共同生效。
先说结论:默认 128 适用于低并发业务,高并发场景建议从 1024 起步,极端高负载可设 65535。
- 适合:高并发 Web 服务、数据库、微服务网关场景
- 先做:确认当前值及应用程序监听队列限制
- 验收:通过 ss 命令观察 Listen 队列是否溢出
命令速用版
临时生效(重启失效):
sysctl -w net.core.somaxconn=4096
永久生效(推荐):
echo "net.core.somaxconn = 4096" >> /etc/sysctl.conf sysctl -p
查看当前值:
sysctl net.core.somaxconn cat /proc/sys/net/core/somaxconn
为什么会这样
net.core.somaxconn 限制了系统中每个监听套接字 backlog 队列的最大长度。
当客户端发起 TCP 连接时,服务器会将尚未被应用程序 accept() 处理的连接放入监听队列。如果并发量大且该队列满了,新的连接请求会被内核直接拒绝,客户端报 Connection refused 错误。默认值 128 是为通用场景设计的,对于高并发服务而言容量不足,增大该值可缓冲更多待处理连接,防止队列溢出。
分步处理
1. 检查当前配置
执行 sysctl net.core.somaxconn 查看当前值,确认是否低于业务需求。
2. 修改内核参数
编辑 /etc/sysctl.conf 文件,添加或修改 net.core.somaxconn = 4096。对于极高并发场景,部分实践建议设为 65535。
3. 应用配置
执行 sysctl -p 使配置生效。注意应用程序(如 Nginx、Java Spring Boot)自身也有监听队列限制(如 Nginx 的 listen backlog 参数),需确保应用层设置不小于内核参数值。
4. 重启服务
重启相关网络服务或应用程序,确保新的 backlog 限制被加载。
怎么验证是否生效
1. 确认参数值
再次执行 sysctl net.core.somaxconn,确认输出值已更新。
2. 观察连接队列
使用 ss -lnt 命令查看监听端口状态。关注 Send-Q 和 Recv-Q 列,Recv-Q 表示当前等待 accept 的连接数,Send-Q 表示最大队列长度(即 somaxconn 与应用层 backlog 的较小值)。
3. 监控丢包
在高并发压测期间,观察应用日志是否仍有 Connection refused 错误,若错误消失且 Recv-Q 未持续顶格,说明调优生效。
常见坑
1. 应用层限制未同步
仅修改内核参数而忽略应用程序自身的 backlog 配置,实际生效值取两者较小值,导致调优无效。
2. 临时修改未持久化
使用 sysctl -w 修改仅当前生效,重启服务器后恢复默认,生产环境务必修改 /etc/sysctl.conf。
3. 容器环境遗漏
在 Docker 或 Kubernetes 环境中,容器内可能继承宿主机限制或受限于 namespace 配置,需确保宿主机和容器内参数均调整至合理值。
4. 内核版本差异
不同 Linux 发行版默认值可能不同(128 或 1024),部分旧内核参数行为可能存在差异,建议先在小环境验证。
常见问题
net.core.somaxconn 默认值是多少?
大多数 Linux 发行版默认值为 128,部分新版本或特定发行版可能为 1024。
修改后需要重启服务器吗?
不需要。使用 sysctl -p 加载配置后立即生效,但已建立的连接不受影响,新连接按新队列长度处理。
该参数越大越好吗?
不是。过大的值会占用更多内核内存资源,且在极端情况下可能掩盖应用程序 accept 处理慢的问题,建议根据实际并发量调整。
与 tcp_max_syn_backlog 有什么区别?
somaxconn 控制全连接队列(已完成三次握手),tcp_max_syn_backlog 控制半连接队列( SYN_RECV 状态),两者需配合调整。
参考来源
- Linux 内核参数调优:几个实际场景的改法
- Linux 内核参数调优:针对高并发 Web 服务的 net.core.somaxconn 等 10 个关键参数配置
- Linux 内核参数 net.core.somaxconn 详解
- 深入理解与优化 Linux 内核参数:以 net.core.somaxconn 为例
- [OS/Linux] Linux 核心参数:net.core.somaxconn(高并发场景核心参数) - 博客园
- 【网络】Linux 内核优化实战 - net.core.somaxconn
- Linux 内核参数调优实战:生产环境性能翻倍
- Linux 如何调优网络参数?_Linux sysctl 网络配置与性能提升
- linux 内核常用调优参数
- Linux 系统常用内核网络参数介绍与常见问题处理