Cgroups

cgroups:如何從 cgroup 中分離一個程序

  • July 28, 2020

mygroup在我的系統中創建了一個 cgroup 並在其下執行一個程序

cgexec -g memory,cpu:groupname/mygroup someprocess

現在一段時間後,我覺得無需擔心 cpu 和記憶體,如何將程序從我應用的 cgroup 中分離出來

一旦一個cgroup子系統可用(通過掛載它),一個程序始終是該子系統層次結構中cgroup的一部分,並且最初將是它的根**cgroup,除非移動到另一個cgroup中,它的後代也會出現。“分離”一個程序通常意味著將它(返回)移動到給定子系統的根cgroup

假設子系統已經充分安裝,一切都可以通過創建/刪除偽目錄或讀取/寫入出現在這些目錄中的偽文件的足夠值來獲得,通常/sys/fs/cgroup如 中所述man cgroups.7,否則提供的專用命令cgexeccgclassify.

這是一個範例(使用cgroups v1)從 bash shell 中說明它:

# ls /sys/fs/cgroup/{memory,cpu}/groupname/mygroup
ls: cannot access '/sys/fs/cgroup/memory/groupname/mygroup': No such file or directory
ls: cannot access '/sys/fs/cgroup/cpu/groupname/mygroup': No such file or directory

# cgcreate -g memory,cpu:groupname/mygroup

# ls -d /sys/fs/cgroup/{memory,cpu}/groupname/mygroup
/sys/fs/cgroup/cpu/groupname/mygroup  /sys/fs/cgroup/memory/groupname/mygroup

當然,在創建上述 cgroup 之後,可能會應用一些專用設置。

# cgexec -g memory,cpu:groupname/mygroup sh -c 'echo $$; exec sleep 999'
14682

其他終端:

# grep -w 14682 /sys/fs/cgroup/{memory,cpu}/groupname/mygroup/cgroup.procs 
/sys/fs/cgroup/memory/groupname/mygroup/cgroup.procs:14682
/sys/fs/cgroup/cpu/groupname/mygroup/cgroup.procs:14682
# grep -w 14682 /sys/fs/cgroup/{memory,cpu}/cgroup.procs
#

# cgclassify -g memory,cpu:/ 14682

# grep -w 14682 /sys/fs/cgroup/{memory,cpu}/groupname/mygroup/cgroup.procs
# grep -w 14682 /sys/fs/cgroup/{memory,cpu}/cgroup.procs
/sys/fs/cgroup/memory/cgroup.procs:14682
/sys/fs/cgroup/cpu/cgroup.procs:14682

上面的三個專用命令可以替換為這些簡單的 shell 命令:

# mkdir -p /sys/fs/cgroup/{memory,cpu}/groupname/mygroup
# bash -c 'echo $$ | tee /sys/fs/cgroup/{memory,cpu}/groupname/mygroup/cgroup.procs; exec sleep 999'
15533

和(“分離”它):

# echo 15533 | tee /sys/fs/cgroup/{memory,cpu}/cgroup.procs
15533

實際上請注意專用命令cgclassify,至少在cgroups v1 上作用於程序的執行緒(使用.../tasks)而不是程序本身(使用.../cgroup.procs)。對於簡單的程序,作為唯一執行緒的 pid(程序 ID)和任務組 ID(tgid=pid)在兩個偽文件中都是相同的,沒有區別。對於多執行緒程序,移動整個程序需要在使用.../tasks或簡單使用時辨識其所有執行緒.../cgroup.procs。它在男人身上:

將 PID 寫入 時cgroup.procs,程序中的所有執行緒都會立即移動到新的 cgroup 中。

在 cgroups v1 中,可以通過將單個執行緒的執行緒 ID(即 clone(2) 和 gettid(2) 返回的核心執行緒 ID)寫入taskscgroup 目錄中的文件來將單個執行緒移動到另一個 cgroup。可以讀取此文件以發現屬於 cgroup 成員的執行緒集。

這就是為什麼我選擇展示和使用.../cgroup.procs之後。在移動多執行緒程序(如 Firefox、Java 應用程序等)時,這很重要,pgrep --lightweight可以用來cgclassify為這種情況提供所有任務(但要小心競爭)。

引用自:https://unix.stackexchange.com/questions/600725