cgroup子线程继承关系
Linux的线程本质上是进程,称为“轻量级进程(LWP, Light Weight Process)”,线程的行为继承关系和进程非常相似。
本文以CPU SET验证进程的cgroup继承关系。
一、准备
模型
- 多线程进程。
- 主线程创建两个子线程。
系统
- Redhat 7.6,4核CPU。
cgroup层级
- snippet.bash
[yz@yz219 yz]$ pwd /sys/fs/cgroup/cpuset/yz [yz@yz219 yz]$ ll drwxrwxr-x 2 yz yz 0 5月 28 18:15 1 drwxrwxr-x 2 yz yz 0 5月 28 18:15 2 -rw-rw-r-- 1 yz yz 0 5月 28 17:24 cgroup.clone_children --w--w---- 1 yz yz 0 5月 28 17:24 cgroup.event_control -rw-rw-r-- 1 yz yz 0 5月 28 17:24 cgroup.procs -rw-rw-r-- 1 yz yz 0 5月 28 17:24 cpuset.cpu_exclusive -rw-rw-r-- 1 yz yz 0 5月 28 18:47 cpuset.cpus -r--r--r-- 1 yz yz 0 5月 28 17:24 cpuset.effective_cpus -r--r--r-- 1 yz yz 0 5月 28 17:24 cpuset.effective_mems -rw-rw-r-- 1 yz yz 0 5月 28 17:24 cpuset.mem_exclusive -rw-rw-r-- 1 yz yz 0 5月 28 17:24 cpuset.mem_hardwall -rw-rw-r-- 1 yz yz 0 5月 28 17:24 cpuset.memory_migrate -r--r--r-- 1 yz yz 0 5月 28 17:24 cpuset.memory_pressure -rw-rw-r-- 1 yz yz 0 5月 28 17:24 cpuset.memory_spread_page -rw-rw-r-- 1 yz yz 0 5月 28 17:24 cpuset.memory_spread_slab -rw-rw-r-- 1 yz yz 0 5月 28 18:45 cpuset.mems -rw-rw-r-- 1 yz yz 0 5月 28 17:24 cpuset.sched_load_balance -rw-rw-r-- 1 yz yz 0 5月 28 17:24 cpuset.sched_relax_domain_level -rw-rw-r-- 1 yz yz 0 5月 28 17:24 notify_on_release -rw-rw-r-- 1 yz yz 0 5月 28 18:48 tasks
- 资源组 1 与CPU内核 1 绑定。
- 资源组 2 与CPU内核 2 绑定。
二、测试
以下,假设主进程LWPID为10000(主进程LWPID同PID),两个子进程LWPID分别为10001和10002。
测试
先将主线程绑定到资源组1,
- snippet.bash
[yz@yz219 yz]$ pwd /sys/fs/cgroup/cpuset/yz [yz@yz219 yz]$ echo 10000 > 1/tasks [yz@yz219 yz]$ cat 1/tasks 10000
然后创建两个子线程。
可以观察到:
子线程资源组自动继承了主线程的资源组。
- snippet.bash
[yz@yz219 yz]$ pwd /sys/fs/cgroup/cpuset/yz [yz@yz219 yz]$ cat 1/tasks 10000 10001 10002 [yz@yz219 yz]$ cat 2/tasks
子线程创建成功后,可以为主线程和子线程重新单独指定资源组,例如,可以将主线程单独绑定到资源组2。
- snippet.bash
[yz@yz219 yz]$ echo 10000 > 2/tasks [yz@yz219 yz]$ cat 1/tasks 10001 10002 [yz@yz219 yz]$ cat 2/tasks 10000
三、结论
- 子线程默认继承父线程的资源组。
- 子线程创建后,无论是子线程还是父线程,都可以重新单独指定资源组。
- 子线程如果继续创建子线程,那么继承关系同上。
打赏作者以资鼓励: