HAProxy 高并发场景下 maxconn 参数如何设置最优值?

文章导读
在 Linux 系统上,每个 TCP 连接大约占用 10-20KB 内核内存,若给 HAProxy 预留 2GB 内存,理论上可支持约 10 万个连接 (2GB / 20KB ≈ 100,000),但 global 段建议设置略低于理论值的安全值如 50000。
📋 目录
  1. 原因分析
  2. maxconn 参数层级与优先级
  3. maxsock 计算公式与文件描述符限制
  4. Linux 内核参数协同优化
  5. 不同业务场景的推荐值
  6. 注意事项
  7. 参考来源
A A

HAProxy 高并发场景下 maxconn 参数如何设置最优值?

核心结论:在 Linux 系统上,每个 TCP 连接大约占用 10-20KB 内核内存,若给 HAProxy 预留 2GB 内存,理论上可支持约 10 万个连接 (2GB / 20KB ≈ 100,000),但 global 段建议设置略低于理论值的安全值如 50000。

原因分析

HAProxy 的默认配置非常保守,默认的全局最大连接数 maxconn 可能只有 2000,这对于现代 Web 应用来说几分钟就会用完。HAProxy 实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数,但多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。maxconn 参数设置得太小,新连接会被拒绝,用户看到"连接被重置";设置得太大,超出系统能承受的范围,会导致内存耗尽,整个服务崩溃。

maxconn 参数层级与优先级

HAProxy 中 maxconn 参数有多个层级,优先级从高到低为:(1) 命令行参数-n 指定的连接数 > global 中通过 maxconn 设置的连接数;(2) listen 段中的 maxconn > default 段中的 maxconn > 命令行参数-N 指定的连接数;(3) server 中的 maxconn 设置该后台服务的最大连接数。实际案例中,若 global maxconn 设为 60000,侦听端口 50000 的代理段最大连接数为 20000,侦听端口 60000 的代理段使用 default 中 maxconn 值 30000,其后端真正服务最大连接数为 10000。

maxsock 计算公式与文件描述符限制

HAProxy 自身会调整 ulimit,不推荐手动设置。具体计算方式为:maxsock = 10(默认值) + global.maxconn * 2 + global.maxpipes * 2 + bind 数量 + check 数量。其中 maxconn 对应 global 中 maxconn 或命令行参数-n 设置的值,maxpipes 对应 global 中 maxpipes 的值(默认 0),bind 对应 bind 的个数,check 对应后台服务健康检测个数。以 maxconn=60000、maxpipes=0、bind=3 为例,maxsock=10+60000*2+0*2+3+check 数量。Linux 系统默认文件描述符限制为 1024,需通过 echo '* - nofile 65535' >> /etc/security/limits.conf 提升。

HAProxy 高并发场景下 maxconn 参数如何设置最优值?

Linux 内核参数协同优化

仅调整 HAProxy 参数不够,需同步优化 Linux 内核:(1) 缩短 TIME_WAIT 时间,查看默认值 cat /proc/sys/net/ipv4/tcp_fin_timeout(默认 60s),永久生效设置 net.ipv4.tcp_fin_timeout = 10;(2) 启用 TIME_WAIT 快速回收和重用,设置 net.ipv4.tcp_tw_reuse = 1 和 net.ipv4.tcp_tw_recycle = 1(默认均为 0);(3) 修改本地端口可用范围,默认 32768 到 61000,建议设为 net.ipv4.ip_local_port_range = 4000 65535 以使用更多端口;(4) 执行 sysctl -p 使设置生效。

不同业务场景的推荐值

根据实际业务负载,推荐值有所不同:(1) 通用 Web 应用:global maxconn 50000,frontend 面向公网的 HTTP 前端单独设限 maxconn 30000;(2) 后端 Apache 保护:backend 中设置 maxconn 100(根据 Apache 的 MaxRequestWorkers 调整),配合 balance leastconn,启用 slowstart 30s 避免新上线实例瞬间被压满;(3) 高负载场景:有配置示例使用 maxconn 655350;(4) 保守推荐:部分资料推荐使用 10240,根据应用实际情况调整。

注意事项

真实用户踩过的坑:(1) option http-server-close 主动断开长连接时,HAProxy 会在 header 中添加"Connection:close",但有些服务器看到此头部会直接拒绝访问,需配合 option http-pretend-keepalive 使用去掉该头部;(2) 不设置长连接会造成大量 TIME_WAIT,需缩短 time_wait 时间;(3) HAProxy 默认配置保守是为确保在各种环境下稳定运行,调优需理解 HAProxy 工作原理、业务流量特征及操作系统内核协作方式;(4) nbproc 建议与当前服务器 CPU 核数相等或为其 2 倍;(5) timeout 设置建议:timeout http-keep-alive 设为 10s,timeout http-request 设为 5~10s,timeout client 访问量过大时设为 1min 左右。

参考来源

来源:HAProxy 进阶实战文档 - 从配置优化到高可用架构(2026 年 3 月 12 日)

HAProxy 高并发场景下 maxconn 参数如何设置最优值?

来源:HAProxy 参数优化技术博客 - haproxy 限制接入设备与最大连接数计算(2024 年 3 月 29 日)

来源:HAProxy 性能调优指南 - 10 个提升负载均衡性能的实战技巧(2025 年 12 月 17 日)

来源:阿里云开发者社区 - 集群之 Haproxy 版本特性与架构说明(2017 年 11 月 15 日)