Назад | Перейти на главную страницу

Haproxy с использованием 10 ГБ памяти и 100% ЦП с 50 КБ соединений

На сервере Ubuntu 14.04 x64 Haproxy использует 3,3 ГБ памяти и 6,8 ГБ подкачки при обработке 52k подключений. Загрузка ЦП также продолжает расти до 100% до того, как большая часть трафика была перенаправлена ​​на другой сервер haproxy. Трафик - это в основном постоянные 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

Было замечено, что использование памяти резко выросло примерно при 50 тыс. Соединений. 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 снизил загрузку процессора до 30%. Что могло раньше вызывать высокую загрузку процессора?

Загрузка процессора на HAProxy резко возрастет до 100, как только у вас закончатся исходные порты и вы попытаетесь найти доступные. Хотя обычно это 30киш. Что у тебя есть для sysctl net.ipv4.ip_local_port_range?

Так, например, если у вас есть 30k подключений к одному серверу в бэкэнде, у вас, скорее всего, закончятся исходные порты и возникнет проблема с процессором.

Добавить nbproc <number-of-cores> вариант в config. Без этого HAproxy работает на одном ядре.