Открытие выше 1MLN соединений застрял на 469K

243
Peter Shipilo

Мне нужно настроить сервер для обработки более миллиона открытых соединений websocket (в идеале 1.5-2.0).

Я использовал конфигурацию из этого поста:

sysctl -w fs.file-max=12000500 sysctl -w fs.nr_open=20000500 ulimit -n 20000500 sysctl -w net.ipv4.tcp_mem='10000000 10000000 10000000' sysctl -w net.ipv4.tcp_rmem='1024 4096 16384' sysctl -w net.ipv4.tcp_wmem='1024 4096 16384' sysctl -w net.core.rmem_max=16384 sysctl -w net.core.wmem_max=16384 

Тем не менее, мое приложение перестает применять новые подключения после того, как оно достигнет 469219 подключений. Что еще я могу пропустить? Я действительно думаю, что чего-то не хватает в конфигурации ОС. Наше основное приложение написано на Java (с сервером Tomcat), но я также получил те же результаты с сервером NodeJS.

Мы используем Ubuntu с 16 ГБ оперативной памяти.

0

1 ответ на вопрос

0
Eugen Rieck

В блоге вы прямо заявляете, что 12M сокеты используют 46 ГБ ОЗУ для стека TCP - в дополнение к тому, что еще работает.

Если у вас есть только 16 ГБ, тогда запустите Tomcat с приложением, и у вас просто не будет достаточно ОЗУ для приема большего количества соединений. Цифры NodeJS похожи, но не равны, потому что свободная RAM похожа, но не равна.

Обновление до 128 или 256 ГБ, и я подозреваю, что это будет работать нормально.

На самом деле Java-приложение занимает около 9 ГБ памяти, в то время как вся операционная система, работающая с этим приложением, занимает около 11,9 ГБ. Доступно еще около 2,5 ГБ. Говоря о NodeJS, дела обстоят еще лучше. Это занимает менее 3 ГБ. Peter Shipilo 7 лет назад 0