zl程序教程

您现在的位置是:首页 >  其他

当前栏目

云计算-11-Docker容器对CPU、memory的资源配置

2023-04-18 17:00:27 时间

云计算-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