Пределы ресурсов в unit-файле не применяются
Пределы ресурсов службы задаются только в unit-файле. Настройки в /etc/security/limits.conf относятся к входу пользователя в систему и на службы не влияют — это самая частая причина «я поднял лимит, а он прежний».
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Предел задан в limits.conf
Этот файл читает модуль PAM при входе пользователя. Служба запускается менеджером напрямую, без входа в систему.
-
Предел изменён, но служба не перезапущена
Пределы применяются при запуске процесса. Перезагрузка конфигурации их не меняет.
-
Программа сама понижает предел
Часть программ выставляет свой предел при старте, игнорируя заданный. Тогда unit-файл тут не поможет.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Действующие пределы процесса — единственный достоверный источник.
PID=$(systemctl show -p MainPID --value myapp.service); cat /proc/$PID/limitsЧто задано в unit-файле.
systemctl show myapp.service | grep ^LimitОбщее значение по умолчанию для всех служб.
systemctl show -p DefaultLimitNOFILEРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Этот файл читает модуль PAM при входе пользователя. Служба запускается менеджером напрямую, без входа в систему.
- Как проверить
-
Посмотрите действующий предел процесса службы.
PID=$(systemctl show -p MainPID --value myapp.service); cat /proc/$PID/limits | head -12
- Как исправить
-
Задайте предел в unit-файле через переопределение и перезапустите службу.
sudo systemctl edit myapp.service # [Service]\nLimitNOFILE=65535
- Почему происходит
- Пределы применяются при запуске процесса. Перезагрузка конфигурации их не меняет.
- Как проверить
-
Сравните заданное и действующее значение.
systemctl show myapp.service -p LimitNOFILE PID=$(systemctl show -p MainPID --value myapp.service); grep -i "open files" /proc/$PID/limits
- Как исправить
-
Перезапустите службу полностью:
systemctl restart, а неreload.
- Почему происходит
- Часть программ выставляет свой предел при старте, игнорируя заданный. Тогда unit-файл тут не поможет.
- Как проверить
-
Сравните предел процесса с заданным в unit.
PID=$(systemctl show -p MainPID --value myapp.service); grep -i "open files" /proc/$PID/limits
- Как исправить
- Настройте предел в самой программе: у баз и веб-серверов для этого есть собственные параметры.
Пример вывода
В limits.conf предел поднят, у службы прежний. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ grep nofile /etc/security/limits.conf
* soft nofile 65535
$ PID=$(systemctl show -p MainPID --value myapp.service); grep -i "open files" /proc/$PID/limits
Max open files 1024 524288 files
Связанные ошибки
- Too many open files в журнале службы Служба исчерпала лимит файловых дескрипторов. Как правильно поднять LimitNOFILE и когда дело в утечке.
- status=205/LIMITS в systemd Код 205/LIMITS: systemd не смог применить ограничения ресурсов из Limit*=. Обычно значение недопустимо или превышает жёсткий предел.
- Too many tasks: упор в предел TasksMax Служба не может создать новый процесс: достигнут предел TasksMax. Где он задан и как поднять правильно.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Docker: unable to configure the Docker daemon with file daemon.json Демон Docker не запускается из-за ошибки в /etc/docker/daemon.json: неверный JSON или неизвестный ключ.
- No space left on device в журнале службы Нет места на устройстве: разбор по свободным блокам, по inode, по журналу systemd и по удалённым, но открытым файлам.
- Service has more than one ExecStart= setting Несколько команд запуска допустимы только при Type=oneshot. Как правильно заменить команду в переопределении.
- Unit file is bad и ошибки разбора unit-файла systemd не может разобрать unit-файл: неизвестные параметры, ошибки в секциях, недопустимые значения. Как найти проблемную строку.
Где встречается чаще всего
Источники
-
systemd.exec(5)
Limit*= и отношение к limits.conf. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено: значение из limits.conf на службу не действует.