Haproxy 使用 10GB 内存、100% CPU,连接数为 50k

Haproxy 使用 10GB 内存、100% CPU,连接数为 50k

在 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 将在单核上运行。

相关内容