Ответ
Ошибка EMFILE (Too many open files) возникает, когда процесс превышает лимит на количество одновременно открытых файловых дескрипторов. В Linux всё является файлом: сетевые сокеты, пайпы, реальные файлы, устройства — все они используют дескрипторы.
Основные причины в DevOps-контексте:
- Утечка дескрипторов: Сервис (например, веб-сервер или контейнер) не закрывает соединения или файлы после использования.
- Недостаточный лимит: Лимиты по умолчанию (
ulimit -n= 1024) малы для высоконагруженных приложений (базы данных, прокси, API-гейтвеи). - Растущая нагрузка: Внезапный всплеск трафика может исчерпать лимит.
Диагностика и решение:
-
Найти проблемный процесс и проверить его лимиты:
# Узнать PID процесса (например, nginx) pid=$(pgrep nginx | head -1) # Посмотреть текущее количество открытых дескрипторов ls -l /proc/$pid/fd | wc -l # Посмотреть лимиты для процесса cat /proc/$pid/limits | grep "open files" -
Повысить лимиты:
- Временное решение для сессии:
ulimit -n 65535 - Постоянное решение через systemd (для сервиса):
# /etc/systemd/system/your-service.service.d/limits.conf [Service] LimitNOFILE=65535 - Глобальное решение для системы: Изменить
/etc/security/limits.confи перелогиниться.
- Временное решение для сессии:
-
Проверить системный максимум:
cat /proc/sys/fs/file-max # Если нужно увеличить (временно) sysctl -w fs.file-max=2097152
Профилактика: Мониторинг метрик open_fds и max_fds (например, в Prometheus через node_exporter) для ключевых сервисов.