Как изменить максимальное количество открытых файлов для процесса в Ubuntu 24.04?

Здравствуйте! Я прохожу курс “от 0 до Linux админа” здесь и столкнулся с проблемой, как изменить максимальное количество открытых файлов для процесса в Ubuntu 24.04.

Этот вопрос задавался множество раз, но многие темы уже устарели, и мы не смогли выяснить, какие из них работают. У нас есть сервис, который запускается через systemd и работает под отдельным пользователем, назовем его “myservice”. Структура папок сервиса расположена в /opt/company/product/{bin,log,etc}.

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

Мы пробовали установить ulimit, использовать sysctl -w fs.file-max=1000000, настраивать это в файлах, но ничего не сработало.

Какова текущая процедура в Ubuntu 24.04 для того, чтобы изменить предел открытых файлов постоянно для конкретного процесса или пользователя на очень высокое значение, а лучше — полностью отключить этот лимит?

Спасибо!

Здравствуйте!

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

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

1. Изменение лимитов через systemd

Для вашего сервиса, запущенного через systemd, вам необходимо отредактировать файл юнита сервиса. Обычно он находится по пути /etc/systemd/system/myservice.service. Добавьте следующие строки в секцию [Service]:

[Service]
LimitNOFILE=1000000

2. Настройка системного уровня

Параметр fs.file-max уже установлен вами с помощью sysctl, и это правильно. Обязательно убедитесь, что значение сохранено, добавив его в файл /etc/sysctl.conf или в отдельный файл в /etc/sysctl.d/, например, /etc/sysctl.d/99-custom.conf:

fs.file-max = 1000000

Не забудьте применить настройки с помощью команды:

sudo sysctl -p

3. Параметры пользователя

Помимо конфигурации systemd, вы можете настроить лимиты на уровне пользователя. Это можно сделать в файле /etc/security/limits.conf. Добавьте следующие строки, заменив myuser на пользователя, под которым запускается ваш сервис:

myuser soft nofile 1000000
myuser hard nofile 1000000

4. Перезагрузите сервис

После изменений вам нужно перезагрузить systemd, чтобы увидеть изменения:

sudo systemctl daemon-reload
sudo systemctl restart myservice

5. Проверка лимитов

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

cat /proc/$(pgrep myservice)/limits | grep open

Это должно показать вам новые значения лимитов.

6. Дополнительные советы

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

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

Надеюсь, это поможет решить вашу проблему! Если есть дополнительные вопросы, не стесняйтесь спрашивать. . Я ответил на ваш вопрос?

Спасибо за ответ! У меня все получилось, и я смог изменить максимальное количество открытых файлов для процесса в Ubuntu 24.04. Ваши советы были очень полезны!

Отлично, рад слышать, что у тебя всё вышло! :tada: Если возникнут ещё вопросы или понадобятся советы, не стесняйся обращаться. Удачи с дальнейшими настройками в Ubuntu! :smile: . Я ответил на ваш вопрос?