
У меня следующая ситуация: (Следующие функции взяты из Python)
У меня есть процесс A, который запущен и для него установлен предел памяти cgroup.
Я создаю дочерний процесс из A с помощью os.fork(). Назовем его B. Затем я запускаю os.execvp, чтобы загрузить скрипт оболочки внутри B. Согласноhttp://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/exec.htmlэтот процесс выполняется в том же адресном пространстве, что и вызывающий процесс (т. е. B).
Скрипт оболочки, работающий в B, создает программу Java, которая выполняется неограниченно долго с заданным размером кучи и автоматическим завершением при OOM. Это достигается путем передачи-XX:OnOutOfMemoryError='kill -9 %p'к команде java. Это создает еще один процесс C как дочерний процесс B.
Глядя сверху, я вижу B как потомка A, а C как потомка B, как и ожидалось.
Ниже приведены сомнения:
Применяется ли ограничение cgroup только к A или (A+B) или (A+B+C)?
Если достигнут предел памяти, какие все процессы будут завершены: A или (A+B) или (A+B+C)? И почему? Это определяется с помощью pid процесса или адресного пространства процесса, к которому применяется предел?
Если в предыдущем пункте не все процессы завершены, есть ли способ точно настроить cgroup, чтобы завершить также и все дочерние процессы, поскольку в таких случаях у нас останутся осиротевшие процессы?
Я работаю на Centos7 в качестве базовой операционной системы.
решение1
Я отвечу на каждый из ваших вопросов:
- Cgroup применяется к A и любым потомкам A. Вы можете поэкспериментировать, чтобы проверить это поведение. Рассмотрите:
Create a new memory cgroup
# mkdir /sys/fs/cgroup/memory/example
Note the shell's PID:
# echo $$
679
Put the running shell into the new cgroup
# echo $$ > /sys/fs/cgroup/memory/example/cgroup.procs
Examine what processes are in the cgroup. Here 679 was the
shell's PID; 723 is the pid of cat
# cat /sys/fs/cgroup/memory/example/cgroup.procs
679
723
Start a new shell and note its PID
# bash
# echo $$
726
Examine what processes are in the cgroup. 679 was the original
shell. 726 is the second shell. 731 is cat:
# cat /sys/fs/cgroup/memory/example/cgroup.procs
679
726
731
- Согласнодокументация по памяти cgroup:
Когда cgroup превышает свой лимит, мы сначала пытаемся вернуть память из cgroup, чтобы освободить место для новых страниц, которых коснулась cgroup. Если возврат не удался, вызывается процедура OOM для выбора и завершения самой объемной задачи в cgroup.
Исходя из этого, он не завершает все процессы в cgroup; он выбирает тот, который потребляет больше всего памяти.
- Я не вижу способа настроить, какой процесс будет убит, чтобы соответствовать тому, о чем вы здесь спрашиваете. Есть способ иметь некоторый контроль над OOM killer; см., например, этоСтатья новостей Linux WeeklyПри этом, если один из родительских процессов завершается, все его дочерние процессы переходят в процесс с PID = 1 (по умолчанию).