Docker容器针对CPU限制包括 --cpu-shares
、--cpuset-cpus
参数。
查看CPU线程ID:
cat /proc/stat |grep cpu[0-9]
创建容器时针对容器做CPU限制如下:
docker run -itd --name Container --cpu-shares 2048 --cpuset-cpus 2,3 centos
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
可以针对磁盘的读写做限制,如下两个参数。
–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
进入容器使用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
^C退出如下图限制成功:
常用参数解释:
-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