Какова стоимость многих TIME_WAIT на стороне сервера?

Предположим, что есть клиент, который делает много короткоживущих подключений к серверу.

Если клиент закрывает соединение, в TIME_WAIT на стороне клиента будет много портов. Поскольку у клиента заканчиваются локальные порты, становится невозможным быстро выполнить новую попытку подключения.

Если сервер закрывает соединение, я увижу много TIME_WAIT s на стороне сервера. Однако это наносит какой-то вред? Клиент (или другие клиенты) может продолжать попытки подключения, так как он никогда не заканчивается из локальных портов, а количество состояний TIME_WAIT будет увеличиваться со стороны сервера. Что происходит в конце концов? Что-то плохое происходит? (замедление, крушение, сброшенные соединения и т. д.)

Обратите внимание, что мой вопрос не в том, «Какова цель TIME_WAIT ?» но «Что произойдет, если на сервере столько TIME_WAIT ?» Я уже знаю, что происходит, когда соединение закрывается в TCP / IP и почему требуется состояние TIME_WAIT . Я не пытаюсь это сделать, но просто хочу знать, в чем проблема с ним.

Проще говоря, скажем, netstat -nat | grep :8080 | grep TIME_WAIT | wc -l netstat -nat | grep :8080 | grep TIME_WAIT | wc -l netstat -nat | grep :8080 | grep TIME_WAIT | wc -l печатает 100000 . Что случилось бы? Снижается ли сеть сети O / S? Ошибка «Слишком много открытых файлов»? Или просто не о чем беспокоиться?

Каждый сокет в TIME_WAIT потребляет некоторую память в ядре, как правило, несколько меньше, чем ESTABLISHED но все еще значителен. Достаточно большое количество может вывести память ядра или, по крайней мере, ухудшить производительность, поскольку эта память может использоваться для других целей. Сокеты TIME_WAIT не содержат открытых файловых дескрипторов (при условии, что они были закрыты должным образом), поэтому вам не нужно беспокоиться об ошибке «слишком много открытых файлов».

Сокет также связывает этот конкретный IP-адрес и порт src / dst поэтому его нельзя использовать повторно в течение интервала TIME_WAIT . (Это назначенная цель состояния TIME_WAIT .) Привязка к порту обычно не является проблемой, если вам не нужно повторно подключать ее с той же парой портов. Чаще всего одна сторона будет использовать эфемерный порт, причем только одна сторона привязана к хорошо известному порту. Однако очень большое количество сокетов TIME_WAIT может вызывать эфемерное пространство порта, если вы многократно и часто подключаетесь к одному и тому же двум IP-адресам. Обратите внимание, что это влияет только на эту пару конкретных IP-адресов и не влияет на установление соединений с другими хостами.

Выводы:

Даже если сервер закрыл сокет с помощью системного вызова, его файловый дескриптор не будет выпущен, если он войдет в состояние TIME_WAIT. Дескриптор файла будет выпущен позже, когда состояние TIME_WAIT исчезнет (т.е. после 2 * MSL секунд). Поэтому слишком много TIME_WAIT, возможно, приведет к ошибке «слишком много открытых файлов» в серверном процессе.

Я считаю, что стек TCP / IP O / S был реализован с использованием надлежащей структуры данных (например, хеш-таблицы), поэтому общее количество TIME_WAIT не должно влиять на производительность стека TCP / IP O / S. Страдает только процесс (сервер), которому принадлежат сокеты в состоянии TIME_WAIT.

Каждое соединение идентифицируется кортежем (IP-адрес сервера, порт сервера, клиентский IP-адрес, порт клиента). Существенно, что соединения TIME_WAIT (независимо от того, находятся они на стороне сервера или на стороне клиента), занимают один из этих кортежей.

С TIME_WAIT s на стороне клиента легко понять, почему вы не можете подключаться больше – у вас больше нет локальных портов. Однако такая же проблема возникает и на стороне сервера – после того, как она имеет 64-килограммовые соединения в TIME_WAIT для одного клиента , он не может принимать никаких дополнительных соединений от этого клиента , поскольку он не имеет возможности рассказать о разнице между старым соединением и новое соединение – оба соединения идентифицируются одним и тем же кортежем. Сервер должен просто отправить обратно RST s на новые попытки соединения с этим клиентом в этом случае.

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

Проверьте:

 sysctl net.ipv4.netfilter.ip_conntrack_count sysctl net.ipv4.netfilter.ip_conntrack_max 

На всех кортежах src ip / port и dest ip / port вы можете иметь net.ipv4.netfilter.ip_conntrack_max в таблице отслеживания. Если этот предел ударит, вы увидите сообщение в ваших журналах «nf_conntrack: table full, dropping packet». и сервер не будет принимать новые входящие соединения, пока в таблице отслеживания не останется места.

Это ограничение может поразить вас задолго до истечения эфемерных портов.

В моем сценарии я запустил скрипт, который многократно планирует файлы, мой продукт выполняет некоторые вычисления и отправляет ответ клиенту, то есть клиент делает повторный HTTP-вызов, чтобы получить ответ каждого файла. Когда около 150 файлов запланированы, порты сокетов на моем сервере идут в состоянии time_wait, и в клиенте создается исключение, которое открывает http-соединение, т.е.

  Error : [Errno 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted 

В результате я применил приложение hanged.I не знаю, может быть threadshave в состоянии ожидания или что произошло, но мне нужно убить все процессы или перезапустить мое приложение, чтобы он снова работал.

Я попытался сократить время ожидания до 30 секунд, так как по умолчанию это 240 секунд, но это не сработало.

Таким образом, в основном общее влияние было критическим, поскольку оно делало мое приложение невосприимчивым

похоже, что сервер может просто запустить из портов для назначения для входящих соединений (на время существования существующих TIMED_WAIT) – случай атаки DOS.

Interesting Posts

Создание новой папки или файла с помощью проводника в Windows 7 не отображается в проводнике до тех пор, пока не будет нажата кнопка Обновить или F5

Почему нет возможности комбинировать псевдо-элементы / classы, относящиеся к конкретному поставщику, в один набор правил?

Как я могу получить WPF EventTrigger в триггере View, если он требует диктует базовую модель Viewmodel?

Как интерпретировать SMART-атрибуты?

Настройка переменных динамической области в AngularJs – область.

Как мы можем «восстановить» блокнот после сбоя?

Получение типа classа из строки

NSTask не собирает $ PATH из среды пользователя

Несколько параметров для селектора jQuery?

Как интерпретировать спецификацию памяти (ОЗУ)?

Как сохранить состояние при расширении UIComponentBase

Не удалось получить общесистемную электронную почту

Установите приложение Windows 8 Modern UI без Windows Store

Как использовать OpenSSL для шифрования / дешифрования файлов?

Пользовательская фильтрация на Android с помощью ArrayAdapter

Давайте будем гением компьютера.