Cgroup記憶體限制和進程終止

Cgroup記憶體限制和進程終止

我有以下情況:(以下函數取自python)

我有一個正在運行的進程 A,並且對其設置了 cgroup 記憶體限制。

我用 os.fork() 從 A 分叉出一個子程序。讓我們稱之為 B。http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/exec.html此程序與呼叫者(即B)運行在相同的位址空間。

B 中執行的 shell 腳本建立一個 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 殺手進行一定程度的控制;例如,參見這個Linux 每週新聞文章。也就是說,如果其中一個父進程被殺死,它所擁有的所有子進程都會被重新設定為 PID = 1 的進程(預設)。

相關內容