LimitNPROC= и другие пределы ресурсов процесса
Задаёт предел числа процессов и потоков для пользователя службы. Рядом стоят родственные пределы: размер стека, размер дампа памяти, объём блокируемой памяти.
Что делает
Важная особенность: этот предел считается на пользователя, а не на службу. Если несколько служб работают от одного пользователя, они делят предел между собой. Для ограничения именно службы есть TasksMax=, и он обычно уместнее.
Из родственных пределов чаще прочих нужны два: LimitCORE= — чтобы получить дамп памяти при падении, и LimitMEMLOCK= — для баз данных, блокирующих память от вытеснения.
Где ставится. В секции [Service].
Значения
| Значение | Что происходит |
|---|---|
LimitNPROC=4096 | предел процессов и потоков пользователя. |
LimitCORE=infinity | разрешить дампы памяти при падении. |
LimitMEMLOCK=infinity | нужен базам, блокирующим память. |
LimitSTACK=8M | размер стека потока. |
Пример
Пределы для базы данных и разрешённые дампы при разборе падений.
[Service]
LimitNOFILE=65535
LimitNPROC=8192
LimitMEMLOCK=infinity
LimitCORE=infinity
Дампы стоит разрешать на время разбора: они занимают место, зато дают точную причину падения.
Типичные ошибки
Предел считается на пользователя: службы, работающие от одного пользователя, делят его.
Для ограничения самой службы правильнее TasksMax= — он работает через контрольные группы.
При LimitCORE=0 дампы не создаются, и разбор падений становится гаданием.
Связанные ошибки
- status=205/LIMITS в systemdКод 205/LIMITS: systemd не смог применить ограничения ресурсов из Limit*=. Обычно значение недопустимо или превышает жёсткий предел.
- Failed with result 'core-dump'Состояние core-dump: процесс службы аварийно завершился и сохранил дамп памяти. Как открыть дамп и прочитать трассировку.
- Too many tasks: упор в предел TasksMaxСлужба не может создать новый процесс: достигнут предел TasksMax. Где он задан и как поднять правильно.
Рядом стоящие параметры
Где важен на практике
Источники
- systemd.exec(5)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)