深入理解Docker的硬件资源控制与验证

​前面两篇文章主要介绍了有关docker的基础概念、安装、以及对镜像容器的相关操作。重点在于命令的含义以及常用的一些命令的可选项的含义的理解,本文在此基础上来聊一聊基于硬件层面是上有关docker的资源(物理)控制。

一、docker管理资源机制——Control group

​ Control group 是Linux内核提供的一种限制所使用物理资源的机制,这些资源主要是CPU、内存、blkio,而Control group简称为Cgroup,我们可以在下面的目录中查看:

[root@docker cgroup]# ls blkio cpuacct cpuset freezer memory net_cls,net_prio perf_event systemd cpu cpu,cpuacct devices hugetlb net_cls net_prio pids

​ 在该目录下我们可以看到有blkio、cpuset、memory、cpu等与物理硬件资源对应的文件以及目录。下面就基于上述的三个方面来聊一聊docker是如何使用该机制对这些资源进行管理的。

二、对CPU的控制

​ 对CPU的控制有下面几种方式:

限制CPU的使用率;

多任务按比例分配CPU;

限制CPU内核(核心数)使用;

2.1基于使用率限制CPU

我们可以在文件中查看默认的限制设置,我们先运行一个容器(两种方式,我们使用run的命令来快速运行一个容器):

#检查本地是否有镜像或容器存在 [root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES #运行一个容器 [root@docker ~]# docker run -itd --name test CentOS:7 /bin/bash Unable to find image 'centos:7' locally 7: Pulling from library/centos ab5ef0e58194: Pull complete Digest: sha256:4a701376d03f6b39b8c2a8f4a8e499441b0d567f9ab9d58e4991de4472fb813c Status: Downloaded newer image for centos:7 ff84f35a0d6fdc77d292f7168546848385ab382f3dc1486077933e944c4424b9 [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ff84f35a0d6f centos:7 "/bin/bash" About a minute ago Up About a minute test

我们进入docker目录下的容器编号目录中,查看cpu.cfs_quota_us文件,其中的内容默认为-1(我们可以对此更改)

[root@docker ~]# cd /sys/fs/cgroup/cpu/docker/ff84f35a0d6fdc77d292f7168546848385ab382f3dc1486077933e944c4424b9/ [root@docker ff84f35a0d6fdc77d292f7168546848385ab382f3dc1486077933e944c4424b9]# ls cgroup.clone_children cpuacct.stat cpu.cfs_period_us cpu.rt_runtime_us notify_on_release cgroup.event_control cpuacct.usage cpu.cfs_quota_us cpu.shares tasks cgroup.procs cpuacct.usage_percpu cpu.rt_period_us cpu.stat [root@docker ff84f35a0d6fdc77d292f7168546848385ab382f3dc1486077933e944c4424b9]# cat cpu.cfs_quota_us -1

​ 果然,默认的配额值为-1,这就表示默认情况下是不对CPU资源进行控制的,显然这样在使用容器的过程中非常容易出现问题,例如一台真实服务器运行着各种各样的数量非常多的容器,而其中一台容器占据了接近90%的CPU使用率,那么剩下来的如此多的容器只能在剩余的10%中获取使用,这很容易引发业务故障,因此我们需要对CPU包括随后的内存及文件IO流进行优化处理的配置。

​ 首先,本小节是对CPU的使用率进行的控制,那么下面就来看看怎么配置的吧。

我们可以直接进入这个文件进行设置,那么怎么设置呢?

这就需要说明一下了,CPU的百分比是以1000位单位的,因此总额为100000,即10万,那么我们写入20000,则使用率为20%。除了直接改(echo也行)也可以在命令行中进行设置:

[root@docker ~]# docker run -itd --name test1 --cpu-quota 20000 centos:7 /bin/bash 31f9d00fca956d315736dad8a1f2e4c01128d44370af4b37c10298fd2c6a3ee6 [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 31f9d00fca95 centos:7 "/bin/bash" 14 seconds ago Up 12 seconds test1 ff84f35a0d6f centos:7 "/bin/bash" 14 minutes ago Up 14 minutes test

那么我们怎么验证或者说测试这个使用率占比最高是在20%呢?

我们可以进入这个容器中执行操作,使得CPU满载,另外开一个terminal使用top命令查看CPU使用情况即可。

#下载bc工具,一种任意精度的计算器语言,可以理解为用于精确计算的 [root@31f9d00fca95 /]# yum install bc -y #我们使用该工具来计算圆周率 [root@31f9d00fca95 /]# echo "scale=5000; 4*a(1)" | bc -l -q #说明:其中a是bc的一个内置函数,代表arctan(三角函数哈~),由于tan(pi/4)=1,所以4*arctan(1)=pi 【pi就是π】,5000表示计算精确到小数点后面的5000位,-l表示使用标准数学库,-q表示 不在界面中输出。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/cc48dc68945f23d14a46263a5b79f418.html