Как диагностировать большое количество соединений TIME_WAIT

У нас есть производственная проблема только с одним из наших серверов, и мы связали медленную производительность с обилием сокетов в TIME_WAIT государство. Без рисования этого вопроса в огромной предыстории, мы в основном знаем, что каждый раз, когда сервер работает медленно, около 80% сокетов сервера находятся в этом TIME_WAIT состояние, которое, конечно, мы видим, запустив netstat). В частности, потому что TIME_WAIT когда наш сервер работает медленно, мы видим эти TIME_WAITs очень часто (около 5 - 10 минут).

Я немного покопался и увидел, что TIME_WAITЭто происходит, когда сервер закрывает активное соединение, но сохраняет его на случай, если поступят задержанные пакеты. В конце концов TIME_WAIT время вышло.

В любом случае, чтобы точно понять, почему отдельный разъем вошел в TIME_WAIT государство для начала? Это CentOS 5 - Linux регистрирует эту информацию в var/logs в любом месте, или есть ли способ сделать tcpdump и искать конкретный шаблон, который приводит к TIME_WAIT? Заранее спасибо.

2 ответа

Решение

Краткий ответ - это связано с приложением. Приложение на короткое время создает сокеты, закрывает их, а затем сразу же необходимо открыть еще один сокет. Вялость связана с тем, что процессам не хватает сокетов.

При создании сокета есть опции - SO_REUSEADDR и SO_REUSEPORT. Они имеют несколько схожих функций, но я подозреваю, что в Centos 5 SO_REUSEPORT не доступен. В любом случае, дополнительная настройка при вызове сокета позволяет немедленно повторно использовать порт.

Итак, обычно используемое исправление - это перекодирование. Вероятно, это сетевое приложение, которое подключается на несколько секунд, а затем завершает сеанс.

Он устанавливает свойства для сокета, после чего они разрешаются / применяются ядром.

  1. SO_REUSEADDR - это POSIX-совместимая опция при создании сокета.

http://pubs.opengroup.org/onlinepubs/009695399/functions/setsockopt.html

  1. краткий ответ - да и да. Так что, если вы делаете очень медленные соединения с одиноким удаленным офисом на медленном DSL, может быть проблема с "запоздалыми" пакетами. Но если это соединения в вашей локальной сети, вероятно, нет.

  2. Одно из ваших приложений - открывать сокеты оптом, а затем закрывать их. lsof покажет, у какого pid есть открытый сокет. Оттуда вы можете получить пользователя и то, что запускается. Это может быть что-то простое, например, скрипт оболочки bash, использующий netcat.

Итог: это либо злоупотребление сетевыми средствами, либо проблема с кодом. И у вас есть сетевое приложение - оно пожирает вашу систему. Мое определение сетевого приложения означает "использование сокетов TCP/UDP". Не обязательно веб-сервер.

Другие вопросы по тегам