FAIRYFAR-INTERNAL
 
  FAIRYFAR-INTERNAL  |  SITEMAP  |  ABOUT-ME  |  HOME  
您的足迹: cgroups.procs与tasks区别
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 528 17:24 cgroup.procs
……
-rw-rw-r-- 1 yz yz 0 528 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。

四、参考



打赏作者以资鼓励:
移动端扫码阅读: