Что такое ошибка ‘too many open files’ в Linux?

«Что такое ошибка ‘too many open files’ в Linux?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ошибка EMFILE (Too many open files) возникает, когда процесс превышает лимит на количество одновременно открытых файловых дескрипторов. В Linux всё является файлом: сетевые сокеты, пайпы, реальные файлы, устройства — все они используют дескрипторы.

Основные причины в DevOps-контексте:

  • Утечка дескрипторов: Сервис (например, веб-сервер или контейнер) не закрывает соединения или файлы после использования.
  • Недостаточный лимит: Лимиты по умолчанию (ulimit -n = 1024) малы для высоконагруженных приложений (базы данных, прокси, API-гейтвеи).
  • Растущая нагрузка: Внезапный всплеск трафика может исчерпать лимит.

Диагностика и решение:

  1. Найти проблемный процесс и проверить его лимиты:

    # Узнать PID процесса (например, nginx)
    pid=$(pgrep nginx | head -1)
    # Посмотреть текущее количество открытых дескрипторов
    ls -l /proc/$pid/fd | wc -l
    # Посмотреть лимиты для процесса
    cat /proc/$pid/limits | grep "open files"
  2. Повысить лимиты:

    • Временное решение для сессии: ulimit -n 65535
    • Постоянное решение через systemd (для сервиса):
      # /etc/systemd/system/your-service.service.d/limits.conf
      [Service]
      LimitNOFILE=65535
    • Глобальное решение для системы: Изменить /etc/security/limits.conf и перелогиниться.
  3. Проверить системный максимум:

    cat /proc/sys/fs/file-max
    # Если нужно увеличить (временно)
    sysctl -w fs.file-max=2097152

Профилактика: Мониторинг метрик open_fds и max_fds (например, в Prometheus через node_exporter) для ключевых сервисов.