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

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

Я заметил, что при загрузке сервера Apache с ab , что довольно легко довести до максимума открытые соединения на сервере. Если вы оставите опцию -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 голосов | спросил Ben Williams 21 Maypm09 2009, 20:18:14

8 ответов


62

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

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, но это не делает для меня.

ответил Ben Williams 3 J0000006Europe/Moscow 2009, 20:02:06
23

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

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

  • /proc /sys /net /ipv4 /tcp_max_orphans , который контролирует максимальное количество сокетов, удерживаемых система не привязана к чему-то. При подъеме это может потреблять до 64 кбайт незаменяемой памяти для сиротского сокета .
  • /proc /sys /net /ipv4 /tcp_orphan_retries , который контролирует количество попыток до того, как сокет будет осиротевших и закрытых. На этой странице есть отдельная заметка о веб-серверах, которые представляют для вас прямой интерес ...
ответил Avery Payne 21 Maypm09 2009, 22:15:59
3

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

ответил Kyle Brandt 21 Maypm09 2009, 21:31:49
2

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

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
ответил Jauder Ho 21 Maypm09 2009, 23:38:01
2

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

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

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

ответил rasjani 22 Mayam09 2009, 01:21:21
1

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

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

ответил Devdas 21 Maypm09 2009, 20:26:30
0

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

ответил Jason Tan 30 Maypm09 2009, 20:42:49
0

Средство сравнения HTTP-сервера Apache, ab , в 2.4 имеет параметр -s timeout . См. Также ошибка ab (Apache Bench): apr_poll: указанный тайм-аут истек (70007) в Windows .

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

ответил Dzwiedziu-nkg 8 FebruaryEurope/MoscowbFri, 08 Feb 2013 21:56:43 +0400000000pmFri, 08 Feb 2013 21:56:43 +040013 2013, 21:56:43

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132