cgroup: cpu 子系统详解

解决的问题
多个容器共存时,如何分配cpu资源。也就是如何限制单个容器的使用上限,防止对同宿主机上其他容器产生干扰。
方法
有两个方法,一个是硬限,一个是软限。
硬限就是划分一个上限,容器一旦达到此上限,立刻throttle(压制),不再给与cpu资源;
软限相对硬限来说没有这么强势,即便没有cpu资源,也只会等待,不会throttle。
 详细介绍
 一:cpu子系统下的文件
cpu.cfs_period_us
执行检测的周期,默认是100ms
cpu.cfs_quota_us
在一个检测周期内,容器能使用cpu的最大时间,该值就是硬限,默认是-1,即不设置硬限
cpu.shares
顾名思义,shares=分享。它的工作原理非常类似于进程的nice值。shares就代表软限。
cpu.state
容器的状态:一共运行了多少个周期;一共被throttle了多少次;一共被throttle了多少时间
cpu.rt_period_us
执行检测的周期,默认是1s
cpu.rt_runtime_us
在一个检测周期内,能使用的cpu最大时间,只作用于rt任务
 
二:硬限与软限
硬限
这样做对同宿主机的其他容器来说比较安全,因为一旦超过硬限,容器就无法运行,只能等待下一个period;对本容器来说,比较危险。
容器的核数=cpu.cfs_quota_us / cpu.cfs_period_us;
 
软限
cpu.cfs_quota_us =-1 ,仅设置cpu.shares,即为软限,通过软限可以提升整机的cpu利用率。因为只有当cpu繁忙时,shares才会起作用。并且shares的作用和进程nice值极为相似,都是影响红黑树上节点右移的速度,来间接控制任务获取cpu时间。
 
三:bandwidth
通过下面这个图片可以很直观的看出cfs带宽控制与rt带宽控制的区别rt的带宽控制相对cfs来说,比较简单:当一个cpu上的rt任务需要运行时,先看下自己还有没有剩余rt.runtime,假如没了,就向其他cpu去借,即balance_rt_runtime,假如其他cpu上也没有可用时间,那就throttle。这里需要打开内核开关:echo  RT_RUNTIME_SHARE > /sys/kernel/debug/sched_feature  ;
当此开关关闭时,就无法从其他cpu上借时间了。
 

posted @ 2021-01-02 20:44  meisilhr  阅读(536)  评论(0编辑  收藏  举报