Максимальное открытие 1 миллиона подключений при 469 КБ

Мне нужно настроить сервер для обработки более одного миллиона открытых подключений к веб-сокетам (в идеале два миллиона).

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

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 ГБ ОЗУ.

РЕДАКТИРОВАТЬ: На пике система использует около 12 ГБ из 14,7 ГБ.

UPD :

Итак, наконец, у меня есть рабочая станция на 32 ГБ. Проблема решена увеличением объема оперативной памяти. В настоящее время при использовании кучи Java 18 ГБ я могу обрабатывать 567 КБ соединений WS. Для больших чисел мне нужно больше клиентов: -)

0
задан 27 December 2016 в 18:55
1 ответ

Не обязательно ответ, но слишком большой для того, чтобы помещать комментарий.

tcp_mem (since Linux 2.4)
      This  is  a vector of 3 integers: [low, pressure, high].  These bounds, measured in units of the system page size, are used by
      TCP to track its memory usage.  The defaults are calculated at boot time from the amount of available memory.  (TCP  can  only
      use  low memory for this, which is limited to around 900 megabytes on 32-bit systems.  64-bit systems do not suffer this limi-
      tation.)

      low       TCP doesnât regulate its memory allocation when the number of pages it has allocated globally is below this  number.

      pressure  When the amount of memory allocated by TCP exceeds this number of pages, TCP moderates its memory consumption.  This
                memory pressure state is exited once the number of pages allocated falls below the low mark.

      high      The maximum number of pages, globally, that TCP will allocate.  This value overrides any other limits imposed by the
                kernel.

Обратите внимание на следующее:

Эти границы,измеряется в единицах размера системной страницы

Установка этого значения на 10000000 10000000 10000000 указывает ядру на использование 39062 МиБ памяти для TCP. Почти в три раза больше, чем у вас есть.

Вторая проблема - это 3 значения для TCP rmem и wmem , которые вы устанавливаете, определяют минимальное значение, значение по умолчанию и максимальное значение. Учитывая, что ваша конфигурация tcp_mem заявляет, что вы никогда не переходите в режим «экономии памяти», я полагаю, что вы на самом деле выделяете где-то между 4-16 КБ на сокет.

Итак, если бы я был ядром и видел такие безумные настройки, я мог бы себя не вести что предсказуемо тоже.

Попробуйте уменьшить это значение до того, что вы действительно можете использовать, и попробуйте еще раз.

Наконец, я отмечу, что вы живете в мире грез, если вы серьезно верите, что:

  1. Ядро поддерживает 2 миллиона соединений с любым комфортом.
  2. Узел или java будут поддерживать 2 миллиона соединений с любым комфортом.

Даже при лучших обстоятельствах (при использовании набора epoll) 2 миллиона записей в наборе epoll - это дорого. Этого никогда не случится с моделью Worker или Prefork.

Вы должны распределять эту нагрузку более равномерно. Вероятно, вам понадобятся еще 10 узлов, по крайней мере, чтобы получить что-нибудь достойное того, что пользователь назвал бы услугой.

8
ответ дан 4 December 2019 в 11:06

Теги

Похожие вопросы