私はcgroupが特定の条件を満たすプロセスグループだと思います。http://man7.org/linux/man-pages/man7/cgroups.7.html
cグループはプロセス収集cgroupファイルシステムによって定義された制限またはパラメータセットにバインドされます。
与えられたPIDを持つプロセスのcgroupを見つけるのは正しいですか?ただ実行してください。
$ cat /proc/11/cgroup
12:perf_event:/
11:blkio:/
10:hugetlb:/
9:freezer:/
8:pids:/
7:cpuset:/
6:devices:/
5:cpu,cpuacct:/
4:rdma:/
3:memory:/
2:net_cls,net_prio:/
1:name=systemd:/
0::/
cgroupがID番号であることがわかりました。ただし、これはキーと値のペアのリストです。上記のKey-Valueペアのリストはプロセスのリストを表していますか?
同じcgroup内のすべてのプロセスを見つけることはできますか?
ありがとうございます。
答え1
引用したマニュアルページに記載されているように、cgroupはプロセスグループです。
の内容は、/proc/11/cgroup
プロセス11が属する全ての制御グループを記述する。 v1グループの場合、各行の最初のフィールドは階層ID、2番目のフィールドはコントローラのリスト、3番目のフィールドは階層内のcgroupのパス名です。 v2 グループの場合、最初のフィールドは 0 で、2 番目のフィールドは空で、3 番目のフィールドはパス名です。
特定のcgroup内のすべてのプロセスを見つけ、tasks
そのsysfsディレクトリのファイルを表示します。例えば
cat /sys/fs/cgroup/perf_event/tasks
以下に該当します12:perf_event:/
。
| /sys/fs/cgroup/ | perf_event | / | tasks
| | | |
|< mountpoint >|<controller>| ^ |
|
cgroup pathname --+
答え2
Stephen Kittは悪い例のためのパス構造を説明するあなたを嘲笑します。ここに良い例があります。プロセスPID 1595に関連するCPUコントローラcgroupのタスクをリストします。cat /proc/1595/cgroup
私たちに与える
12:hugetlb:/
11:rdma:/
10:net_cls,net_prio:/
9:freezer:/
8:blkio:/system.slice/containerd.service
7:cpuset:/
6:cpu,cpuacct:/system.slice/containerd.service
5:devices:/system.slice/containerd.service
4:pids:/system.slice/containerd.service
3:memory:/system.slice/containerd.service
2:perf_event:/
1:name=systemd:/system.slice/containerd.service
0::/system.slice/containerd.service
したがって、CPUコントローラの行は、6:cpu,cpuacct:/system.slice/containerd.service
グループ内のプロセスを読み取ることができるリストです/sys/fs/cgroup/cpu/system.slice/containerd.service/tasks
。ファイルにはtasks
スレッドもリストされています。このパスはcgroupリソース割り当ての階層構造を表し、親system.slice
グループに属しますcontainerd.service
。 Stephenは、ルートパスの例では、/
パス内に1つのパスしかありませんが、実際には言葉ではないと説明しています。
階層をすばやく調べたい場合は、systemd-cgls cpu
それを呼び出してこの下位レベルのprocfsファイルを調べて素敵なツリーを描画できます。