Cgroup 메모리 제한 및 프로세스 종료

Cgroup 메모리 제한 및 프로세스 종료

나는 다음과 같은 상황에 처해 있습니다. (다음 함수는 Python에서 가져온 것입니다.)

실행 중인 프로세스 A가 있고 여기에 cgroup 메모리 제한이 설정되어 있습니다.

os.fork()를 사용하여 A에서 하위 프로세스를 포크합니다. B라고 부르자. 그런 다음 os.execvp를 실행하여 B의 쉘 스크립트를 로드합니다.http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/exec.html프로세스는 호출자(예: B)와 동일한 주소 공간에서 실행됩니다.

B에서 실행되는 셸 스크립트는 지정된 힙 크기로 무기한 실행되고 OOM에서 자동으로 종료되는 Java 프로그램을 생성합니다. 이를 통해-XX:OnOutOfMemoryError='kill -9 %p'java 명령에. 그러면 B의 자식으로 또 다른 프로세스 C가 생성됩니다.

위에서 보면 역시 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와 그 모든 하위 항목에 적용됩니다. 이 동작을 확인하기 위해 실험을 수행할 수 있습니다. 다음을 고려하십시오:
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 킬러를 제어할 수 있는 방법이 있습니다.Linux 주간 뉴스 기사. 즉, 상위 프로세스 중 하나가 종료되면 해당 프로세스가 소유한 모든 하위 프로세스가 PID = 1(기본값)인 프로세스로 재설정됩니다.

관련 정보