一、限制容器对内存使用
一个docker host 上会运行若干容器,每个容器都需要CPU、内存和io资源。对于kvm,VMware等虚拟化技术,用户可以分配多少CPU、内存资源给每个虚拟资源给每个虚拟机。
对于容器、docker也提供了类似的机制避免某个容器因占用太多资源而影响其他容器乃至整个host的性能。
内存限额与操作系统类似、容器可使用的内存包括两部分:物理内存和swap。docker通过下面两组参数来控制容器内存的使用量。
1.-m或--memory:设置内存的使用限额, 例如100M,2G
2.--memory-swap:设置 内存+swap 的使用限额。
例子:
docker run -m 200M --memory-swap=300M centos
其含义是允许该容器最多可以使用200M的内存和100M的swap
默认情况什么也不加时候,上面两组参数为 -1 也就是对容器的内存和swap没有限制
1.通过progrium/stress镜像来学习如何为容器分配内存。该镜像可用于对容器执行压力测试。
docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 350M
运行内存过大直接结束,否则会一直运行
--vm 1:启动1个内存工作线程
--vm-bytes 280M : me每个线程分配280内存
工作过程:
1.分配280M内存,
2.释放280M内存,
3.再分配280M内存,
4.再释放280M内存,
5.一直循环...../分配的内存超过限颗, stress线程端, 容器退出
如果在启动容器时只指定-m 而不指定--memory-swap,那么--memory-swap默认为-m的两倍
docker run -it -m 200M centos
容器最多使用200M物理内存和200M swap
二、限制容器对cpu的使用
默认设置下, 所有容器可以平等地使用host CPU资源井且没有限制。
Docker可以通过-c或--cpu-shares设置容器使用CPU的权重, 如果不指定, 默认值为1024.
与内存限颗不同, 通过-c设置的cpu s容器最烧hare井不是CPU资的绝对数量, 而是一个相对的权重值。某个能分配到的CPU资源取决于它的cpu share古所有容器cpu share总和的比例,
换句话说:通过cpu share可以设置容器使用CPU的优先级。
docker run --name "container_A" -c 1024 centos
docker run --name "container_B" -c 512 centos
container_A的cpu share 1024, 是container_B的两, 当两个器都需要CPU资源时, container_A可以得到的CPU是
container_B的两倍,
需要特别注意的是, 这种接权重分配CPU只会发生在CPU资源素张的情况下, 如果container_A处于空闲状态, 这时, 为
了充分利用CPU资源, container_B也可以分配到全部可用的CPU,
docker run -dit --name "container_A" -it -c 1024 progrium/stress --cpu 1
docker run -dit --name "container_B" -it -c 512 progrium/stress --cpu 1
--bilkio-weight与-cpu-shares类似, 设置的是相对权重值, 默认为500, 在下面的例子中, container_A读写磁盘的带宽是container_A的两倍
docker run -it --name container_A --blkio-weight 600 centos
docker run -it --name container_B --blkio-weight 300 centos
限制bps和iops bps是byte per second, 每砂读写的数据量
iops是io per second, 每砂IO的次数。
可通过以下参数控制容器的bps和iops;
--device-read-bps, 限制读个设备的bps.
--device-write-bps, 限制写基个设备的bps,
--device-read-iops, 限制读冥个设备的iops.
--device-write-iops, 限制写某个设备的iops,
下面这个例子限制容器写/dev/sda的速率为30MB/s
docker run -it --device-write-bps /dev/vda:300MB centos
[root@1c590c32963f /]# time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct
结果表明, bps 2.6MB/s没有超过30MB/s的限速。
docker run -it centos
[root@ef6d74835a6d /]# time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct
docker run -it --cpu-shares 512 progrium/stress -c 1
![](https://i-blog.csdnimg.cn/blog_migrate/11a98ebd690a76af8d55184086234715.png)
![](https://i-blog.csdnimg.cn/blog_migrate/64cc97bbdd6572057e85c6d9b5ec974f.png)
同样的, /sys/fs/cgroup/memory/docker和/sys/fs/cgraup/blkia/docker中保存的是内存以及Block IO的cgroup配置,
Linux使用了六种namespace, 分别对应六种资源:Mount, UTS、IPC、PID.Network和User
![](https://i-blog.csdnimg.cn/blog_migrate/39c704a2e63b1168f985fd8875afc25d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/374b74de339efcdfb2978ea2553aa39f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d3b01e434d1421f2b944b6ea07e643a6.png)