Во многих руководствах по настройке TCPIP и Web рекомендуется увеличить максимальное количество дескрипторов файлов при появлении ошибки «Слишком много открытых файлов».
но я не вижу TIME_WAIT в выводах "lsof -i"
Кто-нибудь знает, что TIME_WAIT потребляет файловые дескрипторы? или не
Дескриптор файла используется приложением для чтения / записи из сокета. Таким образом, если приложение вызывает close (), дескриптор файла немедленно освобождается.
С другой стороны, если приложение вызывает shutdown (), файловый дескриптор останется действующим, так что приложение все еще сможет читать / писать из / в сокет.
Цитаты из https://oroboro.com/file-handle-leaks-server/:
Миф: сокеты в TCP TIME_WAIT содержат файловые дескрипторы Hostage
Когда вы закрываете сокет TCP / IP, операционная система не освобождает сокет сразу. По сложным причинам структура сокета должна оставаться вне обращения в течение нескольких минут, потому что существует небольшая вероятность того, что IP-пакет может прибыть в этот сокет после того, как он был закрыт. Если операционная система повторно использовала сокет, то на сеанс нового пользователя этого соединения повлияли бы чьи-то потерянные пакеты.
Но это не держит дескриптор файла открытым. Когда вы закрываете файловый дескриптор сокета, закрывается сам файловый дескриптор. Вы не получите сообщение об ошибке «Открыто слишком много файлов». Если у вас открыто слишком много сокетов, ваш сервер может перестать принимать новые подключения. Есть способы справиться с этим (разрешить повторное использование сокетов или уменьшить TCP TIME_WAIT), но повышение предела дескриптора файла не входит в их число.
Миф: для освобождения дескрипторов файлов требуется время
Это связано с мифом о TCP TIME_WAIT. Ошибочное мнение, что при закрытии дескриптора файла вы должны подождать некоторое время, пока операционная система не освободит дескриптор.
Закрытие дескриптора файла вызовет любой метод ОС, освобождающий ресурс, и ОС освободит этот ресурс либо сразу, либо позже, как в случае с сокетами, но close () немедленно освободит дескриптор файла в таблице дескрипторов файлов. Ваш процесс полностью контролирует свою таблицу дескрипторов файлов, и ему не нужно ждать, пока что-либо освободит место в его собственной таблице дескрипторов файлов.
TIME_WAIT - это состояние TCP и не требует передачи файловых дескрипторов. Однако сокеты в TIME_WAIT будут использовать дескрипторы файлов. Сокет - это файл, как и все остальное в unix. Если это Linux, вы можете настроить время истечения срока действия сокетов (сколько времени они ждут), а также включить переработку сокетов в /proc/sys/net/ipv4/
.
Вероятно, особый интерес представляют два момента:
sysctl -w net.ipv4.tcp_tw_recycle=1
sysctl -w net.ipv4.tcp_tw_reuse=1
Как всегда, по возможности проверьте их заранее.