> 文章列表 > Docker资源配额详解

Docker资源配额详解

Docker资源配额详解

文章目录

    • 一、针对CPU限制
    • 二、针对内存限制
    • 三、针对磁盘限制
    • 四、stress压测工具

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

一、针对CPU限制

Docker容器针对CPU限制包括 --cpu-shares--cpuset-cpus 参数。

  • –cpu-shares:CPU使用份额控制,仅仅只是一个弹性的加权值,可以理解为优先级,默认每个容器CPU份额是1024,只在多个容器同时争抢同一个CPU资源时,CPU配额才会生效。比如A容器500份额,B容器1000份额,那么在B容器空闲时,A容器也能分配到全部可用的CPU。
  • –cpuset-cpus:CPU使用核数控制,这个参数可以接受一个逗号分隔的 CPU ID 列表。

查看CPU线程ID:

cat /proc/stat |grep cpu[0-9]

创建容器时针对容器做CPU限制如下:

docker run -itd --name Container --cpu-shares 2048 --cpuset-cpus 2,3 centos
  • –cpu-shares:使用份额,优先级
  • –cpuset-cpus:限制容器只使用CPU ID为 cpu2,cpu3的CPU

二、针对内存限制

  • 使用参数-m, --memory=""限制容器的内存使用量。限制后容器最多只能占用宿主机指定内存容量。
docker run -itd --name Container-3 -m 512m centos

查看限制:

docker exec -it Container-3 /bin/bash
cat /sys/fs/cgroup/memory/memory.limit_in_bytes
536870912
  • 536870912/1024/1024 = 512m

三、针对磁盘限制

可以针对磁盘的读写做限制,如下两个参数。

  • –device-write-bps:限制此设备上的写速度(bytes per second),单位可以是kb、mb或者gb。

  • –device-read-bps: 限制此设备上的读速度(bytes per second),单位可以是kb、mb或者gb。

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

mkdir -p /var/www/html/
docker run -itd --name Container-4 -v /var/www/html/:/var/www/html --device /dev/vda:/dev/vda --device-write-bps /dev/vda:2mb centos
  • –device参数:将主机设备添加到容器

进入容器使用dd命令进行测试:

docker exec  -it Container-4 /bin/bash
time dd if=/dev/vda of=/var/www/html/test.out bs=2M count=50 oflag=direct,nonblock
  • direct:读写数据采用直接IO方式,不走缓存。直接从内存写硬盘上。
  • nonblock:读写数据采用非阻塞IO方式,优先写dd命令的数据。

^C退出如下图限制成功:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XywyOTiT-1681982065742)(D:\\MD归档文档\\IMG\\image-20230416150835013.png)]

四、stress压测工具

常用参数解释:

-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

注:时间单位可以为秒s,分m,小时h,天d,年y,文件大小单位可以为K,M,G

CPU压测测试案例:

编写Dockerfile添加stress压力测试命令。

FROM centos
COPY stress /usr/bin/
CMD ["/bin/bash"]
docker build -t centos:v1 .

创建两台不同权重的容器实例:

docker run -itd --name Container-1 --cpu-shares 1024 --cpuset-cpus 0,1 centos:v1 
docker run -itd --name Container-2 --cpu-shares 2048 --cpuset-cpus 0,1 centos:v1

分别进入容器执行 stress 命令:

docker exec  -it Container-1  /bin/bash
stress  -c 2 -v -t 10mdocker exec  -it Container-2  /bin/bash
stress  -c 2 -v -t 10m
  • -c 产生n个进程 :每个进程都反复不停的计算随机数的平方根,测试cpu
  • -t --timeout N 指定运行N秒后停止

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xID8L0tI-1681982065743)(D:\\MD归档文档\\IMG\\image-20230416144519891.png)]