Linux内核之进程调度5:Cgroup
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, 也可以关闭
aaa@qq.com:/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。
aaa@qq.com:echo 0-1 > cpuset.cpus
该组的进程就只限制在指定CPU上运行;
ps:另外cgroup同样可以对内存和IO做群组管理。
上一篇: MySQL中的RAND()函数使用详解
下一篇: Java编程long数据类型的使用问题