Вопрос: Что ограничивает максимальное количество подключений на сервере Linux?


Какой параметр ядра или другие параметры управляют максимальным количеством сокетов TCP, которые могут быть открыты на сервере Linux? Каковы компромиссы, позволяющие устанавливать больше соединений?

Я заметил, что при загрузке сервера Apache аб что довольно легко максимизировать открытые соединения на сервере. Если вы оставите опцию -k ab, которая позволяет повторно использовать повторное использование и отправить более 10 000 запросов, Apache обслуживает первые 11 000 запросов, а затем останавливается на 60 секунд. Взгляд на вывод netstat показывает 11 000 соединений в состоянии TIME_WAIT. По-видимому, это нормально. Соединения остаются открытыми по умолчанию 60 секунд даже после того, как клиент будет с ними работать Причины надежности TCP,

Похоже, что это был бы простой способ для DoS-сервера, и мне интересно, какие обычные настройки и меры предосторожности для него есть.

Вот мой тестовый результат:

# ab -c 5 -n 50000 http://localhost/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 5000 requests
Completed 10000 requests
apr_poll: The timeout specified has expired (70007)
Total of 11655 requests completed

Вот команда netstat, которую я запускаю во время теста:

 # netstat --inet -p | grep "localhost:www" | sed -e 's/ \+/ /g' | cut -d' ' -f 1-4,6-7 | sort | uniq -c 
  11651 tcp 0 0 localhost:www TIME_WAIT -
      1 tcp 0 1 localhost:44423 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44424 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44425 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44426 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44428 SYN_SENT 7831/ab

85
2018-05-21 16:18


Источник




Ответы:


Я наконец нашел настройку, которая действительно ограничивала количество подключений: net.ipv4.netfilter.ip_conntrack_max, Это было установлено в 11,776, и все, что я установил, это количество запросов, которые я могу подавать в своем тесте, прежде чем ждать tcp_fin_timeout секунд для получения дополнительных подключений. conntrack table - это то, что ядро ​​использует для отслеживания состояния соединений, поэтому, когда оно заполнено, ядро ​​начинает отбрасывать пакеты и печатать их в журнале:

Jun  2 20:39:14 XXXX-XXX kernel: ip_conntrack: table full, dropping packet.

Следующим шагом было заставить ядро ​​переработать все эти соединения в TIME_WAIT а не удалять пакеты. Я мог бы добиться, чтобы это произошло, включив tcp_tw_recycle или увеличение ip_conntrack_max быть больше, чем количество локальных портов, доступных для соединений по ip_local_port_range, Я думаю, как только ядро ​​выходит из локальных портов, он начинает перерабатывать соединения. Это использует больше соединений для отслеживания памяти, но похоже, что это лучшее решение, чем включение tcp_tw_recycle поскольку документы подразумевают, что это опасно.

С этой конфигурацией я могу работать ab весь день и никогда не кончаться соединениями:

net.ipv4.netfilter.ip_conntrack_max = 32768
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_fin_timeout = 25
net.ipv4.tcp_max_orphans = 8192
net.ipv4.ip_local_port_range = 32768    61000

tcp_max_orphans настройка не повлияла на мои тесты, и я не знаю почему. Я бы подумал, что это закроет связи в TIME_WAIT когда их было 8192, но это не для меня.


62
2018-06-03 16:02



Где мы настраиваем эти параметры? - Codevalley
@Codevalley Это может быть зависящим от системы, но на сервере Ubuntu они идут в /etc/sysctl.conf - Ben Williams


Вы действительно хотите посмотреть на то, что файловая система / proc может предложить вам в этом отношении.

На этой последней странице вам могут быть интересны следующие вопросы:

  • / Труды / системы / нетто / ipv4 / tcp_max_orphans, который контролирует максимальное количество сокетов, удерживаемых системой не привязан к чему-то. Повышение этого может потреблять до 64 кбайт незаменяемой памяти на сироту,
  • / Труды / системы / нетто / ipv4 / tcp_orphan_retries, который контролирует количество попыток до того, как сокет станет сиротой и закрыт. На этой странице есть отдельная заметка о веб-серверах, которые представляют для вас прямой интерес ...

23
2018-05-21 18:15



tcp_max_orphans интересен, но кажется, что он не работает. Когда я пытаюсь измерить осиротевшие сокеты во время моего теста, я вижу 11 651 из них, а tcp_max_orphans - 8 092. # netstat --inet -p | grep "localhost: www" | sed -e 's / \ + / / g' | cut -d '' -f 1-4,6-7 | сортировать | uniq -c 11651 tcp 0 0 localhost: www TIME_WAIT - - Ben Williams
Посмотрите на настройку tcp_orphan_retries - идея состоит в том, что сокеты «отбракованы» быстрее ... - Avery Payne
Предложение @Jauder Ho's + tcp_orphan_retries звучит как потенциальная победа для вашей ситуации. - Avery Payne


Я не думаю, что есть возможность настроить это непосредственно. Это относится к категории настройки TCP / IP. Чтобы узнать, что вы можете настроить, попробуйте «man 7 tcp». Для их установки используется sysctl ('man 8 sysctl'). 'sysctl -a | grep tcp 'покажет вам большую часть того, что вы можете настроить, но я не уверен, покажет ли он все из них. Кроме того, если это не изменилось, открываются сокеты TCP / IP, как файловые дескрипторы. Так это и следующий раздел этой ссылки может быть тем, что вы ищете.


3
2018-05-21 17:31





Попробуйте также установить следующую настройку tcp_fin_timeout. Это должно закрыть TIME_WAIT быстрее.

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

2
2018-05-21 19:38



Осторожно! Испытывал трудный путь. «Это может привести к сбросу кадров с балансировкой нагрузки и NAT, использовать это только для сервера, который обменивается данными только через вашу локальную сеть». - wiki.archlinux.org/index.php/Sysctl - Henk
@Henk Я думаю, это tcp_tw_recycle это потенциально опасно. tcp_tw_reuse безопаснее, и я не вижу причин использовать их одновременно. - Vladislav Rastrusny


Запасы apache (1) использовались заранее, чтобы поддерживать только 250 одновременных подключений. Если вам нужно больше, для изменения количества одновременных сеансов необходимо было изменить один файл заголовка. Я не знаю, верно ли это с Apache 2.

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

Обратите внимание на настройки своего работника и какие таймауты, которые у вас есть внутри самого Apache, сколько у вас запасных серверов сразу, и как быстро эти дополнительные процессы становятся убитыми.


2
2018-05-21 21:21





Вы можете сократить время, потраченное в состоянии TIME_WAIT (Установить net.ipv4.tcp_fin_timeout). Вы можете заменить Apache на YAWS или nginx или что-то подобное.

Компромиссы большего количества соединений обычно связаны с использованием памяти, и если у вас есть процесс forking, много дочерних процессов, которые загружают ваш процессор.


1
2018-05-21 16:26



tcp_fin_timeout не предназначен для истечения срока действия TIME-WAIT, который не может быть изменен за пределами восстановления ядра, но для FIN, как указано в названии. - Alexandr Kurilin


Абсолютное количество сокетов, которые могут быть открыты на одном IP-адресе, составляет 2 ^ 16 и определяется TCP / UDP, а не ядром.


0
2018-05-30 16:42



Нет, это не так. Вы можете открыть больше, так как локальный порт не должен быть уникальным, если удаленные адреса отличаются. Более того, OP говорит на сервере, и вы можете иметь> 1 адрес на сервер. - MarkR


Инструмент бенчмаркинга HTTP-сервера Apache, аб, в версии 2.4 тайм-аут вариант. Смотрите также Ошибка ab (Apache Bench): apr_poll: указанный тайм-аут истек (70007) в Windows,

Этот вариант решает вашу проблему.


0
2018-02-08 17:56