Запуск lsof -i показывает много соединений в CLOSE_WAIT? Должен ли я беспокоиться

7

Таким образом, я lsof -i | wc -lпериодически бегаю, и это говорит мне, что из 420 линий между 240 и 255 находятся в CLOSE_WAITсостоянии. Как TCP-соединения входят в это состояние?

Должен ли я волноваться и как мне это устранить?

user20414
источник

Ответы:

12

(Я собирался отредактировать ответ mikegrb, но решил, что перебил его слишком много)

CLOSE_WAIT в значительной степени означает именно то, что говорит - ядро ​​ждет, пока локальный процесс закроет свой файловый дескриптор, прежде чем удалить запись. TCP-соединение полностью разорвано, и на дальнем конце может сложиться впечатление, что соединение конечно, но ваш конец держится за вещи.

Единственная проблема заключается в том, что многие записи CLOSE_WAIT потребляют память ядра и записи таблицы дескрипторов файлов, что может быть проблемой, если их много. Если записи, которые вы просматриваете, являются временными, то, вероятно, вы просто много перебираетеTCP-подключений, и вы видите небольшую их часть за небольшой промежуток времени между моментом, когда соединение закрыто, и процесс доходит до закрытия файлового дескриптора. С другой стороны, если они постоянны (порты и IP-адреса не меняются с течением времени), то что-то вызывает утечку дескрипторов, и это нужно исправить, чтобы оно всегда закрывало свои fds после завершения работы с ними. Как сказал mikegrb, более новая версия, возможно, уже устранила проблему, поэтому вопрос в соответствующем списке рассылки или изучение списков изменений, вероятно, оправдан.

romble
источник
Использует ли TCP-соединение в CLOSE_WAIT файловые дескрипторы? Потому что вчера я получил исключение Socket «Слишком много открытых файлов».
user20414 17.09.09
2
Да, записи CLOSE_WAIT являются дескрипторами открытых файлов.
Уомбл
2

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

Если у вас есть много соединений в CLOSE_WAIT, это означает, что ответственный процесс не закрывает сокет после входа в CLOSE_WAIT. Вы можете использовать tcpdump или другие инструменты захвата сетевого трафика для просмотра пакетов.

Также взгляните на ответственный процесс. Из любопытства, что является ответственным процессом? Возможно, имеется более новая исправленная версия или пришло время подать отчет об ошибке;)

mikegrb
источник
Apache Tomcat 5.5.27
user20414
0

если вы работаете в слабой сети, вы можете настроить:

  • Максимальное количество файловых дескрипторов через ulimitsи через /proc(для всей системы)
  • Вы можете сократить время ожидания TCP через /proc
jscott
источник
0

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

Майкл Манси
источник