Skip to the content.

cgroup 的操作手册

需要注意到,如果切换到 /sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service 就不存在权限问题了。

所有的全部都集中到

code/src/m/scripts/cgroup.sh 中去吧

cpuset

https://www.redhat.com/en/blog/world-domination-cgroups-part-6-cpuset

sudo cgcreate -g cpuset:testset
sudo cgset -r cpuset.cpus=3 testset
sudo cgset -r cpuset.mems=1 testset
sudo cgexec -g cpuset:testset stress-ng --vm-bytes 6500M --vm-keep --vm 3

这个需要配合 qemu numa 工具来解决

当前的状态可以通过 cat /proc/self/status 中来检查,例如在一个 numa node 为 16 的环境中,

Cpus_allowed:   3fffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff
Cpus_allowed_list:      0-253
Mems_allowed:   00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,0000ffff
Mems_allowed_list:      0-15

似乎 Mems_allowed 展示了系统中一共支持多少个内存。

问题是,我系统中并没有那么多 numa node 啊!

io

sudo cgcreate -g io:A
sudo cgexec -g io:A fio test.fio
➜  ~ cat /sys/fs/cgroup/A/io.stat
259:0 rbytes=859275264 wbytes=0 rios=209784 wios=0 dbytes=0 dios=0
253:0 rbytes=5566464 wbytes=0 rios=13 wios=0 dbytes=0 dios=0

memcontrol

  1. 在第一个终端中运行运行
cgcreate -g memory:mem
watch --interval 1 cgget -g memory:mem # 此时,其中大多数都是 0
  1. 在另一个 shell 中运行
    cgexec -g memory:mem stress-ng --vm-bytes 150M --vm-keep --vm 1
    
  2. 两边都关闭,然后设置 limit
    cgset -r memory.max=100m mem
    
  3. 重新运行 stress 之后,可以得到 oom

io

cgcreate -g io:duck
cd /sys/fs/cgroup/duck
echo "8:16  wiops=1000" > io.max
cgexec -g io:duck dd if=/dev/zero of=/dev/sdb bs=1M count=1000

cpu

cpu

cgcreate -g cpu:C

# -c 0 是所有的 CPU,其他数值表示 worker 的数量
# -l 使用 CPU 的多少
# 自动运行所有的负载
cgexec -g cpu:C stress-ng -c 0 -l 100 &

# 设置之前,会占满一个 CPU,之后只会占用一个 CPU 的 10%
cgset -r cpu.max="1000000" C

cgset -r cpu.weight.nice=19 C

cgdelete -g cpu:C

其他的 libcgroup

  1. cgcreate -g memory,hugeltb:duck # 多个限制
  2. cgcreate -g cpu:a/b/c 创建嵌套的

cpuset

taskset 和 numactl

cgcreate -g cpuset:C
cgset -r cpuset.cpus="2-4" C
cgset -r cpuset.cpus.partition="root" C

cgexec -g cpu:C stress-ng -c 0 -l 100 &

将 partition 设置为 root 之后,此外 cpuset.cpus 不见了:

➜  ~ cat /sys/fs/cgroup/cpuset.cpus.effective
0-7
➜  ~ cgset -r cpuset.cpus.partition="root" C
➜  ~ cat /sys/fs/cgroup/cpuset.cpus.effective
0-1,5-7

检查当前配置

lscgroup

才知道有这个小技巧,通过 CGROUP_LOGLEVEL 来显示更多的信息: https://unix.stackexchange.com/questions/725112/using-cgroups-v2-without-root

🤒  CGROUP_LOGLEVEL=INFO cgexec -g memory:user.slice/user-1000.slice/user@1000.service/user.slice/qemu ls
Warning: cannot write tid 495573 to /sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service/user.slice/qemu/cgroup.procs:Permission denied
Warning: cgroup_attach_task_pid failed: 50007
cgroup change of group failed

cgexec 的这个技术,提前知道进程 pid,到时候用于 ftrace 来跟踪。

系统配置项目

cgroup 一些不受控的地方

https://engineering.linkedin.com/blog/2016/08/don_t-let-linux-control-groups-uncontrolled

这个接口有使用过?

https://stackoverflow.com/questions/55507022/how-to-make-cpuset-cpu-exclusive-function-of-cpuset-work-correctly

有趣的 slides

https://www.usenix.org/system/files/lisa21_slides_down.pdf

网络为什么没有 cgroup ?

root@192:/sys/fs/cgroup# cat cgroup.controllers
cpuset cpu io memory hugetlb pids rdma misc
config CGROUP_NET_PRIO
	bool "Network priority cgroup"
	depends on CGROUPS
	select SOCK_CGROUP_DATA
	help
	  Cgroup subsystem for use in assigning processes to network priorities on
	  a per-interface basis.

config CGROUP_NET_CLASSID
	bool "Network classid cgroup"
	depends on CGROUPS
	select SOCK_CGROUP_DATA
	help
	  Cgroup subsystem for use as general purpose socket classid marker that is
	  being used in cls_cgroup and for netfilter matching.

net/core/netprio_cgroup.c

看上去还是只是 v1 支持,

struct cgroup_subsys net_prio_cgrp_subsys = {
	.css_alloc	= cgrp_css_alloc,
	.css_online	= cgrp_css_online,
	.css_free	= cgrp_css_free,
	.attach		= net_prio_attach,
	.legacy_cftypes	= ss_files,
};

猜测是因为本来存在 qdisc 以及拥塞控制,导致内核无需

勉强看看

https://www.redhat.com/en/blog/world-domination-cgroups-part-6-cpuset

https://engineering.linkedin.com/blog/2016/08/don_t-let-linux-control-groups-uncontrolled

v2 是存在详细的内核文档的

Documentation/admin-guide/cgroup-v2.rst

https://stackoverflow.com/questions/70064457/move-a-process-to-a-new-cgroup-in-cgroup-v2

这个不错

应该可以配合 docker 来测试

看看如果限制了 container 的资源之后,结果是什么样的

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。