Too many open files без открытых документов: как сокеты съедают лимит процесса

verin_is 45 минут назад Краткое содержание статьи Too many open files без открытых документов: как сокеты съедают лимит процесса Простой 4 мин 908 Python * Linux * Настройка Linux * DevOps * Системное администрирование...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Вот важная новость с фронта ИИ: verin_is 45 минут назад Краткое содержание статьи Too many open files без открытых документов: как сокеты съедают лимит процесса Простой 4 мин 908 Python * Linux * Настройка Linux * DevOps * Системное администрирование * Сервис перестал принимать клиентов. В журнале - Too many open files. Больших логов нет, каталоги с данными выглядят нормально, а ulimit -n в вашей консоли показывает огромный запас.
Откуда взялись «слишком многие файлы»? У этой ошибки есть языковая ловушка: слово files заставляет искать обычные файлы на диске. Но сокет тоже занимает файловый дескриптор.
Технические детали
Сервис может упереться в лимит, создавая только сокеты - даже без подключения к удалённому серверу. Ниже я воспроизведу именно это, затем подниму лимит и получу ту же ошибку повторно. Поставим маленький предел одному процессуДля эксперимента достаточно Linux и Python.
Отдельному дочернему процессу задаю soft limit RLIMIT_NOFILE=64 и hard limit 256. Родитель сохраняет свой исходный лимит. Дочерний процесс создаёт TCP-сокеты и удерживает ссылки на все объекты, поэтому они остаются открытыми.
Он не вызывает bind(), listen() или connect() - сетевого обмена здесь вообще нет. В этом запуске у родителя:$ ulimit -n 1048576А у дочернего процесса, которого я собираюсь сломать:Max open files 64 256 filesЭто строка из его /proc/PID/limits. После накопления сокетов следующий socket() возвращает: Too many open filesВ /proc/PID/fd насчитывается 64 записи.
Отраслевые последствия
Из них 61 - ссылки вида socket:, ещё три - стандартные потоки ввода и вывода. Обычных пользовательских файлов процесс для этого не открывал. Ниже - настоящий снимок xterm с этим запуском и дальнейшими проверками.
Важная точность: RLIMIT_NOFILE ограничивает допустимый номер нового дескриптора - он должен быть меньше лимита. На нашем стенде номера заняты подряд от 0 до 63, поэтому в момент отказа видны ровно 64 открытых дескриптора. Для произвольного процесса число записей и границу допустимых номеров не всегда можно отождествлять.
Что скрывается за словом filesФайловый дескриптор - небольшой целый номер, через который процесс обращается к открытому ресурсу. В этой таблице живут обычные файлы, сокеты, каналы и другие объекты. Для сетевого сервиса это меняет направление диагностики.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





