linux-labs

Вики / Процессы

ulimit и лимиты ресурсов

Концепция Linux ПроцессыБезопасность

Лимиты на процессы — открытые файлы, число процессов; limits.conf и systemd.

Ядро ограничивает ресурсы процессов: число открытых файлов, процессов, размер стека и т.д. Самый частый в проде — лимит открытых файлов (nofile), в который упираются нагруженные сервисы (веб, БД).

ulimit -a                         # все лимиты текущей оболочки
ulimit -n                         # лимит открытых файлов (soft)
ulimit -Hn                        # hard-лимит

soft — текущий (можно поднять до hard), hard — потолок (поднимает root).

ulimit limits.conf systemd Что
-n nofile LimitNOFILE открытые файлы/сокеты
-u nproc LimitNPROC число процессов пользователя
-c core LimitCORE размер core-dump
-s stack LimitSTACK размер стека
-l memlock LimitMEMLOCK залоченная память (БД)
-f fsize LimitFSIZE размер создаваемого файла
ulimit -n 8192                    # поднять soft (в пределах hard, для текущей сессии)
ulimit -c unlimited               # разрешить core-dump (отладка падений)
ulimit -Hn ; ulimit -Sn          # hard / soft явно

Для пользователей/сессий (вход через PAM) — /etc/security/limits.conf (или /etc/security/limits.d/*.conf):

deploy  soft  nofile  65535
deploy  hard  nofile  65535
*       soft  nproc   4096
@dbusers hard memlock unlimited

Для systemd-служб limits.conf НЕ действует — задавай в юните:

[Service]
LimitNOFILE=65535
LimitNPROC=4096
sudo systemctl daemon-reload && sudo systemctl restart myapp
systemctl show myapp -p LimitNOFILE       # проверить применённый лимит
cat /proc/$(pgrep -f myapp)/limits        # реальные лимиты живого процесса

Too many open files / EMFILE

Сервис упёрся в nofile. Проверь применённый лимит (cat /proc/<pid>/limits → «Max open files»). Подними: для systemd — LimitNOFILE= в юните (+ daemon-reload, restart). Сколько реально открыто — lsof -p PID | wc -l; если растёт — утечка fd.

Поднял в limits.conf, а службе не помогло

systemd-службы не читают limits.conf — нужен LimitNOFILE= в юните. limits.conf работает только для интерактивных/PAM-сессий.

ulimit -n: cannot modify limit

Поднять soft выше hard нельзя без root. Root задаёт hard (ulimit -Hn N).

Нет core-dump при падении

ulimit -c unlimited (сессия) или LimitCORE=infinity (служба); куда пишутся — /proc/sys/kernel/core_pattern (часто перехватывает systemd-coredump → coredumpctl).

fork: retry: Resource temporarily unavailable

Упёрлись в nproc (лимит процессов пользователя). Подними -u/LimitNPROC.

ulimit -a                         # все лимиты
ulimit -n ; ulimit -Hn            # soft/hard открытых файлов
cat /proc/PID/limits              # лимиты живого процесса
# systemd-служба: [Service] LimitNOFILE=65535 (daemon-reload+restart)
# пользователи (PAM): /etc/security/limits.conf

См. также