searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

cgroup笔记

2023-10-26 02:39:16
2
0

cgroups, control groups(控制群组)的简写,是linux内核的一个功能,用来限制、控制与分离一个进程资源(如cpu、内存、磁盘等)。

那么linux又是如何让用户态的进程使用到cgroup(内核态)的功能呢?

答:Linux通过文件系统,将cgroups的功能和配置暴露给用户,cgroup是一组通过cgroup文件系统限制的进程集合。

可以通过mount命令查看cgroup挂载信息

$ mount -t cgroup
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)

涉及到cpu调度的参数主要有3个

  • cpu.cfs_period_us,一个调度周期。默认值是100000,也就 100us。一般我们不会去修改这个参数的值。

  • cpu.cfs_quota_us,在一个调度周期里被允许的运行时间,比如这个值为 50000 时,就是 50us。默认值是-1,即没有限制。cpu.cfs_quota_us / cpu.cfs_period_us = 50000 / 100000 = 0.5, 即这个控制组被允许使用的 CPU 最大配额就是 0.5 个 CPU。top上看到的就是50%。 下文我们可以看到仅仅就通过修改cpu.cfs_quota_us的值就修改了进程的cpu使用率。

  • cpu.shares。这个值是 CPU Cgroup 对于控制组之间的 CPU 分配比例,默认值是 1024如果组1的cpu.shares值是1024,组2的cpu.shares值是3072。那么组1和组2各自的分配比例就是1:3

创建cpu控制组

mkdir -p /sys/fs/cgroup/cpu/test-group/group1
mkdir -p /sys/fs/cgroup/cpu/test-group/group2

创建好后,目录下自动就有下面这些文件

注:test-group目录下同样有这些文件

$ ls -l /sys/fs/cgroup/cpu/test-group
total 0
-rw-r--r-- 1 root root 0 Mar 20 22:17 cgroup.clone_children
--w--w--w- 1 root root 0 Mar 20 22:17 cgroup.event_control
-rw-r--r-- 1 root root 0 Mar 20 22:17 cgroup.procs
-r--r--r-- 1 root root 0 Mar 20 22:17 cpuacct.stat
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpuacct.usage
-r--r--r-- 1 root root 0 Mar 20 22:17 cpuacct.usage_percpu
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpu.rt_period_us
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpu.shares
-r--r--r-- 1 root root 0 Mar 20 22:17 cpu.stat
drwxr-x--- 2 root root 0 Mar 20 22:17 group1
-rw-r--r-- 1 root root 0 Mar 20 22:17 notify_on_release
-rw-r--r-- 1 root root 0 Mar 20 22:17 tasks

$ ls -l /sys/fs/cgroup/cpu/test-group/group1/
total 0
-rw-r--r-- 1 root root 0 Mar 20 22:17 cgroup.clone_children
--w--w--w- 1 root root 0 Mar 20 22:17 cgroup.event_control
-rw-r--r-- 1 root root 0 Mar 20 22:17 cgroup.procs
-r--r--r-- 1 root root 0 Mar 20 22:17 cpuacct.stat
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpuacct.usage
-r--r--r-- 1 root root 0 Mar 20 22:17 cpuacct.usage_percpu
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpu.rt_period_us
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpu.shares
-r--r--r-- 1 root root 0 Mar 20 22:17 cpu.stat
-rw-r--r-- 1 root root 0 Mar 20 22:17 notify_on_release
-rw-r--r-- 1 root root 0 Mar 20 22:17 tasks

说明

  • tasks:当前 cgroup 包含的任务(task)pid 列表,把某个进程的 pid 添加到这个文件中就等于把进程交由到该cgroup控制。

  • cgroup.procs:使用逻辑和tasks相同。

  • notify_on_release:0或者1,该文件的内容为1时,当cgroup退出时(不再包含任何进程和子cgroup),将调用release_agent里面配置的命令。

  • release_agent:需要执行的命令。

配置示例

限制使用2个CPU(内核)(每500ms能使用1000ms的CPU时间,即使用两个内核)

# echo 1000000 > cpu.cfs_quota_us
# echo 500000 > cpu.cfs_period_us

添加任务进程到cgroup

echo PID > tasks

一次只能添加一个任务进程ID。如果有多个任务ID,需分多次添加。

cgroup各个子系统初始化时,默认把系统中所有进程都纳管了,将一个进程的pid添加到新建的cgroup tasks文件的操作,实际是从一个cgroup移入到另一个cgroup的操作。所以要将进程从某个cgroup中删除,只能通过将其移出到另一个cgroup来实现,或者将进程终止。

0条评论
作者已关闭评论
zzzzgj
9文章数
1粉丝数
zzzzgj
9 文章 | 1 粉丝
原创

cgroup笔记

2023-10-26 02:39:16
2
0

cgroups, control groups(控制群组)的简写,是linux内核的一个功能,用来限制、控制与分离一个进程资源(如cpu、内存、磁盘等)。

那么linux又是如何让用户态的进程使用到cgroup(内核态)的功能呢?

答:Linux通过文件系统,将cgroups的功能和配置暴露给用户,cgroup是一组通过cgroup文件系统限制的进程集合。

可以通过mount命令查看cgroup挂载信息

$ mount -t cgroup
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)

涉及到cpu调度的参数主要有3个

  • cpu.cfs_period_us,一个调度周期。默认值是100000,也就 100us。一般我们不会去修改这个参数的值。

  • cpu.cfs_quota_us,在一个调度周期里被允许的运行时间,比如这个值为 50000 时,就是 50us。默认值是-1,即没有限制。cpu.cfs_quota_us / cpu.cfs_period_us = 50000 / 100000 = 0.5, 即这个控制组被允许使用的 CPU 最大配额就是 0.5 个 CPU。top上看到的就是50%。 下文我们可以看到仅仅就通过修改cpu.cfs_quota_us的值就修改了进程的cpu使用率。

  • cpu.shares。这个值是 CPU Cgroup 对于控制组之间的 CPU 分配比例,默认值是 1024如果组1的cpu.shares值是1024,组2的cpu.shares值是3072。那么组1和组2各自的分配比例就是1:3

创建cpu控制组

mkdir -p /sys/fs/cgroup/cpu/test-group/group1
mkdir -p /sys/fs/cgroup/cpu/test-group/group2

创建好后,目录下自动就有下面这些文件

注:test-group目录下同样有这些文件

$ ls -l /sys/fs/cgroup/cpu/test-group
total 0
-rw-r--r-- 1 root root 0 Mar 20 22:17 cgroup.clone_children
--w--w--w- 1 root root 0 Mar 20 22:17 cgroup.event_control
-rw-r--r-- 1 root root 0 Mar 20 22:17 cgroup.procs
-r--r--r-- 1 root root 0 Mar 20 22:17 cpuacct.stat
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpuacct.usage
-r--r--r-- 1 root root 0 Mar 20 22:17 cpuacct.usage_percpu
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpu.rt_period_us
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpu.shares
-r--r--r-- 1 root root 0 Mar 20 22:17 cpu.stat
drwxr-x--- 2 root root 0 Mar 20 22:17 group1
-rw-r--r-- 1 root root 0 Mar 20 22:17 notify_on_release
-rw-r--r-- 1 root root 0 Mar 20 22:17 tasks

$ ls -l /sys/fs/cgroup/cpu/test-group/group1/
total 0
-rw-r--r-- 1 root root 0 Mar 20 22:17 cgroup.clone_children
--w--w--w- 1 root root 0 Mar 20 22:17 cgroup.event_control
-rw-r--r-- 1 root root 0 Mar 20 22:17 cgroup.procs
-r--r--r-- 1 root root 0 Mar 20 22:17 cpuacct.stat
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpuacct.usage
-r--r--r-- 1 root root 0 Mar 20 22:17 cpuacct.usage_percpu
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpu.rt_period_us
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 Mar 20 22:17 cpu.shares
-r--r--r-- 1 root root 0 Mar 20 22:17 cpu.stat
-rw-r--r-- 1 root root 0 Mar 20 22:17 notify_on_release
-rw-r--r-- 1 root root 0 Mar 20 22:17 tasks

说明

  • tasks:当前 cgroup 包含的任务(task)pid 列表,把某个进程的 pid 添加到这个文件中就等于把进程交由到该cgroup控制。

  • cgroup.procs:使用逻辑和tasks相同。

  • notify_on_release:0或者1,该文件的内容为1时,当cgroup退出时(不再包含任何进程和子cgroup),将调用release_agent里面配置的命令。

  • release_agent:需要执行的命令。

配置示例

限制使用2个CPU(内核)(每500ms能使用1000ms的CPU时间,即使用两个内核)

# echo 1000000 > cpu.cfs_quota_us
# echo 500000 > cpu.cfs_period_us

添加任务进程到cgroup

echo PID > tasks

一次只能添加一个任务进程ID。如果有多个任务ID,需分多次添加。

cgroup各个子系统初始化时,默认把系统中所有进程都纳管了,将一个进程的pid添加到新建的cgroup tasks文件的操作,实际是从一个cgroup移入到另一个cgroup的操作。所以要将进程从某个cgroup中删除,只能通过将其移出到另一个cgroup来实现,或者将进程终止。

文章来自个人专栏
zzz
9 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0