Intereting Posts
Как установить umask для системного пользователя? Авторское право для unlicense debian машиносчитываемый формат Включить kwebkitpart в Konqueror Makikng Alt + h переключается на левую панель в tmux bash + с помощью printf для печати в специальном формате typeet -A дает ошибку в скрипте Символы, отличные от ASCII, некорректно сохраненные при отправке почты в Emacs С расположением EN / HE, почему клавиши со стрелками переключаются с логического на визуальный с помощью Ctrl вниз? Проверка присоединения Rsync не отражает каталоги Удалить последний символ строки, используя строковое манипулирование в сценарии оболочки Изменение глубины поиска при поиске каталогов Msgstr "Невозможно найти действительный baseurl для репо: base / 7 / x86_64" on "yum update all" Создать гостевую учетную запись с ограниченным доступом к приложениям Максимальное окно больше, чем на CentOS 7.5, с помощью vncserver Печать определенного раздела строки при наличии значения триггера

Какова формула для определения того, сколько памяти потребляет сокет в Linux?

Я занимаюсь планированием емкости, и мне было интересно, есть ли формула, которую я мог бы использовать для прогнозирования (с точки зрения памяти) количества TCP-соединений, которые я мог бы обрабатывать на своем сервере. На данный момент меня беспокоят только требования к памяти.

Некоторые переменные, которые, как я думаю, будут отображаться в формуле:

  • sysctl's net.ipv4.tcp_wmem (мин или значение по умолчанию)
  • sysctl's net.ipv4.tcp_rmem (мин или значение по умолчанию)
  • размер носков, sock_common, proto и других структур данных сокета.

Я не уверен, сколько из tcp_wmem и tcp_rmem действительно выделено и когда выделена эта память. В момент создания сокета? По требованию?

Если вы можете изменить исходный код, используйте данные rusage для измерения RSS и записи о том, сколько TCP-соединений находится в игре во время измерения.

Если исходный код не может быть изменен, используйте RSS сетевого приложения, как сообщается top или ps, и получите количество сетевых подключений во время измерения из lsof -i .

Собирайте эти данные каждую минуту, пока ваше приложение перемещается через пиковую нагрузку, и из этих данных вы можете найти формулу, которая связывает количество подключений к использованию ОЗУ.

Конечно, есть намного больше вещей, которые вы могли бы измерить, в частности, вы могли бы измерить использование ОЗУ ядра, хотя структуры данных tcp должны быть предсказуемыми и вычисляемыми заранее. В любом случае, посмотрите на этот вопрос https://serverfault.com/questions/10852/what-limits-the-maximum-number-of-connections-on-a-linux-server для получения дополнительной информации о настройке TCP и как получить четкое представление о том, что происходит в сетевом стеке.

tcp_mem более важен, поскольку он определяет, как должен выглядеть стек tcp, когда дело доходит до использования памяти. Буфер отправки и приема IMO должен быть кратным tcp_mem. Вот ссылка на формулу для буфера приема: http://www.acc.umu.se/~maswan/linux-netperf.txt . Вкратце:

Накладные расходы: window / 2 ^ tcp_adv_win_scale (tcp_adv_win_scale по умолчанию равно 2) Так что для параметров linux по умолчанию для получающего окна (tcp_rmem): 87380 – (87380/2 ^ 2) = 65536. С учетом трансатлантической связи (150 мс RTT) максимальная производительность заканчивается: 65536 / 0.150 = 436906 байт / с или около 400 кбайт / с, что сегодня очень медленно. С увеличенным размером по умолчанию: (873800 – 873800/2 ^ 2) /0.150 = 4369000 байт / с или около 4 Мбайт / с, что является резонансным для современной сети. И обратите внимание, что это значение по умолчанию, если отправитель настроен с большим размером окна, он будет с радостью масштабироваться до 10 раз (8738000 * 0,75 / 0,150 = ~ 40 Мбайт / с), что очень хорошо для современной сети.

Вот что говорится в статье о tcp_mem:

То, что вы удаляете, является искусственным ограничением производительности tcp, без этого ограничения вы ограничены доступной сквозной пропускной способностью и потерями. Таким образом, вы можете в конечном итоге насытить ваш восходящий канал более эффективно, но tcp хорошо справляется с этим.

IMO большее среднее значение tcp_mem ускоряет соединение при потере меньшей безопасности и немного увеличивает объем использования памяти.

Вы можете контролировать сетевой стек:

 grep skbuff /proc/slabinfo 

Дэвид дал очень хороший ответ на заданный вопрос, однако, если вы не используете только LFN , то даже на сервере, основанном на событиях, буферы TCP, вероятно, будут лишь малой частью рабочего пространства.

Для планирования емкости нет никакой замены для тестирования сервера и расчета регрессии использования памяти по нагрузке.