目录
注:更多资源限制学习可以去看RH442中资源限制章节:https://note.youdao.com/s/GkCsCi8D
为什么要资源限制
一个主机会运行若干的容器,每个容器都需要cpu、内存以及IO资源
对于虚拟化技术,用户可以控制分配多少的cpu及内存资源给每个虚拟机
docker也提供类似的技术,以避免因为单个容器占用过多资源而影响到所有其他容器乃至整个宿主机的性能
内存资源限制
docker run –it –m 200M –-memory-swap 300M ubuntu:16.04
- -m:允许分配的内存大小
- --memory-swap:允许分配的内存和swap的总大小
- --memory-swapiness:控制内存与swap置换的比例
- 100 更倾向于使用swap(→100)
- 0 更倾向于使用内存(→0)
docker run –it –m 200M –memory-swappiness 0 progrium/stress –-vm 1 –-vm-bytes 180M
--vm
: 指定虚拟内存压力测试的进程数量。例如,--vm 1
启动 1 个虚拟内存进程。这些进程将会运行在容器中并独立于其他进程执行--vm-bytes
: 指定每个虚拟内存进程分配的内存量。例如,--vm-bytes 180M
表示单个虚拟内存进程将尝试分配 180MB 的内存
CPU资源限制
docker run -d --cpus 0.2 progrium/stress --cpu 1
- --cpus 0.2 表示占用了宿主机20%的cpu资源
- --cpu 1 表示在容器中产生1个进程,用来不停的计算随机数的平方,这样认为把容器所有的计算资源全部占用掉
docker run -d --cpu-period 10000 --cpu-quota 3000 progrium/stress --cpu 1
--cpu-period和--cpu-quota分别指在10000个总时间单位中,分配给该容器3000个时间单位
--cpu-period 10000
: 设置了每 0.01 秒一个时间片--cpu-quota 3000
: 在每个时间片中,容器最多可以使用 3000 微秒的 CPU 时间容器的 CPU 限制:
容器的 CPU 使用能力被限制为每个周期的 30%- “--cpu-period 10000 --cpu-quota 3000”相当于“--cpus 0.3”
CPU使用时间的比列 = cpu-quota / cpu-period
→ 3000us / 10000us = 0.3
Block IO带宽资源限制
Block IO指的是磁盘的读写
docker可通过设置权重、限制带宽bps和每秒IO请求数iops的方式控制容器读写磁盘的带宽
- bps:byte per second,每秒读写的数据量
- iops:io per second,每秒的IO次数
目前Block IO限制只对direct IO(不使用文件缓存)有效
- Direct I/O: 目前 Docker 的 Block I/O 限制主要适用于直接 I/O 操作(Direct I/O),即不使用文件缓存的操作。直接 I/O 操作直接与磁盘设备进行数据交换,而不经过操作系统的文件缓存。
- 非 Direct I/O: 操作系统的缓存层会影响实际的 I/O 性能,操作系统可能会缓存数据,因此即使设置了带宽或 IOPS 限制,实际的 I/O 性能可能会受到影响。
控制容器bps和iops的参数说明
- --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 ubuntu
验证测试:time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct