docker资源配额

百度网盘链接:https://pan.baidu.com/s/15t_TSH5RRpCFXV-93JHpNw?pwd=8od3  提取码:8od3

7 docker资源配额

7.1 docker容器控制cpu

Docker通过cgroup来控制容器使用的资源限制,可以对docker限制的资源包括CPU 内存 磁盘。

7.1.1  指定docker容器可以使用的cpu份额

查看配置份额的帮助命令:

# docker run --help | grep cpu-shares

cpu配额参数:-c, --cpu-shares int 

例:给容器实例分配512权重的cpu使用份额

# docker run -it --cpu-shares 512 centos  /bin/bash

$ cat /sys/fs/cgroup/cpu/cpu.shares  #查看结果:512

 

在 host 中启动了两个容器:

# docker run --name "container_A" -c 1024 ubuntu

# docker run --name "container_B" -c 512 ubuntu

container_A 的 cpu share 1024,是 container_B 的两倍。当两个容器都需要 CPU 资源时,container_A 可以得到的 CPU 是 container_B 的两倍。

需要注意的是,这种按权重分配 CPU只会发生在 CPU资源紧张的情况下。如果 container_A 处于空闲状态,为了充分利用 CPU资源,container_B 也可以分配到全部可用的 CPU。

7.1.2  CPU core核心控制

参数:--cpuset可以绑定CPU

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

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

在上面这些参数中,cpu-shares控制只发生在容器竞争同一个cpu的时间片时有效。

测试cpu-shares和cpuset-cpus混合使用运行效果,就需要一个压缩力测试工具stress来让容器实例把cpu跑满。

# yum -y install epel-release

# yum -y install stress

stress参数解释

-?  显示帮助信息

-v  显示版本号

-q  不显示运行信息

-n  显示已完成的指令情况

-t  --timeout  N  指定运行N秒后停止        

   --backoff  N  等待N微妙后开始运行

-c  产生n个进程 :每个进程都反复不停的计算随机数的平方根,测试cpu

-i  产生n个进程 :每个进程反复调用sync(),sync()用于将内存上的内容写到硬盘上,测试磁盘io

-m  --vm n 产生n个进程,每个进程不断调用内存分配malloc()和内存释放free()函数 ,测试内存

   --vm-bytes B  指定malloc时内存的字节数 (默认256MB)

   --vm-hang N   指定在free栈的秒数  

-d  --hadd n  产生n个执行write和unlink函数的进程

   -hadd-bytes B  指定写的字节数

   --hadd-noclean  不unlink 

 

运行两个容器实例

# docker run -itd --name docker10 --cpuset-cpus 0,1 --cpu-shares 512 centos /bin/bash

# docker run -itd --name docker20 --cpuset-cpus 0,1 --cpu-shares 1024 centos /bin/bash

 

测试1: 进入docker10,使用stress测试进程是不是只在cpu0,1上运行:

# docker exec -it  docker10  /bin/bash

$  yum install -y epel-release  #安装epel扩展源

$ yum install stress -y    #安装stress命令

$ stress -c 2 -v  -t 10m   #运行2个进程,把两个cpu占满

通过top命令可看到正常只在cpu0,1上运行。

 

测试2: 进入docker20,使用stress测试进程是不是只在cpu0,1上运行,且docker20上运行的stress使用cpu百分比是docker10的2倍

# docker exec -it  docker20  /bin/bash

$ yum install -y epel-release  #安装epel扩展源

$ yum install stress -y  

$ stress  -c 2 -v -t 10m

在另外一个虚拟终端上运行top命令,按1快捷键,查看每个cpu使用情况

7.2 docker容器控制内存

Docker提供参数-m, --memory=""限制容器的内存使用量。

例1:允许容器使用的内存上限为128M:

# docker run -it  -m 128m centos

$ cat /sys/fs/cgroup/memory/memory.limit_in_bytes

134217728

注:也可以使用tress进行测试。

例2:创建一个docker,只使用2个cpu核心,只能使用128M内存

# docker run -it --cpuset-cpus 0,1 -m 128m centos

7.3 docker容器控制IO

限制此设备上的写速度(bytes per second),单位可以是kb mb或者gb。

--device-read-bps value

例1:限制容器实例对硬盘的最高写入速度设定为 2MB/s。

--device参数:将主机设备添加到容器

# mkdir -p /var/www/html/

# docker run -it -v /var/www/html/:/var/www/html --device /dev/sda:/dev/sda --device-write-bps /dev/sda:2mb centos /bin/bash

$ time dd if=/dev/sda of=/var/www/html/test.out bs=2M count=50 oflag=direct,nonblock

注:dd 参数:

direct:读写数据采用直接IO方式,不走缓存。直接从内存写硬盘上。

nonblock:读写数据采用非阻塞IO方式,优先写dd命令的数据。

posted @ 2022-11-21 17:50  Krill_ss  阅读(46)  评论(0编辑  收藏  举报