二维码
找好货

扫一扫关注

当前位置: 首页 » 资讯 » 跨境电商 » 正文

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

放大字体  缩小字体 发布日期:2022-07-12 17:01:40    作者:life    浏览次数:1678    评论:0
导读

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

之前的文章介绍了常用的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%的计算能力。

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

当然如果其他进程都空闲的情况,某个进程还是可以占用全部的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命令查看

可以看到这个进程占用了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个核的计算能力:

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

 
关键词: cupc
(文/life)
打赏
免责声明
• 
本文为life原创作品,作者: life。欢迎转载,转载请注明原文出处:https://www.114618.com/news/27455.html 。本文仅代表作者个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,作者需自行承担相应责任。涉及到版权或其他问题,请及时联系我们。
0相关评论
 

(c)2008-2018 找好货 B2B SYSTEM All Rights Reserved

京ICP备2022008976号-2