Linux---Docker的资源管控(CPU/磁盘IO/内存三个方面)

本文将以容器资源管理为主题,解决以下三个问题:

  • 哪些分配给容器的资源可被我们管理?
  • 容器实际使用了多少资源?
  • 如何对容器使用的资源进行管理?

对于第一个问题,当我们启动一个容器的时候,它可以使用一些系统资源,这与我们在物理机上启动程序基本是一致的。比如主要的几类:

  • CPU
  • 内存
  • 网络
  • I/O
  • GPU

查看容器占用资源

docker stats

Docker 提供了一个很方便的命令 docker stats,可供我们查看和统计容器所占用的资源情况。

CPU周期控制

  • docker提供了–cpu-period、–cpu-quota两个参数控制容器可以分配到的CPU时钟周期。–cpu-period是用来指定容器对CPU的使用要在多长时间内做一次重新分配,而–cpu-quota是用来指定在这个周期内,最多可以有多少时间用来跑这个容器。跟–cpu-shares不同的是这种配置是指定一个绝对值,而且没有弹性在里面,容器对CPU资源的使用绝对不会超过配置的值。

CPU core控制

  • 对多核CPU的服务器,docker还可以控制容器运行限定使用哪些cpu内核和内存节点,即使用–cpuset-cpus和–cpuset-mems参数。对具有NUMA拓扑(具有多CPU、多内存节点)的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。如果服务器只有一个内存节点,则–cpuset-mems的配置基本上不会有明显效果。

CPU配额控制参数的混合使用

  • 当上面这些参数中时,cpu-shares控制只发生在容器竞争同一个内核的时间片时,如果通过cpuset-cpus指定容器A使用内核0,容器B只是用内核1,在主机上只有这两个容器使用对应内核的情况,它们各自占用全部的内核资源,cpu-shares没有明显效果。

内存配额控制

  • 和CPU控制一样,docker也提供了若干参数来控制容器的内存使用配额,可以控制容器的swap大小、可用内存大小等各种内存方面的控制。
  • memory-swappiness:控制进程将物理内存交换到swap分区的倾向,默认系数为60。系数越小,就越倾向于使用物理内存。值范围为0-100。当值为100时,表示尽量使用swap分区;当值为0时,表示禁用容器 swap 功能(这点不同于宿主机,宿主机 swappiness 设置为 0 也不保证 swap 不会被使用)。
  • –kernel-memory:内核内存,不会被交换到swap上。一般情况下,不建议修改,可以直接参考docker的官方文档。
  • –memory:设置容器使用的最大内存上限。默认单位为byte,可以使用K、G、M等带单位的字符串。
  • –memory-reservation:启用弹性的内存共享,当宿主机资源充足时,允许容器尽量多地使用内存,当检测到内存竞争或者低内存时,强制将容器的内存降低到memory-reservation所指定的内存大小。按照官方说法,不设置此选项时,有可能出现某些容器长时间占用大量内存,导致性能上的损失。
  • –memory-swap:等于内存和swap分区大小的总和,设置为-1时,表示swap分区的大小是无限的。默认单位为byte,可以使用K、G、M等带单位的字符串。如果–memory-swap的设置值小于–memory的值,则使用默认值,为–memory-swap值的两倍。

磁盘IO配额控制

相对于CPU和内存的配额控制,docker对磁盘IO的控制相对不成熟,大多数都必须在有宿主机设备的情况下使用。主要包括以下参数:

  • –device-read-bps:限制此设备上的读速度(bytes per second),单位可以是kb、mb或者gb。
  • –device-read-iops:通过每秒读IO次数来限制指定设备的读速度。
  • –device-write-bps :限制此设备上的写速度(bytes per second),单位可以是kb、mb或者gb。
  • –device-write-iops:通过每秒写IO次数来限制指定设备的写速度。
  • –blkio-weight:容器默认磁盘IO的加权值,有效值范围为10-100。
  • –blkio-weight-device: 针对特定设备的IO加权控制。其格式为DEVICE_NAME:WEIGHT

如何限定20%CPU使用率的测试?

下载一个镜像
[root@localhost docker]# docker pull centos:7

查看镜像信息
[root@localhost docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos               7                  470671670cac        3 months ago        237MB

创建容器,并查看信息
[root@localhost docker]# docker run -itd --name test1 --cpu-quota 20000 centos:7 /bin/bash
2d9cc08614bd6e323ede514d69f3ca5e22992ef4ce5f87e0b70d0580e0cb3cf6
[root@localhost docker]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
2d9cc08614bd        centos:7           "/bin/bash"         6 seconds ago       Up 4 seconds                                                     test1
 

CPU压力测试

进入容器,下载压测工具
[root@localhost docker]# docker exec -it 2d9cc08614bd /bin/bash
[root@2d9cc08614bd /]# yum install bc -y

echo "scale=5000; 4*a(1)" |bc -l -q		计算圆周率的压测公式

解释:a是bc的一个内置函数,代表反正切arctan,由于tan(pi/4)=1,于是4*arctan(1)=pi 
-l 使用标准数学库

查看容器占用CPU的使用率

如何分配多个容器占用CPU的使用率测试?

创建两个容器,按照权重分配CPU的使用率

创建容器,并按照1:2分配CPU资源
[root@localhost docker]# docker run -itd --name c1 --cpu-shares 512 centos:7
4f88ec0dfaeeaaaf663ef4c9a3b026a3009f02c32e9cb0e712bbbe1246974de9
[root@localhost docker]# docker run -itd --name c2 --cpu-shares 1024 centos:7
6de15c9d90137a4c9ae94e94d5a2a188711b8f988abd4257e690c10477e9ea0e
[root@localhost docker]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
6de15c9d9013        centos:7            "/bin/bash"         7 seconds ago       Up 7 seconds                            c2
4f88ec0dfaee        centos:7            "/bin/bash"         21 seconds ago      Up 20 seconds                           c1

进入容器,下载工具模拟满负荷工作
docker exec -it 容器ID /bin/bash
c1
yum install epel-release -y	#安装epel源
yum install stress -y	#安装工具
stress -c 4	#产生四个线程,模拟满负荷工作

c2
yum install epel-release -y
yum install stress -y
stress -c 4	

通过命令docker stats查看容器test2和容器test3CPU的使用情况

如何让容器使用指定的CPU?

指定一个容器使用CPU1和CPU3

创建容器,并下载压测工具
[root@localhost ~]# docker run -itd --name demo --cpuset-cpus 1,3 centos:7 /bin/bash
95883cd37293b67e11800944af1925ff607e06a1fc24536b039ffd04a4e1ed07
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
95883cd37293        centos:7            "/bin/bash"         4 seconds ago       Up 2 seconds                                     demo
[root@localhost ~]# docker exec -it 95883cd37293  bash
yum install epel-release -y
yum install stress -y
stress -c 4

如何现在容器的内存使用率?

创建容器,下载stress工具
[root@localhost ~]# docker run -itd --name test -m 512m centos:7 /bin/bash
5c51f24abd7da4844c14fc106e6ec3046296cdf00419fea819ac5b4997b2cbf1
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
5c51f24abd7d        centos:7            "/bin/bash"         4 seconds ago       Up 2 seconds    
                                 test
[root@localhost ~]# docker exec -it 5c51f24abd7d bash
yum install epel-release -y
yum install stress -y
stress -m 1024m --vm 2

限制I/O(输入输出)的方法

--device- read-bps: 限制读某个设备的bps (数据量)	例: docker run -d --device-read-bps /dev/ sda:30M centos:7
--device-write-bps :限制写入某个设备的bps (数据量) 	例: docker run -d --device-write-bps /dev/ sda:30M centos:7
--device-read-iops :限制读某个设备的iops (次数)
发布了78 篇原创文章 · 获赞 5 · 访问量 2557

猜你喜欢

转载自blog.csdn.net/qq397750142/article/details/105664769