云计算-11-Docker容器对CPU、memory的资源配置
简述
在使用docker容器的时候,默认是不对容器进行硬件资源限制的,同一台机器上的容器虽然相互隔离,但是他们底层的CPU、内存和磁盘资源是相同的,如果不对容器使用的资源进行限制,那么容器之间的相互影响,就可能会导致主机和集权资源耗尽,导致容器服务不可用。因此docker作为容器的管理者,需要对容器的资源进行限制:包括CPU、内存、磁盘三个方面。
Linux 查看CPU和内存信息指令
查看CPU信息
cat /proc/cpuinfo
- 查看CPU的型号信息
[root@k8s1-zb ~]# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
4 Intel Xeon E3-12xx v2 (Ivy Bridge)
表示有4个CPU,和这四个CPU的型号
- 查看CPU的组成
[root@k8s1-zb ~]# cat /proc/cpuinfo | grep physical | uniq -c
1 physical id : 0
1 address sizes : 46 bits physical, 48 bits virtual
1 physical id : 1
1 address sizes : 46 bits physical, 48 bits virtual
1 physical id : 2
1 address sizes : 46 bits physical, 48 bits virtual
1 physical id : 3
1 address sizes : 46 bits physical, 48 bits virtual
表示4个单核CPU组成
- 获取CPU的运行模式
[root@k8s1-zb ~]# getconf LONG_BIT
64
说明现在的CPU运行在64bit模式下。
查看内存信息
cat /proc/meminfo
- 查看操作系统内核
[root@k8s1-zb ~]# uname -a
Linux k8s1-zb 3.10.0-862.3.2.el7.x86_64 #1 SMP Mon May 21 23:36:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
- 查看内存总量
grep MemTotal /proc/meminfo
- 查看空闲内存量
grep MemFree /proc/meminfo
docker限制容器CPU
--cpu-shares设置容器按比例弹性共享CPU资源
查看--cpu-shares的指令信息
[root@k8s1-zb ~]# docker run --help | grep cpu-shares
-c, --cpu-shares int CPU shares (relative weight)
--cpu-shares并不能保证容器在运行的时候可以获取多少个CPU资源,只是一个弹性权值。
默认情况下每个容器CPU弹性权值都是1024,只有在同一个CPU核心上面,同时运行多个容器才能看出CPU权值效果。
举例说明:
容器C和D的CPU权值分别为1024和2048,会怎么分配CPU资源?
- 情景1:C和D容器都正常运行,如果占用同一个CPU,那么在CPU时间片分配时,容器D会比容器C多一倍的机会获取CPU时间片。
- 情景2:容器CPU资源分配结果和其他容器 运行状态有关。如果容器D一直空闲,那么容器C也可以获取比容器D更多的CPU时间片。
- cgroups只有在多个容器争夺同一个CPU资源的时候,CUP配额才会生效,不能只根据CPU的权值配额类确定CPU的资源占有情况,容器CPU的资源分配情况,取决于同时运行的其他容器CPU的分配和容器中进行运行情况。
举例1
- 创建容器mycentos1,分配1024的cpu权值,并进入容器
docker run --name mycentos1 --cpu-shares 1024 -it centos /bin/bash
- 查看容器分配的CPU权值
[root@87476ea8bd94 /]# cat /sys/fs/cgroup/cpu/cpu.shares
1024
注:--cpu-shares设置的并不是CPU绝对资源,只是一个相对权重,容器最终能够分配到多少CPU资源,和其他所有容器运行情况以及cpu shares 总和比例有关系。cpu share只是设置了CPU使用的优先级。
--cpuset容器绑定CPU
查看--cpuset的指令信息
[root@k8s1-zb ~]# docker run --help | grep cpuset
--cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
--cpuset可以在容器运行时将容器和宿主机的CPU进行对应绑定,从而控制容器运行CPU个数和Z在那个CPU上运行。主要对多CPU、多内存节点服务器有用
举例1
- 创建mycentos1容器,cpu权值1024,只允许在宿主机的cpu1和cpu0上运行
docker run -it --name mycentos1
--cpu-shares 1024
-v /etc/yum.repos.d:/etc/yum.repos.d
--cpuset-cpus 0,1
centos /bin/bash
- 重新打开一个终端创建容器mycentos2,cpu权值2048,只允许在宿主机的cpu1和cpu0上运行
docker run -it --name mycentos1
--cpu-shares 2048
-v /etc/yum.repos.d:/etc/yum.repos.d
--cpuset-cpus 0,1
centos /bin/bash
- 分别在两个容器mycentos1和mycentos2上安装stress压力测试
yum install -y epel-release # 安装epel扩展源
yum -y install stress #安装stress命令
- 分别在两个容器中使用stress命令,将CPU占满
stress -c 2 -v -t 10m #表示在容器中运行2个进程
- 再打开一个终端,输入top指令,然后按1快捷键
发现CPU0和CPU1已经占满,mycentos2容器使用CPU是mycentos1容器使用CPU的2倍。说明资源限制成功。
docker限制容器内存
-m限制容器内存
docker提供-m,--memory限制容器内存使用量, 查看--memory的指令信息
docker run --help | grep memory
-m, --memory bytes Memory limit
--memory-reservation bytes Memory soft limit
--memory-swap bytes Swap limit equal to memory plus swap: '-1' to enable unlimited swap
--memory-swappiness int Tune container memory swappiness (0 to 100) (default -1)
举例1
- 创建一个只允许容器内存最多使用128M
docker run --name mycentos3 -it -m 128M centos /bin/bash
- 查看容器的内存限制
cat /sys/fs/cgroup/memory/memory.limit_in_bytes
举例2
创建一个容器mycentos4,只是用1个CPU核心,只是要256M内存
docker run --name mycentos4 --cpuset-cpus 0 -it -m 128M centos /bin/bash
docker限制容器IO
--device-write-bps限制容器在设备上的写速度
--device-write-bps限制容器在设备上的写速度,单位是kb,mb,gb
查看--device-write-bps指令信息
[root@k8s1-zb ~]# docker run --help | grep write-b
--device-write-bps list Limit write rate (bytes per second) to a device (default [])
举例
- 创建一个容器mycentos5
--device 将主机设备添加到容器
docker run -it --name mycentos5
-v /mydata/test:/mydata/test
--device /dev/vda:/dev/vda
--device-write-bps /dev/vda:2mb centos /bin/bash
注:**/dev/vda根据实际情况进行修改自己的硬盘(/dev/sda是在STAT、SCSI第一个接口上的硬盘),可以根据命令查看硬盘分区**
- fdisk -l
- 使用time+dd测试硬盘读写速度
time dd if=/dev/vda of=/mydata/test/test.out bs=2M count=50 oflag=direct,nonblock
- 使用time+dd测试硬盘读写速度
time dd if=/dev/vda of=/dev/null bs=2M count=50
这是因为/dev/vad是一个物理分区,对他读取产生IO,/dev/null是伪设备,不会产生写IO,因此这个命令只测试读能力
我们能发现读能力是1.5GB/S不像写能力那样进行了限制。
--device-read-bps限制容器在设备上的读能力
--device-read-bps限制容器在设备上的读速度,单位是kb,mb,gb
查看 --device-read-bps指令信息
[root@k8s1-zb ~]# docker run --help | grep read
--device-read-bps list Limit read rate (bytes per second) from a device (default [])
举例
- 创建一个容器mycentos6
--device 将主机设备添加到容器
docker run -it --name mycentos6
-v /mydata/test:/mydata/test
--device /dev/vda:/dev/vda
--device-read-bps /dev/vda:2mb centos /bin/bash
- 要测试读能力我们首先需要生成读取数据文件test.out。
time dd if=/dev/zero of=test.out bs=2M count=10
- 然后再运行dd命令,对容器读取数据速度进行测试,和–device-write-bps类似,iflag=direct是对–device-read-bps的读取速度进行限制。
time dd if=test.out of=/dev/zero bs=2M iflag=direct
本文使用 文章同步助手 同步