Установка net.core.somaxconn
более высоких значений необходима только на высоконагруженных серверах, где скорость нового соединения настолько высока / прерывистая, что наличие 128 (на 50% больше в BSD: 128 backlog
+ 64 half-open
) еще не принятых соединений считается нормальным. Или когда вам нужно делегировать определение «обычного» для самого приложения.
Некоторые администраторы используют высокий уровень, net.core.somaxconn
чтобы скрыть проблемы со своими службами, поэтому с точки зрения процесса пользователя это будет выглядеть как всплеск задержки вместо прерывания соединения / тайм-аута (управляется net.ipv4.tcp_abort_on_overflow
в Linux).
listen(2)
Руководство говорит - net.core.somaxconn
действует только верхняя граница для приложения, которое может свободно выбирать что-то меньшее (обычно устанавливается в конфиге приложения). Хотя некоторые приложения просто используют, listen(fd, -1)
что означает установить отставание до максимального значения, разрешенного системой.
Реальная причина - либо низкая скорость обработки (например, однопоточный блокирующий сервер), либо недостаточное количество рабочих потоков / процессов (например, многопроцессорная / многопоточная блокирующая программа типа apache
/ tomcat
)
PS. Иногда желательно не в состоянии быстро и позволить балансировки нагрузки , чтобы сделать его работу (повторные попытки) , чем сделать пользователь засаду - для этой цели мы устанавливаем net.core.somaxconn
любое значение, и ограничить применение накопившегося к , например , 10
и набор net.ipv4.tcp_abort_on_overflow
1.
PPS. В старых версиях ядра Linux есть неприятная ошибка усечения somaxcon
значения до 16 младших битов (т.е. приведения значения к uint16_t
), поэтому повышение этого значения до большего, чем 65535
может быть даже опасно. Для получения дополнительной информации см .: http://patchwork.ozlabs.org/patch/255460/
Если вы хотите получить более подробную информацию обо всех внутренних компонентах бэклога в Linux, не стесняйтесь читать:
Как работает бэклог TCP в Linux .