在 Ubuntu 14.04 x64 服务器上,Haproxy 使用 3.3 GB 内存和 6.8 GB 交换空间,同时处理 52k 个连接。在大部分流量重定向到另一个 haproxy 盒之前,CPU 使用率也一直飙升至 100%。流量主要是持久 TCP 连接。
pid = 3185 (process #1, nbproc = 1)
uptime = 0d 6h14m21s
system limits: memmax = unlimited; ulimit-n = 524341
maxsock = 524341; maxconn = 262144; maxpipes = 0
current conns = 54303; current pipes = 0/0
Running tasks: 1/54336
我们注意到,当连接数达到 50k 左右时,内存使用量会急剧上升。ulimit -n
设置为1048576
。
问题:内存使用量是否异常高?如何减少内存消耗?
我还从另一个问题中读到了以下内容,这是否相关?我应该如何检查 TCP 设置是否足够(对于持久 TCP 连接)以免导致内存使用量大幅增加?
At 54000 concurrent connections, you should be careful about your TCP settings. If running with default settings (87kB read buffer, 16kB write buffer), you can end up eating 10 gigs of memory just for the sockets.
系统配置参数
net.core.wmem_max=12582912
net.core.rmem_max=12582912
net.ipv4.tcp_rmem= 10240 87380 12582912
net.ipv4.tcp_wmem= 10240 87380 12582912
haproxy配置文件
global
log /dev/log local0
log /dev/log local1 notice
maxconn 262144
chroot /var/lib/haproxy
user haproxy
group haproxy
daemon
defaults
log global
mode tcp
option tcplog
option dontlognull
option redispatch
retries 3
maxconn 262144
contimeout 180000
clitimeout 180000
srvtimeout 180000
timeout contimeout 180000
timeout connect 180000
timeout client 180000
timeout server 180000
更新
重启(不是重新加载)haproxy 可将 CPU 负载降低至 30%。之前 CPU 负载过高的原因是什么?
答案1
一旦源端口用完并尝试扫描可用端口,HAProxy 上的 CPU 负载将达到 100。通常情况下,这个数字是 30kish。你有什么用呢sysctl net.ipv4.ip_local_port_range
?
举例来说,如果您与后端的单个服务器有 30k 个连接,则您可能会耗尽源端口并遇到 CPU 问题。
答案2
将选项添加nbproc <number-of-cores>
到配置中。如果没有这个,HAproxy 将在单核上运行。