欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux内核之进程调度5:Cgroup

程序员文章站 2024-02-27 19:39:03
...

1.按群分组

Cgroup按群分组,分配资源,属于二级分配

Linux内核之进程调度5:Cgroup

(1)按群组分配资源

将进程分组,多个组按权重分配CPU配额,单个组内任务再按进程调度算法分配

案例:启动三个a.out,一共耗CPU800%(八核)

Linux内核之进程调度5:Cgroup

创建两个CGROUP:A和B

cd /sys/fs/cgroup/cpu
sudo mkdir A
sudo mkdir B

关注A/B中两个成员,

cgroup.procs:本群组包含的进程

cpu.shares:本组权重值,与其他组竞争的权重值;

Linux内核之进程调度5:Cgroup

将进程1164/1184加入组A,1147加入组B

查看CPU占用情况:

Linux内核之进程调度5:Cgroup

即组A两进程之和与组B相当,因为默认权重相等;

修改组A权重值为2048

echo 2048 > cpu.shares

Linux内核之进程调度5:Cgroup

三进程CPU占有率变为均等

Linux内核之进程调度5:Cgroup

修改组A权重值为512

echo 512 > cpu.shares

Linux内核之进程调度5:Cgroup

上图看到组A的进程1164,1184CPU占用率加起来大概是组B一半

这里cgroup.procs里的进程号是动态的,进程死亡,这里进程号就会消失;

Linux内核之进程调度5:Cgroup

(2)设置群的quota配额:

cpu.cfs_perid_us: 默认100ms;

cpu.cfs_quota_us: 设置该群组最大可占用CPU比例;

Linux内核之进程调度5:Cgroup

群A的CPU占用最大8000/100000; cfs_quota_us可以超过100%, 最多不超过CPU个数;

类似网络带宽,按付费给予配额。

还可以进一步分配每个CPU的具体任务,参考cgroup文档。

cgroup应用案例1:

Android新版本中,将任务分为前端进程组,后端进程组,分配不同权重

Linux内核之进程调度5:Cgroup

这样前端进程会分配更多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, 也可以关闭

aaa@qq.com:/proc/sys/kernel\$ cat sched_autogroup_enabled

1

群默认权重是一样的,所有每个新seesion的CPU占有率都相同,也可以设置nice;

每个seesion的所有进程都在一个group;

Linux内核之进程调度5:Cgroup

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

Linux内核之进程调度5:Cgroup

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

Linux内核之进程调度5:Cgroup

─test.slice

│ └─test.service

│  └─7850 /home/leon/xxx/./a.out 4

cgroup的cpu目录会生成对应test配置文件

Linux内核之进程调度5:Cgroup

5 cpuset和cgroup

将CPU添加到cgroup群组,将进程添加入该群组,就限制在该群组的CPU运行,特别适用NUMA的场景

Linux内核之进程调度5:Cgroup

可以设置cpuset.cpus

cpuset.mems

在:/sys/fs/cgroup/cpuset创建组A,然后往A添加进程,设置A目录下的cpuset.cpus。

aaa@qq.com:echo 0-1 > cpuset.cpus

该组的进程就只限制在指定CPU上运行;

ps:另外cgroup同样可以对内存和IO做群组管理。