cgroups:如何從 cgroup 中分離一個程序
我
mygroup
在我的系統中創建了一個 cgroup 並在其下執行一個程序cgexec -g memory,cpu:groupname/mygroup someprocess
現在一段時間後,我覺得無需擔心 cpu 和記憶體,如何將程序從我應用的 cgroup 中分離出來
一旦一個cgroup子系統可用(通過掛載它),一個程序始終是該子系統層次結構中cgroup的一部分,並且最初將是它的根**cgroup,除非移動到另一個cgroup中,它的後代也會出現。“分離”一個程序通常意味著將它(返回)移動到給定子系統的根cgroup。
假設子系統已經充分安裝,一切都可以通過創建/刪除偽目錄或讀取/寫入出現在這些目錄中的偽文件的足夠值來獲得,通常
/sys/fs/cgroup
如 中所述man cgroups.7
,否則提供的專用命令cgexec
是cgclassify
.這是一個範例(使用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)寫入
tasks
cgroup 目錄中的文件來將單個執行緒移動到另一個 cgroup。可以讀取此文件以發現屬於 cgroup 成員的執行緒集。這就是為什麼我選擇展示和使用
.../cgroup.procs
之後。在移動多執行緒程序(如 Firefox、Java 應用程序等)時,這很重要,pgrep --lightweight
可以用來cgclassify
為這種情況提供所有任務(但要小心競爭)。