Docker内核技术原理(七)之CPU Cgroup

之前的文章介绍了常用的Namespace,Namespace解决了资源隔离问题,让不同的容器只看到自己的空间。但只有Namespace是不够的,还需要限制进程的资源用量,譬如现在进程的CPU和内存使用等。

我们首先看CPU的限制,Docker容器启动可以指定

-c, --cpu-shares int       CPU shares (relative weight)
--cpu-period int       Limit CPU CFS (Completely Fair Scheduler) period
--cpu-quota int        Limit CPU CFS (Completely Fair Scheduler) quota

其中cpu-shares是通过cgroup的cpu.shares来设置CPU的相对值,并且是针对所有的CPU限制各个组之间的配额,默认是1024。假如两个控制组foo和bar:

/cpu/foo/cpu.shares : 2048
/cpu/bar/cpu.shares : 1024

在foo和bar控制组中的进程在CPU满负荷的情况下,分别占用CPU 2(2048):1(1024)的计算资源,也就是说foo可以使用66.6%的计算能力。

Docker内核技术原理(七)之CPU Cgroup

如果还有另一个控制组加入,这些权重将重新计算,比如此时添加一个新的xxx控制组权重为1024,那么他将占用1024/(1024+1024+2048)=25%计算能力,而foo只能使用50%的计算能力,如下所示。

Docker内核技术原理(七)之CPU Cgroup

当然如果其他进程都空闲的情况,某个进程还是可以占用全部的CPU资源的,可见,它只是在CPU满负荷运行的情况下才有意义,使用方式的优势是可以充分利用资源,但弊端也很明显,不能绝对限制资源,导致使用不受限制。

之后,内核cgroup中加入了cpu.cfs_period_us 和 cpu.cfs_quota_us,用来限制组中的所有进程在单位时间里可以使用的CPU时间,这里的cfs是完全公平调度器的缩写。cpu.cfs_period_us就是时间周期,默认为100000,即百毫秒。cpu.cfs_quota_us就是在这期间内可使用的CPU时间,默认-1,即无限制。如果需要限制一个CPU的使用可以设置

 # echo 100000> cpu.cfs_quota_us
 # echo 100000> cpu.cfs_period_us 

在100ms period时间内,使用了100ms quota的CPU时间片,也就是使用了一个核计算能力,同理如果限制使用0.5个核应该设置

# echo 50000 > cpu.cfs_quota_us
# echo 100000> cpu.cfs_period_us

在100ms period的时间周期内,配置了50ms quota的时间片配额,也就是使用了0.5个核,那么quota能大于period吗?当然,如果使用两个核应该设置成

# echo 200000> cpu.cfs_quota_us
# echo 100000> cpu.cfs_period_us

通过设置在100ms period内使用200ms quota的时间片,控制可以使用两个核的计算能力。下面通过一个例子看一下具体如何设置

首先启动一个简单的shell死循环

 # while : ; do : ; done &

通过top命令查看

Docker内核技术原理(七)之CPU Cgroup

可以看到这个进程占用了100%的CPU,代表使用了一个核,大家很能觉得奇怪,为啥正好是一个核呢?上面的死循环不应该是消耗所有的CPU吗?如果是8核的机器,应该消耗800%才对,这是因为这个bash死循环,只是在一个线程上执行,并没有启动多线程,所有造成只能使用100%的假象,言归正传,那如何让他使用0.5个核呢?核心配置上面已经介绍过了,

# cd /sys/fs/cgroup/cpu
# mkdir test  //创建控制组
# cd test && ls
cgroup.clone_children  cpuacct.usage         cpuacct.usage_percpu_sys   cpuacct.usage_user  cpu.rt_period_us   cpu.stat
cgroup.procs           cpuacct.usage_all     cpuacct.usage_percpu_user  cpu.cfs_period_us   cpu.rt_runtime_us  notify_on_release
cpuacct.stat           cpuacct.usage_percpu  cpuacct.usage_sys          cpu.cfs_quota_us    cpu.shares         tasks

配置CPU使用

# cat  cpu.cfs_period_us
100000                                                                                                            
# echo 50000 > cpu.cfs_quota_us

将pid写入

# echo 29510 > tasks

查看效果如下使用0.5个核的计算能力:

Docker内核技术原理(七)之CPU Cgroup

总结一下,我们可以通过cpu.shares设置CPU的相对用量,通过cfs_period_us和cfs_quota_us组合设置CPU使用的绝对值。Docker的底层正是通过设置cgroup实现CPU资源的限制。

展开阅读全文

页面更新:2024-04-13

标签:控制组   组合   绝对值   权重   配额   用量   内核   容器   周期   消耗   进程   也就是   原理   两个   能力   时间   资源   技术   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top