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

настройка веб-сокетов / хапрокси с высоким трафиком

У меня есть приложение pubsub (в основном чат, но некоторые другие полезности публикуются и публикуются также), работающее на node & socket.io.

Я тестирую это приложение под нагрузкой, раскручивая несколько других, очень больших, ящиков и запустив приложение узла, которое я написал для этой цели, которое порождает массу процессов, которые подключаются с помощью пакета socket.io-client.

Я обнаружил, что могу получить около 1 тыс. одновременных подключений к одному облачному устройству на 1 Гбайт. нам нужно поддерживать от 10 000 до 100 000 одновременных подключений (для определенных событий, не всегда), хотя я поставил балансировщик нагрузки впереди и решил, что перед большим событием я бы развернул больше машин. но я поставил коробку haproxy впереди и обнаружил, что с 2 серверами и 2k пользователей я золотой, но с 4 серверами даже 3k пользователей - это борьба!

Я заметил, что когда мои нагрузочные тесты начинают вызывать множество отключений, серверы узлов испытывают очень высокую загрузку ЦП (в 90%), что я считаю странным, потому что, когда 2 сервера и 2 тыс. пользователей, я получаю максимум 70%, что быстро уменьшается .

вот несколько соответствующих строк из моей конфигурации haproxy:

mode http
timeout client 86400000
timeout server 86400000
timeout connect 5000
maxconn 100000

Я также добавил некоторые настройки ядра в /etc/sysctl.conf на моем haproxy и node:

net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65023 
net.ipv4.tcp_max_syn_backlog = 10240 
net.ipv4.tcp_max_tw_buckets = 400000 
net.ipv4.tcp_max_orphans = 60000 
net.ipv4.tcp_synack_retries = 3 
net.core.somaxconn = 50000 
net.core.netdev_max_backlog = 50000 
net.ipv4.tcp_rmem = 8192 87380 8388608 
net.ipv4.tcp_wmem = 8192  87380 8388608

и оба блока haproxy и node имеют ulimit -n 99999 в соответствующих сценариях инициализации (перед запуском haproxy или node)

блок haproxy постоянно использует однозначный (или менее) процессор.

какими должны быть мои следующие шаги? здесь что-нибудь выделяется как проблема?

Включите ведение журнала HAProxy HTTP, если вы еще этого не сделали, и посмотрите, сможете ли вы найти причину отключений в этом или в системном журнале сервера. HAProxy Формат журнала HTTP включает termination_state для запросов, которые должны помочь вам указать правильное направление.