Linux内核之进程5:Cgroup

1.按群分组

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QnWqYynQ-1598441789075)(media/6d33df1aeb02bae91194b74bb34a33bf.png)]

(1)按群组分配资源

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

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

![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pssRvPmV-1598441789079)(media/23357b61ef_center)

创建两个CGROUP:A和B

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

关注A/B中两个成员,

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5ky7XskW-1598441789080)(media/f5da32a92320716e9f1af8d61d320ebf.png)]

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

查看CPU占用情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5qHQzMTQ-1598441789083)(media/cd4646586bd0dc67503bdda77515991a.png)]

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

修改组A权重值为2048

echo 2048 > cpu.shares

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I35cKtid-1598441789084)(media/50369f3338c2883263791ca1aa641995.png)]

三进程CPU占有率变为均等

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WR833zR2-1598441789085)(media/12d2b40c5c839d163dcb217bac901c84.png)]

修改组A权重值为512

echo 512 > cpu.shares

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vKEQZTYH-1598441789087)(media/17826bff0b871b9ab33f235525dc2a40.png)]

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yqaq8eZk-1598441789088)(media/4f9ec1f5e9f945c788998e43bbbfbc5e.png)]

(2)设置群的quota配额:

cpu.cfs_perid_us: 默认100ms;

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E00Bfrf2-1598441789088)(media/db2199603a274a16ad835fa5a362b2c7.png)]

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

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

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

cgroup应用案例1:

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QD0tOWvn-1598441789089)(media/1442e71d74aa4ea7e3507f25a40c1733.png)]

这样前端进程会分配更多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;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jtPocod8-1598441789090)(media/8243449d57f66dbbe9029b70b9b4480b.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kPcer4dI-1598441789091)(media/99979346f60c7242835618bbe7f0d35d.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kmnkUJ38-1598441789092)(media/665bc01d75891479aa350c4b8a455f7b.png)]

─test.slice

│ └─test.service

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zjiCrYzo-1598441789092)(media/d11746974ea0c31529de1db57b3e5b14.png)]

5 cpuset和cgroup

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jNcEv1nO-1598441789093)(media/945a68aca4074dfdfa2d19ccfb35163c.png)]

可以设置cpuset.cpus

cpuset.mems

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

leon@:echo 0-1 > cpuset.cpus

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值