cgroups.procs与tasks区别
一、问题
cgroup的层级中都有cgroups.procs与tasks,那么它们有什么区别?
例如:
- snippet.bash
[yz@yz219 yz]$ pwd /sys/fs/cgroup/cpuset/yz [yz@yz219 yz]$ ll …… -rw-rw-r-- 1 yz yz 0 5月 28 17:24 cgroup.procs …… -rw-rw-r-- 1 yz yz 0 5月 28 18:48 tasks
二、解释
cgroups的控制单位实际上是线程(轻量级进程)。
cgroup.procs用来控制线程组的,而tasks是控制线程的。
所以,如果是单线程进程,两种没有区别。
举个例子:
假设有个进程包含以下线程(轻量级进程):
- 主线程的LWPID:10000(实际也是线程组ID);
- 子线程1的LWPID:10001;
- 子线程2的LWPID:10002;
cgroup.procs
那么,将上述三个线程中的任意一个加入cgroup.procs,则整个线程组的所有线程将被自动加入tasks。
即,
- snippet.bash
[yz@yz219 yz]$ echo 10001 > cgroup.procs [yz@yz219 yz]$ cat cgroup.procs 10000 [yz@yz219 yz]$ cat tasks 10000 10001 10002
可见,我们只是将一个子线程(10001)加入cgroup.procs,但是其所在的线程组(10000)的所有子线程被自动加入了tasks。
需要注意的是,那么上述操作,会将该资源组的所有子线程从其它组(如果在其它资源组的话)全部移除。
tasks
但是如果我们单独将线程加入tasks,那么只会影响该线程(注意:假设没有加入过cgroup.procs)。
- snippet.bash
[yz@yz219 yz]$ echo 10001 > tasks [yz@yz219 yz]$ cat cgroup.procs 10000 [yz@yz219 yz]$ cat tasks 10001
注意:10001被加入tasks时,cgroup.procs会自动加入该线程所在的线程组ID(TGID, 10000)。
我们可以单独将主线程加入tasks,接上例继续执行:
- snippet.bash
[yz@yz219 yz]$ echo 10000 > tasks [yz@yz219 yz]$ cat cgroup.procs 10000 [yz@yz219 yz]$ cat tasks 10000 10001
三、应用
在多线程的应用程序中,如果需要为不同线程指派不同的cgroup组,那么应该将LWPID写入tasks,而不是cgroup.procs。
四、参考
打赏作者以资鼓励: