web-dev-qa-db-ja.com

10 GBのメモリと100%のCPUを使用し、接続が50kのHaproxy

Ubuntu 14.04 x64サーバーでは、Haproxyは3.3 GBのメモリと6.8 GBのスワップを使用し、52k接続を処理します。また、CPU使用率は、ほとんどのトラフィックが別のhaproxyボックスにリダイレクトされる前に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. 

sysctl.conf

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.conf

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負荷が高かったのはなぜですか?

6
Nyxynyx

ソースポートが不足し、利用可能なポートをスキャンしようとすると、HAProxyのCPU負荷が100に急上昇します。通常それは30kishです。 sysctl net.ipv4.ip_local_port_range

したがって、たとえば、バックエンドの単一サーバーへの接続が30kの場合、ソースポートが不足し、CPUの問題が発生する可能性があります。

3
Kyle Brandt

追加 nbproc <number-of-cores>オプションを設定に追加します。このHAproxyがなければ、1つのコアで実行されます。

2
Justin Hourigan