Ограничения памяти Cgroup и завершение процесса

Ограничения памяти Cgroup и завершение процесса

У меня следующая ситуация: (Следующие функции взяты из 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, как и ожидалось.

Ниже приведены сомнения:

  1. Применяется ли ограничение cgroup только к A или (A+B) или (A+B+C)?

  2. Если достигнут предел памяти, какие все процессы будут завершены: A или (A+B) или (A+B+C)? И почему? Это определяется с помощью pid процесса или адресного пространства процесса, к которому применяется предел?

  3. Если в предыдущем пункте не все процессы завершены, есть ли способ точно настроить cgroup, чтобы завершить также и все дочерние процессы, поскольку в таких случаях у нас останутся осиротевшие процессы?

Я работаю на Centos7 в качестве базовой операционной системы.

решение1

Я отвечу на каждый из ваших вопросов:

  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
  1. Согласнодокументация по памяти cgroup:

Когда cgroup превышает свой лимит, мы сначала пытаемся вернуть память из cgroup, чтобы освободить место для новых страниц, которых коснулась cgroup. Если возврат не удался, вызывается процедура OOM для выбора и завершения самой объемной задачи в cgroup.

Исходя из этого, он не завершает все процессы в cgroup; он выбирает тот, который потребляет больше всего памяти.

  1. Я не вижу способа настроить, какой процесс будет убит, чтобы соответствовать тому, о чем вы здесь спрашиваете. Есть способ иметь некоторый контроль над OOM killer; см., например, этоСтатья новостей Linux WeeklyПри этом, если один из родительских процессов завершается, все его дочерние процессы переходят в процесс с PID = 1 (по умолчанию).

Связанный контент