我在 Ubuntu 14.04(已修改)上运行 HAProxy 1.5。它接受 http 和 https 端口上的连接。两个后端应用程序使用持久连接处理请求。
当我创建大约 2200 个客户端连接时,haproxy 停止接受其他连接。但我希望此系统至少接受 10K 个同时连接。
以下是连接统计信息:
# ss -s
TCP: 4119 (estab 4098, closed 6, orphaned 0, synrecv 0, timewait 6/0), ports 0
Transport Total IP IPv6
TCP 4113 4106 7
INET 4128 4117 11
我已经调整了该进程的最大打开文件数:
# cat /proc/1012/limits
Limit Soft Limit Hard Limit Units
Max open files 240017 240017 files
我的 haproxy.config 文件:
global
log /dev/log syslog debug
daemon
user haproxy
group haproxy
maxconn 120000
spread-checks 4
defaults
log global
timeout connect 30000ms
timeout client 300000ms
timeout server 300000ms
frontend http-in
mode http
bind :80
option httplog
option forwardfor
reqadd X-Forwarded-Proto:\ http
default_backend http-routers
frontend https-in
mode http
bind :443 ssl crt /opt/haproxy/cert.pem no-sslv3
option httplog
option forwardfor
option http-server-close
reqadd X-Forwarded-Proto:\ https
default_backend http-routers
frontend ssl-in
mode tcp
bind :4443 ssl crt /opt/haproxy/cert.pem no-sslv3
default_backend tcp-routers
backend http-routers
mode http
balance roundrobin
server node0 192.168.10.2:80 check inter 1000
server node1 192.168.10.2:80 check inter 1000
backend tcp-routers
mode tcp
balance roundrobin
server node0 192.168.10.2:80 check inter 1000
server node1 192.168.10.2:80 check inter 1000
答案1
据我所知,监听块 maxconn 与全局 maxconn 不同。使用全局 maxconn,您可以限制 haproxy 进程处理的最大连接数。
Listen / frontend 部分有自己的 maxconn,它限制了每个 listener 的连接数。因此,请尝试在 frontend 部分也设置 maxconn,或者至少在 default 部分设置它。
因此,要么:
defaults
maxconn 10000
或者根据前端进行设置。
答案2
您的 HAProxy 机器的硬件配置是什么?核心、RAM、网络接口等?
我们遇到了许多 HAProxy 性能问题。以下是一些想法:
将流量分成两个 HAProxy 服务器,每个服务器充当另一个服务器的备份。
增加nb进程来反映你的特定硬件上的核心数量。
如果您正在使用第 7 层模式,请查看是否可以降级到第 4 层模式以获得更大的吞吐量。
答案3
Haproxy 自 1.5 版本以来已经发生了变化,但管理指南请参阅“5. 文件描述符限制”一节中的要点,这些是您可能会遇到的限制:
1-文件描述符的最大数量。由 Haproxy 在启动时自动设置。
规则 maxconn 值 x 2 ~= 最大文件描述符
在conf文件上:
maxconn 500000
形成网络统计报告:
maxconn = 500.000
maxsock = 1.000.070
从系统来看:
# pidof haproxy
# cat /proc/630/limits | grep 'open files'
Limit Soft Limit Hard Limit Units
Max open files 1.000.070 1.000.070 files
可识别的错误 -> strace accept() 或 socket() 返回“-1 EMFILE”
2- 系统范围的文件描述符。根据内存量在启动时设置
# cat /proc/sys/fs/file-max
3.074.560
可识别的错误 -> strace accept() 或 socket() 返回“-1 ENFILE”
3- 每个进程的文件描述符数量的硬限制。
# cat /proc/sys/fs/nr_open
1.048.576
可识别的错误 -> strace accept() 或 socket() 返回“-1 ENFILE”