Как диагностировать большое количество соединений TIME_WAIT
У нас есть производственная проблема только с одним из наших серверов, и мы связали медленную производительность с обилием сокетов в TIME_WAIT
государство. Без рисования этого вопроса в огромной предыстории, мы в основном знаем, что каждый раз, когда сервер работает медленно, около 80% сокетов сервера находятся в этом TIME_WAIT
состояние, которое, конечно, мы видим, запустив netstat
). В частности, потому что TIME_WAIT
когда наш сервер работает медленно, мы видим эти TIME_WAIT
s очень часто (около 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 не доступен. В любом случае, дополнительная настройка при вызове сокета позволяет немедленно повторно использовать порт.
Итак, обычно используемое исправление - это перекодирование. Вероятно, это сетевое приложение, которое подключается на несколько секунд, а затем завершает сеанс.
Он устанавливает свойства для сокета, после чего они разрешаются / применяются ядром.
- SO_REUSEADDR - это POSIX-совместимая опция при создании сокета.
http://pubs.opengroup.org/onlinepubs/009695399/functions/setsockopt.html
краткий ответ - да и да. Так что, если вы делаете очень медленные соединения с одиноким удаленным офисом на медленном DSL, может быть проблема с "запоздалыми" пакетами. Но если это соединения в вашей локальной сети, вероятно, нет.
Одно из ваших приложений - открывать сокеты оптом, а затем закрывать их. lsof покажет, у какого pid есть открытый сокет. Оттуда вы можете получить пользователя и то, что запускается. Это может быть что-то простое, например, скрипт оболочки bash, использующий netcat.
Итог: это либо злоупотребление сетевыми средствами, либо проблема с кодом. И у вас есть сетевое приложение - оно пожирает вашу систему. Мое определение сетевого приложения означает "использование сокетов TCP/UDP". Не обязательно веб-сервер.