cgroup: fork rejected by pids controller
Предел числа задач считается для среза целиком и включает потоки, а не только процессы. Его исчерпание выглядит как случайные отказы создания процессов, причём пострадать может служба, которая сама этот предел не переполняла.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Предел задач службы исчерпан
Каждый поток считается задачей. Многопоточная программа упирается в предел быстрее, чем ожидается по числу процессов.
-
Предел исчерпан на срезе выше
Пределы срезов складываются. Служба может упираться в предел системного среза при своём свободном.
-
Утечка потоков в программе
Программа создаёт потоки и не завершает их. Предел лишь обнаруживает утечку, а не вызывает её.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Предел и текущее число задач службы.
systemctl show myapp.service -p TasksMax -p TasksCurrentЧисло задач по срезам и службам.
systemd-cgtop -1 -n1 | head -10Сообщения ядра об отказах создания процессов.
journalctl -k -b --no-pager | grep -i "rejected by pids" | tailРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Каждый поток считается задачей. Многопоточная программа упирается в предел быстрее, чем ожидается по числу процессов.
- Как проверить
-
Посмотрите предел и текущее число задач.
systemctl show myapp.service -p TasksMax -p TasksCurrent systemd-cgls -u myapp.service 2>/dev/null | head
- Как исправить
-
Поднимите предел задач для службы, оценив реальное число потоков. Значение по умолчанию невелико и рассчитано на обычные службы.
[Service] TasksMax=4096
- Почему происходит
- Пределы срезов складываются. Служба может упираться в предел системного среза при своём свободном.
- Как проверить
-
Посмотрите пределы службы и её срезов.
systemctl show myapp.service -p Slice -p TasksMax systemctl show system.slice -p TasksMax -p TasksCurrent
- Как исправить
- Поднимите предел на нужном уровне дерева. Узкое место бывает выше, чем кажется.
- Почему происходит
- Программа создаёт потоки и не завершает их. Предел лишь обнаруживает утечку, а не вызывает её.
- Как проверить
-
Посмотрите рост числа задач во времени.
for i in 1 2 3; do systemctl show myapp.service -p TasksCurrent; sleep 5; done
- Как исправить
- Исправьте утечку в программе. Поднятие предела в этом случае лишь отодвигает отказ.
Пример вывода
Предел задач исчерпан многопоточной службой. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
kernel: cgroup: fork rejected by pids controller in /system.slice/myapp.service
myapp[9800]: java.lang.OutOfMemoryError: unable to create native thread
systemd[1]: myapp.service: Main process exited, code=exited, status=1/FAILURE
Связанные ошибки
- status=205/LIMITS в systemd Код 205/LIMITS: systemd не смог применить ограничения ресурсов из Limit*=. Обычно значение недопустимо или превышает жёсткий предел.
- Ограничение процессора: доля и жёсткий предел работают по-разному Служба то тормозит, то нет: доля процессора и жёсткий предел решают разные задачи и путать их нельзя.
- Java-служба: OutOfMemoryError и куча Служба на JVM падает с нехваткой памяти: размер кучи, предел контрольной группы, дампы кучи.
- Ограничения ресурсов не работают: система в смешанном режиме срезов Параметры памяти и процессора не действуют: используется устаревший режим срезов или смешанный.
- Cannot allocate memory в журнале службы Не удалось выделить память: предел службы, память машины, настройка overcommit, исчерпанные области отображения.
- Disk quota exceeded для службы Место на разделе есть, а запись отклоняется: исчерпана дисковая квота пользователя или группы.
- Elasticsearch: max virtual memory areas vm.max_map_count is too low Elasticsearch отказывается стартовать из-за заниженного vm.max_map_count. Как поднять значение и закрепить его.
- Failed with result 'resources' Состояние resources: systemd не смог выделить ресурсы для запуска службы. Чем отличается от кодов 200-й группы и что проверять.
Источники
-
systemd.resource-control(5)
TasksMax= и учёт задач в срезах. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено снижением предела задач для службы с потоками.