저는 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 번호인 줄 알았습니다. 그러나 이는 키-값 쌍의 목록입니다. 위의 키-값 쌍 목록은 프로세스 목록을 나타냅니까?
동일한 cgroup에 있는 모든 프로세스를 찾을 수 있습니까?
감사해요.
답변1
인용한 매뉴얼 페이지에 명시된 바와 같이 cgroup은 프로세스 그룹입니다.
의 내용은 /proc/11/cgroup
프로세스 11이 속한 모든 제어 그룹을 설명합니다. v1 그룹의 경우 각 행의 첫 번째 필드는 계층 구조 ID이고, 두 번째 필드는 컨트롤러 목록이며, 세 번째 필드는 계층 구조에 있는 cgroup의 경로 이름입니다. v2 그룹의 경우 첫 번째 필드는 0이고 두 번째 필드는 비어 있으며 세 번째 필드는 경로 이름입니다.
특정 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은 루트 경로 예제에서 /
경로 내에 경로가 하나만 있는데 실제로는 말이 되지 않는다고 설명합니다.
계층 구조를 빠르게 살펴보고 싶다면 systemd-cgls cpu
이를 호출하여 이 하위 수준 procfs 파일을 검사하고 멋진 트리를 그릴 수 있습니다.