Итак, я бегу lsof -i | wc -l
периодически и он сообщает мне, что из 420 строк от 240 до 255 находятся в CLOSE_WAIT
штат. Как TCP-соединения входят в это состояние?
Стоит ли беспокоиться и как мне это устранить?
(Я собирался отредактировать ответ mikegrb, но решил, что слишком сильно его забивал)
CLOSE_WAIT в значительной степени означает то, что он говорит - ядро ожидает, пока локальный процесс закроет его файловый дескриптор, прежде чем удалить запись. TCP-соединение было полностью разорвано, и на дальнем конце может сложиться впечатление, что соединение конечно, но ваш конец цепляется за вещи.
Единственная проблема заключается в том, что многие записи CLOSE_WAIT потребляют память ядра и записи таблицы файловых дескрипторов, что может быть проблемой, если их много. Если записи, которые вы просматриваете, временны, то, вероятно, вы просто проходите через много TCP-соединений, и вы видите небольшую их часть за небольшой промежуток времени между закрытием соединения и завершением процесса до закрытия дескриптора файла. С другой стороны, если они постоянные (порты и IP-адреса не меняются с течением времени), то что-то дает утечку дескрипторов, и это необходимо исправить, чтобы он всегда закрывал свои fds по завершении работы с ними. Как сказал mikegrb, более новая версия, возможно, уже устранила проблему, поэтому, вероятно, стоит задать вопрос по соответствующему списку рассылки или изучить журналы изменений.
Состояние CLOSE_WAIT означает, что другой конец отправил сегмент FIN, чтобы закрыть соединение. Связь все еще вроде установлена. Это режим, который можно представить себе как полудуплекс, позволяющий этому концу очищать любые буферы, посылая последние биты данных на конец, запрашивая закрытие соединения перед закрытием соединения с этого конца.
Если у вас много подключений, находящихся в CLOSE_WAIT, это означает, что ответственный процесс не закрывает сокет, когда он переходит в CLOSE_WAIT. Вы можете использовать tcpdump или другие инструменты захвата сетевого трафика, чтобы просмотреть пакеты.
Также обратите внимание на ответственный процесс. Из любопытства, каков ответственный процесс? Возможно, у него есть более новая исправленная версия или, может быть, пришло время отправить отчет об ошибке;)
Вероятно, вы не закрываете ресурс (дескриптор файла, сетевое соединение) где-то в приложении, работающем на сервере.
если вы работаете в слабой сети, вы можете настроить:
ulimits
и через /proc
(в масштабе системы)/proc