>

换另一个思路思考,CGroup 子系统或控制器

- 编辑:澳门博发娱乐官网 -

换另一个思路思考,CGroup 子系统或控制器

2 使配置生效

[[email protected] ~]# /etc/init.d/cgconfig restart 
Stopping cgconfig service: [ OK ] 
Starting cgconfig service: [ OK ] 
[[email protected] ~]# /etc/init.d/cgred restart 
Stopping CGroup Rules Engine Daemon... [ OK ] 
Starting CGroup Rules Engine Daemon: [ OK ] 
注:重启顺序为cgconfig -> cgred ,修正配置文件后八个服务须求重启,且顺序不可能错。

Cgroup介绍

Cgroup是进行分组化管理的Linux内核成效,具体的能源管理是通过子系统来产生的。可以预知为子系统就是财富调整器,每一种子系统就是三个财富的分配器,比方cpu子系统是调整cpu时间分配的,使用形式如下

能源支配实例

下边根本介绍能源的一些批驳功底, 上边通过有些实例演示即使经过 cgroup 来调控进度所运用的 CPU和内部存款和储蓄器 财富.

Linux对CPU 和 内部存储器的主宰有相应的 cgroup 子系统 cpuset 和 memory

 

Linux下CGroup进行CPU、内部存款和储蓄器等财富支配,linuxcgroup

留存

from:   and 

CGroup 介绍
CGroup 是 Control Groups 的缩写,是 Linux 内核提供的意气风发种能够界定、记录、隔开分离进程组 (process groups) 所使用的财力财富 (如 cpu memory i/o 等等) 的体制。二〇〇七 年步入 Linux 2.6.24 内核,CGroups 不是全新创制的,它将经过管理从 cpuset 中退出出去,小编是 谷歌 的 Paul Menage。CGroups 也是 LXC 为贯彻设想化所选用的能源管理花招。

CGroup 成效及组成
CGroup 是将轻便进度张开分组化管理的 Linux 内核作用。CGroup 自身是提供将经过张开分组化管理的机能和接口的功底结构,I/O 或内部存款和储蓄器的抽成调控等现实的能源管理功能是透过这一个效应来兑现的。那么些实际的能源管理职能称为 CGroup 子系统或调整器。CGroup 子系统有决定内部存储器的 Memory 调节器、调控进程调解的 CPU 调控器等。运维中的内核可以动用的 Cgroup 子系统由/proc/cgroup 来确认。
CGroup 提供了一个 CGroup 设想文件系统,作为开展分组管理和各子系统设置的顾客接口。要接受CGroup,必得挂载 CGroup 文件系统。此时通过挂载选项内定使用哪个子系统。

Cgroups提供了以下效用:
1)约束进度组能够使用的资源数量(Resource limiting )。比方:memory子系统可认为进度组织设立定一个memory使用上限,风流浪漫旦进度组使用的内部存款和储蓄器达到限额再提请内部存储器,就能出发OOM(out of memory)。
2)进度组的刚开始阶段级调节(Prioritization )。举个例子:能够应用cpu子系统为有些进程组分配一定cpu share。
3)记录进程组使用的能源数量(Accounting )。比方:能够使用cpuacct子系统记录有个别进度组使用的cpu时间
4)进度组隔断(Isolation)。举个例子:使用ns子系统能够使区别的进程组使用不一样的namespace,以达到隔开分离的目标,差异的历程组有各自的历程、互连网、文件系统挂载空间。
5)进度组决定(Control)。比方:使用freezer子系统能够将经过组挂起和余烬复起。

CGroup 扶助的文书种类
表 1. CGroup 扶持的公文少禽类

文件名 R/W 用途

Release_agent

RW

删除分组时执行的命令,这个文件只存在于根分组

Notify_on_release

RW

设置是否执行 release_agent。为 1 时执行

Tasks

RW

属于分组的线程 TID 列表

Cgroup.procs

R

属于分组的进程 PID 列表。仅包括多线程进程的线程 leader 的 TID,这点与 tasks 不同

Cgroup.event_control

RW

监视状态变化和分组删除事件的配置文件

CGroup 相关概念解释
1)任务(task)。在 cgroups 中,职务就是系统的叁个进度;
2)调整族群(control group)。调整族群正是后生可畏组遵照某种规范划分的进度。Cgroups 中的财富支配都以以调整族群为单位实现。叁个进度能够出席到某些调控族群,也从贰个进度组迁移到另叁个调整族群。一个经过组的长河能够采取cgroups 以调整族群为单位分配的能源,同不常间面对 cgroups 以调节族群为单位设定的限量;
3)层级(hierarchy)。调整族群能够团体成 hierarchical 的方式,既大器晚成颗调节族群树。调节族群树上的子节点调控族群是父节点调控族群的子女,承接父调整族群的特定的属性;
4)子系统(subsystem)。三个子系统正是多个能源调节器,举例 cpu 子系统便是调控 cpu 时间分配的三个调节器。子系统必得附加(attach)到三个层级上技能起效果,多少个子体系附加到有个别层级今后,这几个层级上的装有调整族群都受到那么些子系统的垄断(monopoly)。

相互关系
1)每一趟在系统中开创新层级时,该系统中的全数职责都以那一个层级的默许cgroup(大家称为 root cgroup,此 cgroup 在创造层级时自动创造,前面在该层级中创制的 cgroup 都以此 cgroup 的后生)的最早成员;
2)多个子种类最八只好叠合到三个层级;
3)贰个层级能够增大三个子系统;
4)七个职责可以是多少个 cgroup 的积极分子,但是那个 cgroup 必需在区别的层级;
5)系统中的进度(职分)创造子进度(职责)时,该子职责自动成为其父进程所在 cgroup 的成员。然后可依据要求将该子任务移动到分化的 cgroup 中,但开首时它总是承继其父职分的 cgroup。

IO约束测量检验

用dd对硬盘实行写操作

# dd if=/dev/sda of=/dev/null &

打开iotop看下IO速度

Total DISK READ : 100.37M/s | Total DISK WRITE : 0.00 B/s

Actual DISK READ: 100.37 M/s | Actual DISK WRITE: 0.00 B/s

TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND

18081 be/4 root 100.37 M/s 0.00 B/s 0.00 % 1.34 % ddif=/dev/sda of=/dev/null

为了调控IO速度,在blkio上开创调节组

# cgcreate -g blkio:/hzmali_test

翻开下硬盘号

# ls -l /dev/sda

brw-rw---- 1 root disk 8, 0 Jul 25 22:46 /dev/sda

安装硬盘号和相应的读取速度节制,然后实施同风流罗曼蒂克的下令

# cgset -r blkio.throttle.read_bps_device="8:0 1000000" hzmali_test

# cgexec -g blkio:hzmali_test "dd if=/dev/sda of=/dev/null"

用iotop查看下,速度果然就减低到1M以下

Total DISK READ : 996.55 K/s | Total DISK WRITE : 0.00 B/s

Actual DISK READ: 996.55 K/s | Actual DISK WRITE: 0.00 B/s

TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND

18188 be/4 root 996.55 K/s0.00 B/s 0.00 % 99.99 % dd if=/dev/sda of=/dev/null

cgroup 中的设置

意气风发体化安装是指向任何种类的, 大家也足以透过 cgroup 来对生龙活虎组经过的CPU能源实行调控.

生机勃勃旦想在 cgroup 中对 sched_rt_period_us 和 sched_rt_runtime_us 举行支配, 须要内核编译选项 CONFIG_RT_GROUP_SCHED=y

翻开当前系统的基业编写翻译选项方法如下: (debian 7.6 系统)

cat /boot/config-`uname -r`

查看 CONFIG_RT_GROUP_SCHED 是或不是启用

cat /boot/config-`uname -r` | grep -i rt_group
# CONFIG_RT_GROUP_SCHED is not set

debian 7.6 私下认可未有运行这一个选项, 所以挂载cgroup之后, 未有设置 sched_rt_period_us 和 sched_rt_runtime_us 的文件

图片 1

mkdir /mnt/cgroup
mount -t cgroup cgroup /mnt/cgroup/
cd /mnt/cgroup/
ls -l
total 0
-r--r--r-- 1 root root 0 Aug 28 09:06 blkio.io_merged
-r--r--r-- 1 root root 0 Aug 28 09:06 blkio.io_queued
-r--r--r-- 1 root root 0 Aug 28 09:06 blkio.io_service_bytes
-r--r--r-- 1 root root 0 Aug 28 09:06 blkio.io_serviced
-r--r--r-- 1 root root 0 Aug 28 09:06 blkio.io_service_time
-r--r--r-- 1 root root 0 Aug 28 09:06 blkio.io_wait_time
--w------- 1 root root 0 Aug 28 09:06 blkio.reset_stats
-r--r--r-- 1 root root 0 Aug 28 09:06 blkio.sectors
-r--r--r-- 1 root root 0 Aug 28 09:06 blkio.time
-rw-r--r-- 1 root root 0 Aug 28 09:06 blkio.weight
-rw-r--r-- 1 root root 0 Aug 28 09:06 blkio.weight_device
-rw-r--r-- 1 root root 0 Aug 28 09:06 cgroup.clone_children
--w--w--w- 1 root root 0 Aug 28 09:06 cgroup.event_control
-rw-r--r-- 1 root root 0 Aug 28 09:06 cgroup.procs
-r--r--r-- 1 root root 0 Aug 28 09:06 cpuacct.stat
-rw-r--r-- 1 root root 0 Aug 28 09:06 cpuacct.usage
-r--r--r-- 1 root root 0 Aug 28 09:06 cpuacct.usage_percpu
-rw-r--r-- 1 root root 0 Aug 28 09:06 cpuset.cpu_exclusive
-rw-r--r-- 1 root root 0 Aug 28 09:06 cpuset.cpus
-rw-r--r-- 1 root root 0 Aug 28 09:06 cpuset.mem_exclusive
-rw-r--r-- 1 root root 0 Aug 28 09:06 cpuset.mem_hardwall
-rw-r--r-- 1 root root 0 Aug 28 09:06 cpuset.memory_migrate
-r--r--r-- 1 root root 0 Aug 28 09:06 cpuset.memory_pressure
-rw-r--r-- 1 root root 0 Aug 28 09:06 cpuset.memory_pressure_enabled
-rw-r--r-- 1 root root 0 Aug 28 09:06 cpuset.memory_spread_page
-rw-r--r-- 1 root root 0 Aug 28 09:06 cpuset.memory_spread_slab
-rw-r--r-- 1 root root 0 Aug 28 09:06 cpuset.mems
-rw-r--r-- 1 root root 0 Aug 28 09:06 cpuset.sched_load_balance
-rw-r--r-- 1 root root 0 Aug 28 09:06 cpuset.sched_relax_domain_level
-rw-r--r-- 1 root root 0 Aug 28 09:06 cpu.shares
--w------- 1 root root 0 Aug 28 09:06 devices.allow
--w------- 1 root root 0 Aug 28 09:06 devices.deny
-r--r--r-- 1 root root 0 Aug 28 09:06 devices.list
-rw-r--r-- 1 root root 0 Aug 28 09:06 net_cls.classid
-rw-r--r-- 1 root root 0 Aug 28 09:06 notify_on_release
-rw-r--r-- 1 root root 0 Aug 28 09:06 release_agent
-rw-r--r-- 1 root root 0 Aug 28 09:06 tasks

图片 2

 

果然, 只有cpu.share, 没有 cpu.sched_rt_period_us 和 cpu.sched_rt_runtime_us

不可能, 重新编写翻译内核, 编写翻译内核的具体方法参见:  编译Linux内核

为了节省时间, 大家用 make localmodconfig 来制造 .config 文件, 然后改过此中的 CONFIG_RT_GROUP_SCHED=y

下载源码等等参见: 编译Linux内核, 首要步骤如下:

图片 3

cd /path/to/linux-source-3.2
make localmodconfig
vim .config   # 设置 CONFIG_RT_GROUP_SCHED=y 并保存
make
make modules_install
make install
reboot      # 重启之前看看 /boot/grub/grub.cfg 中, 默认启动的是不是新安装的内核

图片 4

 

启航到新基础, 再度查看内核选项 CONFIG_RT_GROUP_SCHED 是或不是启用

cat /boot/config-`uname -r` | grep -i rt_group
CONFIG_RT_GROUP_SCHED=y       # 已启用

 

再一次挂载 cgroup 文件系统, 开掘多了2个布局文件, cpu.rt_period_us 和 cpu.rt_runtime_us

图片 5

mount -t cgroup cgroup /mnt/cgroup/
cd /mnt/cgroup/
ls -l
total 0
-r--r--r-- 1 root root 0 Aug 28 09:53 blkio.io_merged
-r--r--r-- 1 root root 0 Aug 28 09:53 blkio.io_queued
-r--r--r-- 1 root root 0 Aug 28 09:53 blkio.io_service_bytes
-r--r--r-- 1 root root 0 Aug 28 09:53 blkio.io_serviced
-r--r--r-- 1 root root 0 Aug 28 09:53 blkio.io_service_time
-r--r--r-- 1 root root 0 Aug 28 09:53 blkio.io_wait_time
--w------- 1 root root 0 Aug 28 09:53 blkio.reset_stats
-r--r--r-- 1 root root 0 Aug 28 09:53 blkio.sectors
-r--r--r-- 1 root root 0 Aug 28 09:53 blkio.time
-rw-r--r-- 1 root root 0 Aug 28 09:53 blkio.weight
-rw-r--r-- 1 root root 0 Aug 28 09:53 blkio.weight_device
-rw-r--r-- 1 root root 0 Aug 28 09:53 cgroup.clone_children
--w--w--w- 1 root root 0 Aug 28 09:53 cgroup.event_control
-rw-r--r-- 1 root root 0 Aug 28 09:53 cgroup.procs
-r--r--r-- 1 root root 0 Aug 28 09:53 cpuacct.stat
-rw-r--r-- 1 root root 0 Aug 28 09:53 cpuacct.usage
-r--r--r-- 1 root root 0 Aug 28 09:53 cpuacct.usage_percpu
-rw-r--r-- 1 root root 0 Aug 28 09:53 cpu.rt_period_us
-rw-r--r-- 1 root root 0 Aug 28 09:53 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 Aug 28 09:53 cpuset.cpu_exclusive
-rw-r--r-- 1 root root 0 Aug 28 09:53 cpuset.cpus
-rw-r--r-- 1 root root 0 Aug 28 09:53 cpuset.mem_exclusive
-rw-r--r-- 1 root root 0 Aug 28 09:53 cpuset.mem_hardwall
-rw-r--r-- 1 root root 0 Aug 28 09:53 cpuset.memory_migrate
-r--r--r-- 1 root root 0 Aug 28 09:53 cpuset.memory_pressure
-rw-r--r-- 1 root root 0 Aug 28 09:53 cpuset.memory_pressure_enabled
-rw-r--r-- 1 root root 0 Aug 28 09:53 cpuset.memory_spread_page
-rw-r--r-- 1 root root 0 Aug 28 09:53 cpuset.memory_spread_slab
-rw-r--r-- 1 root root 0 Aug 28 09:53 cpuset.mems
-rw-r--r-- 1 root root 0 Aug 28 09:53 cpuset.sched_load_balance
-rw-r--r-- 1 root root 0 Aug 28 09:53 cpuset.sched_relax_domain_level
-rw-r--r-- 1 root root 0 Aug 28 09:53 cpu.shares
--w------- 1 root root 0 Aug 28 09:53 devices.allow
--w------- 1 root root 0 Aug 28 09:53 devices.deny
-r--r--r-- 1 root root 0 Aug 28 09:53 devices.list
-rw-r--r-- 1 root root 0 Aug 28 09:53 net_cls.classid
-rw-r--r-- 1 root root 0 Aug 28 09:53 notify_on_release
-rw-r--r-- 1 root root 0 Aug 28 09:53 release_agent
-rw-r--r-- 1 root root 0 Aug 28 09:53 tasks

cat cpu.rt_period_us 
1000000
cat cpu.rt_runtime_us 
950000

图片 6

 

因而陈设 cpu.rt_period_us 和 cpu.rt_runtime_us 就足以对 cgroup 中的进度组中的实时进程张开 CPU使用时间的调节.

 

1)cpu约束实例

界定mysql使用四个核,如第二个核,且对该核的使用不抢先八分之四
[[email protected] ~]# mkdir -p /cgroup/cpu/foo/ 
[[email protected] ~]# mkdir -p /cgroup/cpuset/foo/ 
[[email protected] ~]# echo 50000 > /cgroup/cpu/foo/cpu.cfs_quota_us 
[[email protected] ~]# echo 100000 > /cgroup/cpu/foo/cpu.cfs_period_us 
[[email protected] ~]# echo "0" > /cgroup/cpuset/foo/cpuset.mems 
[[email protected] ~]# echo "1" > /cgroup/cpuset/foo/cpuset.cpus 
[[email protected] ~]# echo 28819 > /cgroup/cpu/foo/tasks

中间:28819为mysqld的进度号。

内存限定测量试验

用调整组节制目的程序内部存款和储蓄器使用为1000000 byte,当然,要求root实行
echo "1000000" >memory.limit_in_bytes

日常更推荐用cgset来安装数值

cgset -r memory.limit_in_bytes=1000000 hzmali_test

接下来构造多个吃内部存款和储蓄器的次第,每运行贰遍内存使用就大幅增添

#vim memtest.sh

x="hahaha"

while [ True ];do

x=$x$x$x$x$x$x$x$x$x$x

sleep 1

done;

然后运维程序,并将经过pid写入mem上边调节组的tasks中

#./memtest.sh &

[1] 17638

# echo 17638 > /sys/fs/cgroup/memory/hzmali_test/tasks

行使cgclassify 能够将运转中的进程加到task中,借使调控组有八个财富的调控,使用命令会比echo方便广大

cgclassify -g mem:hzmali_test 17638

然后那货就在反复占内部存款和储蓄器,由于未有设置disable oom killing,所以最终会oom被kill掉

# cat /sys/fs/cgroup/memory/hzmali_test/memory.usage_in_bytes

966656

# cat /sys/fs/cgroup/memory/hzmali_test/memory.usage_in_bytes

978944

# cat /sys/fs/cgroup/memory/hzmali_test/memory.usage_in_bytes

995328

#

[1]+ Killed ./memtest.sh

CPU能源支配

各样进度能够攻下CPU多久, 哪天能够占有CPU是和系统的调整紧凑相关的.

Linux系统中有多样调治战略, 各类调节战略有其适用的气象, 也很难说哪一种调整计谋是最优的.

Linux的调治计谋能够参见代码: include/linux/sched.h

图片 7

/*
 * Scheduling policies
 */
#define SCHED_NORMAL        0
#define SCHED_FIFO        1
#define SCHED_RR        2
#define SCHED_BATCH        3
/* SCHED_ISO: reserved but not implemented yet */
#define SCHED_IDLE        5
/* Can be ORed in to make sure the process is reverted back to SCHED_NORMAL on fork */
#define SCHED_RESET_ON_FORK     0x40000000

图片 8

 

Linux 系统也提供了校勘调解计谋的通令和系统调用接口.

调用接口请查询有关文书档案, 这里根本介绍一下修正调整计策的下令 - chrt.

图片 9

# 在一个终端中执行
sleep 1000
# 打开另一个终端
ps -ef | grep sleep  # 找出 sleep 1000 的pid, 这里假设是 1234
chrt -p 1234         # 可以查看 pid=1234 的进程的 调度策略, 输入如下:
      pid 1234's current scheduling policy: SCHED_OTHER
      pid 1234's current scheduling priority: 0

chrt -p -f 10 1234   # 修改调度策略为 SCHED_FIFO, 并且优先级为10
chrt -p 1234         # 再次查看调度策略
      pid 1234's current scheduling policy: SCHED_FIFO
      pid 1234's current scheduling priority: 10

图片 10

 

补充:

  1. chrt 也足以直接钦命一条命令, 并设置那条命令的早期级的调治计策, 具体查看 chrt --help
  2. 翻看八个历程的调治战略, 除了使用 chrt 命令之外, 还足以 cat /proc/<PID>/sched

 

cgroup实例深入分析(手工业动态验证)

光复配置文件/etc/cgconfig.conf及/etc/cgrules.conf 为暗许配置。测量检验实例还是为mysql,测量试验工具为mysqlslap。

开启cgconfig及cgrules 服务
[[email protected] ~]# /etc/init.d/cgconfig restart 
Stopping cgconfig service: [ OK ] 
Starting cgconfig service: [ OK ] 
[[email protected] /]# /etc/init.d/cgred restart 
Stopping CGroup Rules Engine Daemon... [ OK ] 
Starting CGroup Rules Engine Daemon: [ OK ]

翻开mysqlslap压力测量检验程序
[[email protected] /]# /usr/local/mysql/bin/mysqlslap --defaults-file=/etc/my.cnf --concurrency=150 --iterations=1 --number-int-cols=8 --auto-generate-sql --auto-generate-sql-load-type=mixed --engine=innodb --number-of-queries=100000 -ujesse -pjesse --number-char-cols=35 --auto-generate-sql-add-autoincrement --debug-info -P3306 -h127.0.0.1

通过htop查看财富消耗。

实例2 - A group 占用全部CPU能源的 2/3, B group 占用全体CPU能源的 55%
  1. 情况同 实例1, 不再另行挂载 cgroup 文件系统, 也不在重新创建 A 和 B
  2. A group 的 cpu.shares 文件不改变, 值为 1024
  3. B group 的 cpu.shares 文件中的值改为 512, 那样, 也正是B占用CPU总能源的 四分之一 (因为 512 / (512+1024) = 1/2)
  4. 同实例1, 通过2个shell窗口, 分别是 A 和 B 的CPU使用率达到 百分百, 然后透过 top 查看CPU使用情状

 

图片 11

# 在 B 中shell 窗口执行以下命令
cat B/cpu.shares 
1024
echo 512 > B/cpu.shares 
cat B/cpu.shares 
512
stress -c 2

# 在 A 中 shell 窗口执行以下命令
stress -c 2

# 在第3个 shell 窗口, 也就是 非A, 非B 的那个 shell 窗口, 用 top 查看cpu使用情况
top
top - 14:13:18 up 46 min,  3 users,  load average: 2.24, 1.92, 1.01
Tasks:  78 total,   5 running,  73 sleeping,   0 stopped,   0 zombie
%Cpu(s):100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   1887872 total,   114744 used,  1773128 free,    10488 buffers
KiB Swap:  3982332 total,        0 used,  3982332 free,    45068 cached

 PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND                                                                                                                      
3376 root      20   0  6524   88    0 R  66.6  0.0   0:06.29 stress                                                                                                                       
3377 root      20   0  6524   88    0 R  66.6  0.0   0:06.30 stress                                                                                                                       
3373 root      20   0  6524   88    0 R  33.3  0.0   0:04.33 stress                                                                                                                       
3374 root      20   0  6524   88    0 R  33.3  0.0   0:04.32 stress               

# 查看这 4 个stress 进程是否分别属于 A 和 B
cat /mnt/cgroup/A/tasks 
2945
3375
3376    <-- stress 进程
3377    <-- stress 进程
cat /mnt/cgroup/B/tasks 
2996
3372
3373    <-- stress 进程
3374    <-- stress 进程

图片 12

很明显, A 组中的2个进程占用了CPU总量的 2/3 左右, B组中的2个进度占用了CPU总的数量的 二成 左右.

 

3)IO限制实例

跑三个消耗IO的测量检验
[[email protected] ~]# dd if=/dev/sda of=/dev/null 
因而iotop看io占用意况,磁盘读取速度到了50M/s

 
节制读取速度为10M/S

[[email protected] ~]# mkdir -p /cgroup/blkio/foo 
[[email protected] ~]# echo '8:0 10485760' > /cgroup/blkio/foo/blkio.throttle.read_bps_device
[[email protected] ~]# echo 45033 > /cgroup/blkio/foo/tasks 
注1:45033为dd的经过号
注2:8:0对应主设备号和副设备号,能够由此ls -l /dev/sda查看
[[email protected] ~]# ls -l /dev/sda 
brw-rw----. 1 root disk 8, 0 Sep 15 04:19 /dev/sda

洋洋时候须求测验程序在能源受限情状下的显现,普通的做法恐怕是不停对系统加压使可以分配给目的程序的能源降少,换另叁个思路思量,能够尝尝限定分配给目的程序的财富总的数量,使得机器状态正常的情景下让程序财富使用到达饱和。

转自:

本文由胜博发-运维发布,转载请注明来源:换另一个思路思考,CGroup 子系统或控制器