
grep CONFIG_CGROUPS=y /boot/config-$(uname -r)
CONFIG_CGROUPS=y
grep CONFIG_CGROUP_SCHED=y /boot/config-$(uname -r)
CONFIG_CGROUP_SCHED=y
stat -fc %T /sys/fs/cgroup/
cgroup2fs # 当前使用 cgroup v2tmpfs # 当前使用 cgroup v1
ls /sys/fs/cgroup/
cgroup.controllers cgroup.threads init.scope memory.numa_stat sys-kernel-debug.mountcgroup.max.depth cpu.pressure io.cost.model memory.pressure sys-kernel-tracing.mountcgroup.max.descendants cpuset.cpus.effective io.cost.qos memory.reclaim system.slicecgroup.pressure cpuset.mems.effective io.pressure memory.stat user.slicecgroup.procs cpu.stat io.prio.class misc.capacitycgroup.stat dev-hugepages.mount io.stat sys-fs-fuse-connections.mountcgroup.subtree_control dev-mqueue.mount irq.pressure sys-kernel-config.mount
ls /sys/fs/cgroup/
blkio cpuacct cpuset freezer memory net_cls net_prio pids systemdcpu cpu,cpuacct devices hugetlb misc net_cls,net_prio perf_event rdma unified
/proc/cgroups 确认当前 cgroup 支持的子系统:cat /proc/cgroups
#subsys_name hierarchy num_cgroups enabledcpuset 0 132 1cpu 0 132 1cpuacct 0 132 1blkio 0 132 1memory 0 132 1devices 0 132 1freezer 0 132 1net_cls 0 132 1perf_event 0 132 1net_prio 0 132 1hugetlb 0 132 1pids 0 132 1rdma 0 132 1misc 0 132 1
/sys/fs/cgroup/cgroup.controllers 确认当前 cgroup 层次结构中已启用的子系统:cat /sys/fs/cgroup/cgroup.controllers
cpuset cpu io memory hugetlb pids rdma misc
mount 命令向指定挂载点添加系统支持且未启用的子系统:mkdir -p /mnt/cgroups/freezermount -t cgroup -o freezer freezer /mnt/cgroups/freezerls /mnt/cgroups/freezer/
cgroup.clone_children cgroup.procs cgroup.sane_behavior notify_on_release release_agent tasks
lscgroup 确认子系统已添加:lscgroup | grep freezer
freezer:/
umount 命令卸载:umount /mnt/cgroups/freezer
systemd-cgls 命令可以查看 cgroup 的层级结构:systemd-cgls
Control group /:-.slice├─user.slice (#1203)│ → user.invocation_id: f7d3942d34cd4635a9a1567f35cf247a│ → trusted.invocation_id: f7d3942d34cd4635a9a1567f35cf247a│ └─user-0.slice (#41553)│ → user.invocation_id: d1ff03802e014648a616ac2bdafbb73a...├─init.scope (#25)│ └─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 31└─system.slice (#65)├─rngd.service (#2701)│ → user.invocation_id: eb2c44177aec4afc8095560dc6269402│ → trusted.invocation_id: eb2c44177aec4afc8095560dc6269402│ └─674 /usr/sbin/rngd -f -x pkcs11 -x nist...
systemd-run 命令可以创建、启动临时 service 或 scope 单位,并在此单位中运行自定义指令,格式如下:systemd-run --unit=name --scope --slice=<slice_name> command
slice 则默认属于 system.slice。systemctl set-property 来修改 cgroup:systemctl set-property name parameter=value
man 5 systemd.resource-control
dnf install -y libcgroup-tools
lscgroup 来显示 cgroup 层次结构,可以直接列出当前全量的已启用 cgroup 子系统信息:lscgroup
cpuset,cpu,io,memory,hugetlb,pids,rdma,misc:/cpuset,cpu,io,memory,hugetlb,pids,rdma,misc:/sys-fs-fuse-connections.mountcpuset,cpu,io,memory,hugetlb,pids,rdma,misc:/sys-kernel-config.mountcpuset,cpu,io,memory,hugetlb,pids,rdma,misc:/sys-kernel-debug.mountcpuset,cpu,io,memory,hugetlb,pids,rdma,misc:/dev-mqueue.mount...
lscgroup -g cpuset:/sys-fs-fuse-connections.mount
cpuset,cpu,io,memory,hugetlb,pids,rdma,misc:/sys-fs-fuse-connections.mount/
cgcreate/cgdelete 这一对命令用来创建/删除控制群组。mkdir -p /mnt/cgroups/freezermount -t cgroup -o freezer freezer /mnt/cgroups/freezer
cgcreate 创建控制群组:cgcreate -g freezer:/cgcreate_child
lscgroup 命令确认:lscgroup | grep freezer
freezer:/freezer:/freezerfreezer:/cgcreate_child
/mnt/cgroups/freezer 目录下就多了 cgcreate_child 子目录,下面有 freezer 相关的文件:ls /mnt/cgroups/freezer/cgcreate_child/
cgroup.clone_children freezer.parent_freezing freezer.state taskscgroup.procs freezer.self_freezing notify_on_release
mkdir 的方式替代 cgcreate:mkdir /mnt/cgroups/freezer/childgroup
lscgroup 确认创建结果:lscgroup | grep freezer
freezer:/freezer:/freezerfreezer:/childgroupfreezer:/cgcreate_child
ls /mnt/cgroups/freezer/childgroup
cgroup.clone_children freezer.parent_freezing freezer.state taskscgroup.procs freezer.self_freezing notify_on_release
cgdelete 命令删除子群组:cgdelete freezer:/cgcreate_childcgdelete freezer:/childgroup
lscgroup | grep freezer
freezer:/freezer:/freezer
cgexec 指令在手动创建的 cgroup 中启动进程。cgexec 的语法为:cgexec -g controllers:path_to_cgroup command arguments
cgclassify 指令将进程移动到 cgroup 中:cgclassify -g controllers:path_to_cgroup pidlist
childgroup 中示例:cgclassify -g freezer:/childgroup 15729
childgroup 中的进程列表:cat /mnt/cgroups/freezer/childgroup/tasks
15729
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#define SIZE 1024 * 10 // 10kBint main() {char *ptr;while (1) {ptr = (char *) malloc(SIZE);memset(ptr, 0, SIZE);sleep (1);}return 0;}
systemd-run 命令拉起服务:systemd-run --unit=my_malloc --slice=test ./my_malloc
systemd-cgls 命令查到服务:systemd-cgls
Control group /:-.slice...├─test.slice (#5581)│ → user.invocation_id: 41e6db3f95094ae99a7f4d7ce471d3a1│ → trusted.invocation_id: 41e6db3f95094ae99a7f4d7ce471d3a1│ └─my_malloc.service (#5637)│ → user.invocation_id: 02d4d4b8d38b4101b5f6ef5af2addfb3│ → trusted.invocation_id: 02d4d4b8d38b4101b5f6ef5af2addfb3│ └─2124 /home/./my_malloc
slice 则默认属于 system.slice:systemd-run --unit=my_malloc ./my_malloc
systemd-cgls
Control group /:-.slice├─user.slice (#1123)│ → user.invocation_id: 17274220636d448c8b14dca5d4ce1d45│ → trusted.invocation_id: 17274220636d448c8b14dca5d4ce1d45...└─system.slice (#65)...├─my_malloc.service (#4501)│ → user.invocation_id: 7d25225645844d228f300b1f6dc21905│ → trusted.invocation_id: 7d25225645844d228f300b1f6dc21905│ └─2146 /home/./my_malloc
ls /sys/fs/cgroup/test.slice/my_malloc.service
cgroup.controllers cgroup.threads memory.low memory.swap.eventscgroup.events cgroup.type memory.max memory.swap.highcgroup.freeze cpu.pressure memory.min memory.swap.maxcgroup.kill cpu.stat memory.numa_stat memory.zswap.currentcgroup.max.depth io.pressure memory.oom.group memory.zswap.maxcgroup.max.descendants irq.pressure memory.peak pids.currentcgroup.pressure memory.current memory.pressure pids.eventscgroup.procs memory.events memory.reclaim pids.maxcgroup.stat memory.events.local memory.stat pids.peakcgroup.subtree_control memory.high memory.swap.current
memory.max 默认是 max,我们通过 systemctl 设置其为 10k。先查看当前值:cat memory.max
max
systemctl set-property my_malloc.service MemoryMax=10K
systemctl status my_malloc
× my_malloc.service - /home/./my_mallocLoaded: loaded (/run/systemd/transient/my_malloc.service; transient)Transient: yesDrop-In: /run/systemd/transient/my_malloc.service.d└─50-MemoryMax.confActive: failed (Result: oom-kill) since Tue 2023-05-23 17:20:46 CST; 12s agoDuration: 6min 15.691sProcess: 2124 ExecStart=/home/./my_malloc (code=killed, signal=KILL)Main PID: 2124 (code=killed, signal=KILLCPU: 16msMay 23 17:14:30 controller systemd[1]: Started my_malloc.service - /home/./my_malloc.May 23 17:20:46 controller systemd[1]: my_malloc.service: A process of this unit has been killed by the OO>May 23 17:20:46 controller systemd[1]: my_malloc.service: Main process exited, code=killed, status=9/KILLMay 23 17:20:46 controller systemd[1]: my_malloc.service: Failed with result 'oom-kill'.
/sys/fs/cgroup 管理 taskcat /sys/fs/cgroup/cgroup.subtree_control
cpuset cpu io memory pids
echo "+memory" >> /sys/fs/cgroup/cgroup.subtree_control
man 命令来查询 cgroup.subtree_control 的具体使用方法:man 7 cgroups
/sys/fs/cgroup/Example/ 目录:mkdir /sys/fs/cgroup/Example/
ls /sys/fs/cgroup/Example/
cgroup.controllers cgroup.type cpuset.mems memory.events memory.statcgroup.events cpu.idle cpuset.mems.effective memory.events.local memory.swap.currentcgroup.freeze cpu.max io.bfq.weight memory.high memory.swap.eventscgroup.kill cpu.max.burst io.latency memory.low memory.swap.highcgroup.max.depth cpu.pressure io.max memory.max memory.swap.maxcgroup.max.descendants cpu.stat io.pressure memory.min memory.zswap.currentcgroup.pressure cpu.weight io.prio.class memory.numa_stat memory.zswap.maxcgroup.procs cpu.weight.nice io.stat memory.oom.group pids.currentcgroup.stat cpuset.cpus io.weight memory.peak pids.eventscgroup.subtree_control cpuset.cpus.effective irq.pressure memory.pressure pids.maxcgroup.threads cpuset.cpus.partition memory.current memory.reclaim pids.peak
Example/cgroup.subtree_control 需要使能,刚创建的时候为空:cat /sys/fs/cgroup/Example/cgroup.subtree_control
echo "+memory" >> /sys/fs/cgroup/Example/cgroup.subtree_control
cat /sys/fs/cgroup/Example/cgroup.subtree_control
memory
/sys/fs/cgroup/Example/tasks/ 目录:mkdir /sys/fs/cgroup/Example/tasks/
ls /sys/fs/cgroup/Example/tasks/
cgroup.controllers cgroup.procs io.pressure memory.max memory.statcgroup.events cgroup.stat irq.pressure memory.min memory.swap.currentcgroup.freeze cgroup.subtree_control memory.current memory.numa_stat memory.swap.eventscgroup.kill cgroup.threads memory.events.local memory.peak memory.swap.highcgroup.max.depth cgroup.type memory.high memory.pressure memory.swap.maxcgroup.max.descendants cpu.pressure memory.low memory.reclaim memory.zswap.current
cat /sys/fs/cgroup/Example/tasks/memory.max
max
echo "10K" > /sys/fs/cgroup/Example/tasks/memory.max
cat /sys/fs/cgroup/Example/tasks/memory.max
8192
echo 的是 10k,但是显示的是 8k,说明是按照 4k 对齐的。./my_malloc &
[1] 2475
echo "2475" > /sys/fs/cgroup/Example/tasks/cgroup.procs
kill :[1]+ Killed ./my_malloc
cgconfig.conf 管理子系统/etc/cgconfig.conf 后使能服务即可完成对层级的操作,下面举例说明。cat /proc/cgroups
#subsys_name hierarchy num_cgroups enabledcpuset 0 90 1cpu 0 90 1cpuacct 0 90 1blkio 0 90 1memory 0 90 1devices 0 90 1freezer 0 90 1net_cls 0 90 1perf_event 0 90 1net_prio 0 90 1hugetlb 0 90 1pids 0 90 1rdma 0 90 1misc 0 90 1
lscgroup | grep freezer
systemctl status cgconfig
× cgconfig.service - Control Group configuration serviceLoaded: loaded (/usr/lib/systemd/system/cgconfig.service; disabled; vendor preset: disabled)Active: failed (Result: exit-code) since Tue 2023-05-23 20:53:49 CST; 1min 10s agoProcess: 2420 ExecStart=/usr/sbin/cgconfigparser -l /etc/cgconfig.conf -s 1664 (code=exited, status=101)Main PID: 2420 (code=exited, status=101)CPU: 3msMay 23 20:53:49 controller systemd[1]: Starting cgconfig.service - Control Group configuration service...May 23 20:53:49 controller cgconfigparser[2420]: /usr/sbin/cgconfigparser; error loading /etc/cgconfig.conf: Cgroup mounting failedMay 23 20:53:49 controller cgconfigparser[2420]: Error: cannot mount memory to /mnt/cgroups/memory: Device or resource busyMay 23 20:53:49 controller systemd[1]: cgconfig.service: Main process exited, code=exited, status=101/n/aMay 23 20:53:49 controller systemd[1]: cgconfig.service: Failed with result 'exit-code'.May 23 20:53:49 controller systemd[1]: Failed to start cgconfig.service - Control Group configuration service.
/etc/cgconfig.conf 输入如下内容:mount {freezer = /mnt/cgroups/freezer;}
systemctl restart cgconfig
systemctl enable cgconfig
/mnt/cgroups/freezer 目录下就会有子系统文件:ls /mnt/cgroups/freezer/
cgroup.clone_children cgroup.procs cgroup.sane_behavior notify_on_release release_agent tasks
mkdir -p /mnt/cgroups/freezermount -t cgroup -o freezer freezer /mnt/cgroups/freezer
文档反馈