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上借时间了。