
Во многих руководствах по настройке TCP/IP и Web рекомендуется увеличить максимальное количество дескрипторов файлов при возникновении ошибки «Слишком много открытых файлов».
но я не вижу TIME_WAIT в выводе "lsof -i"
Кто-нибудь знает, что TIME_WAIT использует файловые дескрипторы? или нет
решение1
Файловый дескриптор используется приложением для чтения/записи из сокета. Таким образом, если приложение вызывает close(), файловый дескриптор немедленно освобождается.
С другой стороны, если приложение вызовет shutdown(), дескриптор файла останется эффективным, так что приложение по-прежнему сможет выполнять чтение/запись из/в сокет.
Цитаты изhttps://oroboro.com/file-handle-leaks-server/:
Миф: Сокеты в TCP TIME_WAIT удерживают дескрипторы файлов. Заложник
Когда вы закрываете сокет TCP/IP, операционная система не освобождает сокет сразу. По сложным причинам структура сокета должна быть выведена из обращения на несколько минут, поскольку существует небольшая вероятность того, что пакет IP может поступить на этот сокет после его закрытия. Если операционная система повторно использовала сокет, то сеанс нового пользователя этого соединения будет затронут чьими-то потерянными пакетами.
Но это не удерживает дескриптор файла открытым. Когда вы закрываете дескриптор файла сокета, сам дескриптор файла закрывается. Вы не получите ошибку «Слишком много файлов открыто». Если у вас открыто слишком много сокетов, ваш сервер может перестать принимать новые соединения. Есть способы справиться с этим (разрешить повторное использование сокетов или снизить TCP TIME_WAIT), но увеличение лимита дескриптора файла не входит в их число.
Миф: Для освобождения дескрипторов файлов требуется время
Это связано с мифом TCP TIME_WAIT. Ошибочное мнение, что когда вы закрываете дескриптор файла, вы должны подождать некоторое время, пока операционная система освободит дескриптор.
Закрытие дескриптора файла вызовет любой метод ОС, освобождающий ресурс, и ОС освободит этот ресурс немедленно или иногда позже, как в случае с сокетами, но close() немедленно освободит дескриптор файла в таблице дескрипторов файла. Ваш процесс полностью контролирует свою таблицу дескрипторов файла и не должен ждать чего-либо, чтобы освободить слот в своей собственной таблице дескрипторов файла.
решение2
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
Как всегда, если у вас есть возможность, проверьте их заранее.