文章目录
- 一、针对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退出如下图限制成功:
四、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 10m
docker exec -it Container-2 /bin/bash
stress -c 2 -v -t 10m
- -c 产生n个进程 :每个进程都反复不停的计算随机数的平方根,测试cpu
- -t --timeout N 指定运行N秒后停止