Docker 提供了资源限制机制避免某个容器因占用太多资源而影响其他容器性能
内存限额
容器可以使用的内存包括两部分:物理内存和swap。Docker通过下面两组参数来控制容器内存的使用量
1)-m或–memory:设置内存的使用限额,例如100MB,2GB
2)–memory-swap:设置内存+swap的使用限额
docker run -m 200M --memory-swap=300M ubunt
允许容器最多使用200MB的内存和100MB的swap。默认情况下,上面两组参数为-1,即没有限制
下面使用progrium/stress镜像来学习如何为容器分配内存,该镜像可以用来对容器执行压力测试,命令如下
docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
--vm:启动一个内存工作线程
--vm-bytes 280M:每个线程分配280M内存
如果工作线程分配的内存超过300M,stress线程报错,容器退出。若只指定-m,不指定–memory-swap,那么–memory-swap默认为-m的两倍。
CPU限额
Docker可以通过-c 或–cpu-shares 设置容器使用CPU的权重。
docker run --name container_A -it -c 1024 progrium/stress --cpu 1
--cpu:用来设置工作线程数量
docker run --name container_B -it -c 512 progrium/stress --cpu 1
结果:container_A容器对CPU的使用情况是container_B容器的2倍。
带宽限制
–blkio-weight参数改变容器block IO的优先级
docker run -it co_A --blkio-weight 600 ubuntu
docker run -it co_B --blkio-weight 300 tubunt
co_A读写磁盘的带宽是co_B的两倍
限制bps和iops
bps:byte per second,每秒读写的数据量
iops:io per second ,每秒IO的次数
--device-read-bps:限制读某个设备的bps
--device-write-bps:限制写某个设备的bps
--device-read-iops:限制读某个设备的iops
--device-write-iops:限制写某个设备的iops
例子
docker run -it --device-write-bps /dev/sda:30MB ubunt
限制容器写/dev/sda/的速率为30MB/s.
在容器中查看结果:
time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct
通过dd测试在容器中写磁盘的速度。因为容器文件系统实在host 的dev/sda上的,在容器中写文件相当于对host 的/dev/sda进行写操作。
oflag=direct指定用direct IO的方式写文件。
如果不限速的话: