Вики / Процессы
ulimit и лимиты ресурсов
Лимиты на процессы — открытые файлы, число процессов; 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
См. также
- Пользователи и группы — Пользователи и права
- lsof (открытые файлы и порты) — Процессы
- systemd — Службы и systemd