나는 다음과 같은 상황에 처해 있습니다. (다음 함수는 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의 자식으로 보입니다.
아래는 의문점입니다.
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 킬러를 어느 정도 제어할 수 있는 방법이 있습니다. 예를 들어 이것을 참조하십시오Linux 주간 뉴스 기사. 즉, 상위 프로세스 중 하나가 종료되면 해당 프로세스의 모든 하위 프로세스는 PID = 1(기본값)인 프로세스의 상위 프로세스로 다시 지정됩니다.