У меня есть приложение 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
для запросов, которые должны помочь вам указать правильное направление.