HAProxy 性能调优时 net.core.somaxconn 要怎么配合设置?

文章导读
调整 HAProxy 性能时,net.core.somaxconn 必须大于或等于 HAProxy 配置中的 maxconn 值,否则操作系统会截断连接队列导致请求丢失。该设置适用于高并发接入场景,风险在于设置过高会占用少量内核内存,但通常不会造成系统不稳定。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

调整 HAProxy 性能时,net.core.somaxconn 必须大于或等于 HAProxy 配置中的 maxconn 值,否则操作系统会截断连接队列导致请求丢失。该设置适用于高并发接入场景,风险在于设置过高会占用少量内核内存,但通常不会造成系统不稳定。

先说结论:net.core.somaxconn 是操作系统层面的监听队列上限,必须配合 HAProxy 的 maxconn 参数同步调大,否则 HAProxy 层允许的连接数会被内核层强制限制。

  • 先定位:检查当前系统 net.core.somaxconn 值与 HAProxy global maxconn 设置是否匹配。
  • 先做:通过 sysctl 修改内核参数,并同步更新 HAProxy 配置文件中的 maxconn。
  • 再验证:重启服务后通过 ss 命令和 HAProxy 统计页面确认队列无截断。

命令速用版

sysctl -w net.core.somaxconn=4096
echo "net.core.somaxconn = 4096" >> /etc/sysctl.conf
sysctl -p

为什么会这样

操作系统内核维护着一个监听队列,用于存放已完成三次握手但尚未被应用层 accept 的连接。

HAProxy 作为用户态程序,通过 maxconn 声明自己希望处理的最大连接数,但实际能积压在内核队列中的连接数受 net.core.somaxconn 限制。如果 HAProxy 忙不过来,连接会先排在内核队列里,若 somaxconn 过小,新连接会被直接拒绝,表现为客户端连接重置或超时。

分步处理

步骤 1:检查当前内核参数

sysctl net.core.somaxconn

确认返回值,若小于 1024,在高并发场景下通常不足。

步骤 2:修改内核参数

编辑 /etc/sysctl.conf,添加或修改以下行:

net.core.somaxconn = 4096

执行 sysctl -p 使配置生效,无需重启系统。

步骤 3:调整 HAProxy 配置

编辑 haproxy.cfg,在 global 段落确保 maxconn 不小于 somaxconn:

HAProxy 性能调优时 net.core.somaxconn 要怎么配合设置?
global
maxconn 4096

步骤 4:重启 HAProxy

systemctl reload haproxy

怎么验证是否生效

使用 ss 命令查看监听 socket 的 Send-Q 和 backlog 信息:

ss -lnt | grep :80

观察 HAProxy 统计页面中的 "Queue current" 和 "Connection rate",确认没有频繁的连接拒绝错误。

检查系统日志 /var/log/messages 或 dmesg,确认没有 TCP 队列溢出的警告。

常见坑

1. 只修改了 HAProxy 配置未修改内核参数,导致实际生效值仍为旧值。

2. somaxconn 设置过大(如超过 65535),在某些旧内核版本可能无效或被忽略。

3. 忽略了 ephemeral ports 范围,高并发 outbound 连接可能耗尽端口而非队列。

常见问题

net.core.somaxconn 默认值是多少?

Linux 内核默认值通常为 128 或 4096,具体取决于发行版和内核版本,CentOS 7 常见为 128,较新发行版多为 4096。

修改后需要重启服务器吗?

不需要重启服务器,执行 sysctl -p 即可生效,但 HAProxy 服务需要重载或重启以应用新的 maxconn 设置。

somaxconn 设置越大越好吗?

不是,过大的值会占用内核内存结构,且若 HAProxy 处理不过来,队列积压只会增加延迟而非吞吐量,应依据实际并发量设置。

参考来源

  • HAProxy Configuration Manual, "Global parameters", https://www.haproxy.com/documentation/haproxy-configuration-manual/
  • Linux Kernel Documentation, "net.core somaxconn", https://www.kernel.org/doc/html/latest/admin-guide/sysctl/net.html