1. 按群分组
Cgroup 按群分组,分配资源,属于二级分配
(1)按群组分配资源
将进程分组,多个组按权重分配 CPU 配额,单个组内任务再按进程调度算法分配
案例:启动三个 a.out,一共耗 CPU800%(八核)
创建两个 CGROUP:A 和 B
cd /sys/fs/cgroup/cpu
sudo mkdir A
sudo mkdir B
关注 A / B 中两个成员,
cgroup.procs:本群组包含的进程
cpu.shares:本组权重值,与其他组竞争的权重值;
将进程 1164/1184 加入组 A,1147 加入组 B
查看 CPU 占用情况:
即组 A 两进程之和与组 B 相当,因为默认权重相等;
修改组 A 权重值为 2048
echo 2048 > cpu.shares
三进程 CPU 占有率变为均等
修改组 A 权重值为 512
echo 512 > cpu.shares
上图看到组 A 的进程 1164,1184CPU 占用率加起来大概是组 B 一半
这里 cgroup.procs 里的进程号是动态的,进程死亡,这里进程号就会消失;
(2)设置群的 quota 配额:
cpu.cfs_perid_us: 默认 100ms;
cpu.cfs_quota_us:设置该群组最大可占用 CPU 比例;
群 A 的 CPU 占用最大 8000/100000; cfs_quota_us 可以超过 100%, 最多不超过 CPU 个数;
类似网络带宽,按付费给予配额。
还可以进一步分配每个 CPU 的具体任务,参考 cgroup 文档。
cgroup 应用案例 1:
Android 新版本中,将任务分为前端进程组,后端进程组,分配不同权重
这样前端进程会分配更多 CPU,后端进程 (比如后台运行支付宝和微信等) 组占用 CPU 较少,合理的提高了 CPU 利用率,提高交互型,用户体验更好。
cgroup 应用案例 2:
在云服务中,用 Cgroup 限制 CPU 配额,根据支付费用分配 CPU 资源,即使有多余 CPU 资源存在,付费用户得到的 CPU 资源也不会比原本更多。
2.sched_autogroup:
So I think this is firmly one of those“real improvement”patches. Good job. By
Linus
每一个 seesion,自动创建一个 group, 也可以关闭
leon@pc:/proc/sys/kernel\$ cat sched_autogroup_enabled
1
群默认权重是一样的,所有每个新 seesion 的 CPU 占有率都相同,也可以设置 nice;
每个 seesion 的所有进程都在一个 group;
3 dock 和 cgroup
启动每个 docker 是一个 group,可以设置其 CPU 占用 quota
docker run --cpu-quota 25000 --cpu-period 10000 --cpu-shares 30
linuxep/lepv0.1
4 systemd 和 cgroup
systemd 是应用层用来管理服务群组的层级关系;跟 cgroup 非常类似,
它是一个动态过程,只有设置资源限制,才会跟 cgroup 线程一一对应起来;
systemd cg 相关命令
systemd-cgls
systemd-cgtop
systemd-run
systemctl
set-property 限制 cgroup 的资源
sudo systemd-run -p --unit=test --slice=test ./a.out 4
sudo systemd-run -p CPUQuota=25% --unit=test --slice=test ./a.out 4
─test.slice
│ └─test.service
│ └─7850 /home/leon/xxx/./a.out 4
cgroup 的 cpu 目录会生成对应 test 配置文件
5 cpuset 和 cgroup
将 CPU 添加到 cgroup 群组,将进程添加入该群组,就限制在该群组的 CPU 运行,特别适用 NUMA 的场景
可以设置 cpuset.cpus
cpuset.mems
在:/sys/fs/cgroup/cpuset 创建组 A,然后往 A 添加进程,设置 A 目录下的 cpuset.cpus。
leon@:echo 0-1 > cpuset.cpus
该组的进程就只限制在指定 CPU 上运行;
ps: 另外 cgroup 同样可以对内存和 IO 做群组管理。