Как исправить ошибку "Too Many Open Files" в Linux

Linux Logo System

Иногда пользователи могут столкнуться с ошибкой "Too Many Open Files", что может привести к сбоям в работе системы или даже ее остановке. В этой статье мы рассмотрим причины возникновения этой ошибки, а также способы ее исправления и оптимизации в Linux системах.

В этой статье мы рассмотрим, как проверить текущие ограничения на максимальное количество открытых файлов в Linux, а также как изменить эту настройку глобально для всего сервера, для отдельных служб и для пользовательской сессии. Статья применима к большинству современных дистрибутивов Linux (Debian, Ubuntu, CentOS, RHEL, Oracle Linux, Rocky и т.д.).

Причины ошибки "Too Many Open Files"

Ошибка "Too Many Open Files" возникает, когда количество открытых файлов в системе превышает максимальное количество, которое система может обработать. Это может быть вызвано различными факторами, такими как:

  1. Неправильное использование файловых дескрипторов: Если пользователь использует слишком много файловых дескрипторов одновременно, это может привести к переполнению счетчика открытых файлов.
  2. Неосторожное использование инструментов командной строки: Некоторые инструменты командной строки, такие как "ls" или "mkdir", могут открывать множество файлов, что может вызвать переполнение счетчика.
  3. Чрезмерное использование библиотек или модулей: Некоторые библиотеки или модули могут автоматически открывать файлы, что также может привести к перегрузке системы.
  4. Проблемы с процессами или потоками: Неправильная работа процессов или потоков может привести к тому, что они будут продолжать открывать файлы после завершения работы, что приведет к перегрузке.

Ошибка 'Too Many Open Files' и лимит открытых файлов в Linux

Прежде всего, давайте посмотрим, где возникает ошибка "слишком много открытых файлов". Чаще всего она возникает на серверах с установленным веб-сервером Nginx /httpd или сервером баз данных под управлением MySQL/MariaDB/PostgreSQL при чтении большого количества лог-файлов. Например, когда Nginx превысит лимит открытых файлов, вы увидите ошибку:

или

С помощью этой команды можно получить максимальное количество файловых дескрипторов, которые может открыть система:

Чтобы узнать, сколько файлов открыто в данный момент, выполните команду:

Где:

  • 8928 - общее количество открытых файлов
  • 0  - количество открытых файлов, которые в данный момент не используются
  • 518144 - максимальное количество разрешенных к открытию файлов.

В Linux ограничение максимального количества открытых файлов можно настроить на нескольких уровнях:

  • Ядро ОС
  • Сервис
  • Пользователь

Чтобы отобразить текущее ограничение на количество открытых файлов в ядре Linux, выполните команду:

fs.file-max в ядре linuxВыведем ограничение на количество открытых файлов для одного процесса текущего пользователя:

По умолчанию количество файлов для одного процесса этого ограничено 1024.

Выведем максимальное количество для одного пользователя (max user processes):

ulimit

Умножив 1024 * 47924, получим 49 074 176  - это максимальное количество открытых файлов всеми пользовательскими процессами.

Существует два типа ограничений на количество открытых файлов: Жесткие и Мягкие. Мягкие ограничения носят рекомендательный характер. Если количество открытых файлов превысило жесткий лимит, то пользователь не сможет открывать новые файлы до тех пор, пока не будут закрыты ранее открытые.

Для просмотра текущих ограничений используйте команду ulimit с опцией -S (soft) или -H (hard) и опцией -n (максимальное количество открытых файловых дескрипторов).

Для отображения мягкого лимита выполните следующую команду:

Для отображения значения жесткого предела:

ulimit max открытые файлы

Как увеличить ограничение на максимальное количество открытых файлов в Linux?

Чтобы разрешить всем службам открывать большое количество файлов, можно изменить лимиты в ОС Linux. Чтобы сделать новые настройки постоянными и предотвратить их сброс после перезапуска сервера или сеанса, необходимо внести изменения в файл /etc/security/limits.conf. Этот файл позволяет ограничить количество различных системных ресурсов, доступных пользовательскому процессу. Используйте следующий формат:

Например:

Вместо имени пользователя можно использовать *. Это означает, что данное ограничение открытых файлов будет применяться ко всем пользователям Linux:

Например, вы получили ошибку слишком большого количества открытых файлов для Nginx. Проверьте, сколько файлов разрешено открывать этому пользовательскому процессу:

Для высоконагруженного сервера этого недостаточно. Добавьте следующие строки в файл /etc/security/limits.conf:

На старых ядрах Linux значение параметра fs.file-max может быть установлено на 10000. Поэтому проверьте это значение и увеличьте его так, чтобы оно было больше, чем число в файле limits.conf:

Это временно увеличит лимит открытых файлов. Чтобы сделать новые настройки постоянными, необходимо добавить в файл /etc/sysctl.conf следующую строку:

И применить ее:

Убедитесь, что в файле /etc/pam.d/common-session (Debian/Ubuntu) или /etc/pam.d/login (CentOS/RedHat/Fedora) присутствует строка:

Если это не так, добавьте ее в конец конфигурационного файла. Этот параметр позволяет применять ограничения на открытые файлы после аутентификации пользователя.

После внесения изменений снова откройте консоль и проверьте значение max_open_files:

Увеличение максимального количества открытых файловых дескрипторов для каждой службы

Вы можете увеличить максимальное количество открытых файловых дескрипторов для конкретного сервиса, а не для всей операционной системы. В качестве примера возьмем apache.

Откройте настройки службы с помощью systemctl:

Добавьте нужные ограничения, например:

После внесения изменений обновите конфигурацию службы и перезапустите ее:

Чтобы проверить, изменились ли значения, получите PID службы:

systemctl status httpd.service

Например, PID службы равен 3869704:

Значение должно быть равно 10000. Таким образом, вы изменили значение Max open files для конкретного сервиса.

Изменение лимита открытых файлов для текущего сеанса пользователя

Чтобы изменить максимальный лимит открытых файлов для текущей сессии пользователя, выполните следующую команду:

Если указать здесь значение, превышающее заданное в жестком ограничении, то возникнет ошибка:

После закрытия сессии и открытия новой лимиты вернутся к исходным значениям, указанным в файле /etc/security/limits.conf.

Заключение

Ошибку "Too Many Open Files" можно исправить и оптимизировать в Linux системах, используя различные методы. Важно понимать причины возникновения ошибки и принимать меры для ее устранения. Правильное использование инструментов и оптимизация открытых файлов позволят избежать проблем с перегрузкой системы и обеспечить ее эффективную работу.

Avatar for Gnostis
Gnostis
Добавить комментарий