Поиск по сайту:

Linux: исправить ошибку «Слишком много открытых файлов»


В этом руководстве объясняется, как решить ошибку «Слишком много открытых файлов» в Linux.

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

Значение ошибки «Слишком много открытых файлов»

Когда пользователь выполняет процесс, у процесса есть связанные файлы, содержащие информацию об использовании файлов. Например, файловые дескрипторы могут сообщать ядру, как получить доступ к файлу или как обращаться с ним к другому ресурсу. Например, когда мы используем канал для перенаправления процесса на другой.

По умолчанию каждый исполняемый процесс Linux имеет как минимум 3 связанных файла с именами Файловые дескрипторы: STDIN, STDOUT и STDERR. Их функции показаны в таблице ниже.

File Descriptor Number Function
STDIN 0 Refers to the keyboard input method
STDOUT 1 Prints or redirects the output, refers to the screen
STDERR 2 Prints or redirects errors, refers to the screen

Существует ограничение на число файловых дескрипторов пользователей и процессов, которые могут выполняться одновременно. Когда предел достигнут и пользователь или процесс пытается открыть дополнительные файловые дескрипторы, мы получаем «Ошибка слишком много открытых файлов».

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

Исправление ошибки Linux «Слишком много открытых файлов»

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

ulimit -n

Как вы можете видеть выше, ограничение составляет 1024.

Теперь давайте проверим ограничение пользователя, выполнив следующую команду:

ulimit -u

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

lsof | wc -l

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

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

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

Жесткий предел представляет собой максимальный предел, разрешенный для мягкого ограничения. Для изменения жесткого ограничения требуются права.

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

Вы можете узнать как жесткие, так и мягкие ограничения с помощью команд, показанных на следующем снимке экрана, где ulimit -Sn показывает мягкое ограничение, а ulimit -Hn показывает жесткое ограничение.

Сначала откройте следующий файл с привилегиями:

sudo nano /etc/security/limits.conf

Отредактируйте строки, показанные ниже, увеличив лимит. В моем случае я увеличиваю мягкое ограничение с 1024 до 2048. Здесь вы также можете изменить жесткое ограничение, если это необходимо.

Затем перезапустите daemon-reexec с помощью systemctl, как показано ниже.

sudo systemctl daemon-reexec

Откройте новый терминал или перезапустите сеанс, чтобы убедиться, что изменения были внесены успешно, и попробуйте снова изменить ulimit, выполнив следующую команду, и измените ограничение на то, которое вы указали в /etc/security/limits.conf файл.

ulimit -n 2048

Как вы можете видеть выше, лимит был успешно обновлен.

Если это не сработало для вас, откройте следующий файл с привилегиями:

sudo nano /etc/systemd/system.conf

Найдите строку DefaultLimitNOFILE= и измените первое число перед двоеточием, увеличив лимит. В моем случае я увеличил его с 1024 до 2048. Затем закройте и выйдите из файла, сохранив изменения.

Также откройте следующий файл с привилегиями:

sudo nano /etc/systemd/user.conf

Найдите такую же строку и отредактируйте ее, повторив внесенные ранее изменения.

Снова перезапустите демон reexec с помощью systemctl.

sudo systemctl daemon-reexec

Перезапустите сеанс и используйте следующую команду, заменив 2048 пределом, который вы хотите установить и настроить в файлах конфигурации:

ulimit -n 2048

Следующая команда возвращает лимит для всей системы:

cat /proc/sys/fs/file-max

Вы можете изменить системный лимит, используя следующую команду:

sudo sysctl -w fs.file-max=<NewValue>

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

sudo nano /etc/sysctl.conf

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

fs.file-max = <NewValue>

Перезапустите, чтобы применить новые изменения с помощью команды ниже.

sudo sysctl -p

Вот и все, после увеличения ulimit ошибка «Слишком много открытых файлов» должна быть исправлена.

Заключение

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

Спасибо, что прочитали это руководство, объясняющее, как решить ошибку «Слишком много открытых файлов» в Linux. Продолжайте следить за нами, чтобы получать больше профессиональных статей по Linux.

Статьи по данной тематике: