Встановлення 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 .