Слишком много файлов в Linux: как снять ограничение и забыть об ошибке

Слишком много файлов в Linux: как снять ограничение и забыть об ошибке

Ваш сервер внезапно тормозит, а в логах появляется загадочная ошибка «too many open files». Знакомо? Это частая головная боль для администраторов, особенно при работе с базами данных вроде Elasticsearch. Система просто блокирует процесс, который пытается открыть больше файлов, чем ему позволено.

Но что это за ограничения и кто их устанавливает? В Linux для каждого пользователя и процесса существует жесткий лимит. Он не позволяет одному приложению захватить все ресурсы и обрушить систему.

Вы узнаете, как быстро проверить текущие лимиты с помощью простых команд в терминале. Мы разберемся, чем отличаются «мягкие» (soft) и «жесткие» (hard) ограничения и почему это важно.

Главное — вы научитесь гибко управлять этими настройками. Мы покажем, как увеличить лимиты глобально для всех пользователей через конфигурационный файл. А также как точечно настроить ограничения только для конкретного проблемного сервиса, например, Apache или Elasticsearch, не трогая всю систему.

Вы сможете проверить, применились ли новые настройки, и быть уверенным в стабильности ваших приложений. Готовы навсегда решить проблему с исчерпанием файловых дескрипторов? Тогда переходите к полной статье — внутри вас ждут четкие инструкции и рабочие команды.


Если вы работали с программами, которым приходится обрабатывать очень большое количество файловых дескрипторов, например с распределенными базами данных, такими, как Elasticsearch, то вы, наверняка, сталкивались с ошибкой "too many open files в Linux".

В этой небольшой статье мы разберемся, что означает эта ошибка, а также как её исправить в различных ситуациях.

Ошибка too many open files Linux

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

Посмотреть, сколько файлов можно открыть в вашей файловой системе, можно, выполнив команду:

cat /proc/sys/fs/file-max

Слишком много файлов в Linux: как снять ограничение и забыть об ошибке

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

ulimit -n

Слишком много файлов в Linux: как снять ограничение и забыть об ошибке

Утилита ulimit возвращает два вида ограничений - hard и soft. Ограничение soft вы можете менять в любую сторону, пока оно не превышает hard. Ограничение hard можно менять только в меньшую сторону от имени обычного пользователя. От имени суперпользователя можно менять оба вида ограничений так, как нужно. По умолчанию отображаются soft-ограничения:

ulimit -nS

Чтобы вывести hard, используйте опцию -H:

ulimit -nH

Вы можете изменить ограничение, просто передав в ulimit новое значение:

ulimit -n 3000

Слишком много файлов в Linux: как снять ограничение и забыть об ошибке

Но поскольку hard-ограничение составляет 4000, то установить лимит больше этого значения вы не сможете. Чтобы изменить настройки ограничений для пользователя на постоянной основе, нужно настроить файл /etc/security/limits.conf. Синтаксис у него такой:

имя_пользователя тип_ограничения название_ограничения значение

Вместо имени пользователя можно использовать звездочку, чтобы изменения применялись ко всем пользователям в системе. Тип ограничения может быть soft или hard. Название - в нашем случае нужно nofile. И последний пункт - нужное значение. Установим максимум - 1617596.

sudo vi /etc/security/limits.conf

* hard nofile 1617596
* soft nofile 1617596

Слишком много файлов в Linux: как снять ограничение и забыть об ошибке

Нужно установить значение для soft и hard параметра, если вы хотите, чтобы изменения вступили в силу. Также убедитесь, что в файле /etc/pam.d/common-session есть такая строчка:

session required pam_limits.so

Если её нет, добавьте в конец. Она нужна, чтобы ваши ограничения загружались при авторизации пользователя.

Если вам нужно настроить ограничения только для определенного сервиса, например  Apache или Elasticsearch, то для этого не обязательно менять все настройки в системе. Вы можете сделать это с помощью systemctl. Просто выполните:

sudo systemctl edit имя_сервиса

И добавьте в открывшейся файл такие строки:

[Service]
LimitNOFILE=1617596
LimitNOFILESoft=1617596

Слишком много файлов в Linux: как снять ограничение и забыть об ошибке

Здесь мы устанавливаем максимально возможное ограничение как для hard- так и для soft-параметра. Дальше нужно закрыть этот файл и обновить конфигурацию сервисов:

sudo systemctl daemon-reload

Затем перезагрузить нужный сервис:

sudo systemctl restart имя_сервиса

Убедится, что для вашего сервиса применились нужные ограничения, можно, открыв файл по пути /proc/pid_сервиса/limits. Сначала смотрим PID нужного нам сервиса:

ps aux | grep elasticsearch

Слишком много файлов в Linux: как снять ограничение и забыть об ошибке

Затем смотрим информацию:

cat /proc/8388/limits

Слишком много файлов в Linux: как снять ограничение и забыть об ошибке

Выводы

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

Оставить комментарий


Кликните на изображение чтобы обновить код, если он неразборчив