Короткий ответ
Ошибка означает, что процесс исчерпал лимит на количество одновременно открытых файловых дескрипторов (soft limit ulimit -n); диагностируют через просмотр текущего лимита процесса (/proc/PID/limits) и количества реально открытых дескрипторов (lsof -p PID | wc -l или ls /proc/PID/fd | wc -l), после чего либо увеличивают лимит, либо устраняют утечку дескрипторов в приложении.
Как это работает подробнее
У каждого процесса есть soft- и hard-лимит на число открытых файловых дескрипторов, унаследованный от родительского процесса (shell, systemd, контейнерный рантайм) в момент запуска; если приложение открывает файлы/сокеты быстрее, чем закрывает (например, не закрывает соединения с клиентами или не освобождает файловые хендлы в цикле), оно рано или поздно упрётся в лимит независимо от того, насколько он большой.
Пример кода
cat /proc/4321/limits | grep "Max open files"
ls /proc/4321/fd | wc -lЧто использовать на практике
- Практика. нужно отличать две разные причины: заниженный системный/юнит-лимит для нормально работающего приложения (решается увеличением LimitNOFILE в unit-файле systemd или в /etc/security/limits.conf для обычных процессов) и реальную утечку дескрипторов в коде (решается только исправлением приложения, увеличение лимита лишь отодвигает момент падения).
Подводные камни
- Риск. Частая ошибка — слепо увеличивать лимит до очень большого значения как «решение проблемы», не проверив через lsof, растёт ли число открытых дескрипторов во времени без возврата к базовому уровню — это явный признак утечки, а не нехватки лимита.