Docker----Docker资源限制
Posted while(a);
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker----Docker资源限制相关的知识,希望对你有一定的参考价值。
- 前言
- 系统压力测试
- Cpu资源限制
- Mem资源限制
- IO 资源限制【扩展】
1.前言
在使用 Docker 运行容器时,一台主机上可能会运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的 CPU、内存和磁盘资源。如果不对容器使用的资源进行限制,那么容器之间会互相影响,小的来说会导致容器资源使用不公平;大的来说,可能会导致主机和集群资源耗尽,服务完全不可用。
CPU 和内存的资源限制已经是比较成熟和易用,能够满足大部分用户的需求。磁盘限制也是不错的,虽然现在无法动态地限制容量,但是限制磁盘读写速度也能应对很多场景。
至于网络,Docker 现在并没有给出网络限制的方案,也不会在可见的未来做这件事情,因为目前网络是通过插件来实现的,和容器本身的功能相对独立,不是很容易实现,扩展性也很差。
资源限制一方面可以让我们为容器(应用)设置合理的 CPU、内存等资源,方便管理;另外一方面也能有效地预防恶意的攻击和异常,对容器来说是非常重要的功能。如果你需要在生产环境使用容器,请务必要花时间去做这件事情。
2.系统压力测试:stress
2.1 stress 案例
Stress是一个linux下的压力测试工具,专门为那些想要测试自己的系统,完全高负荷和监督这些设备运行的用户。
安装stress:
# yum install stress -y
测试CPU负荷 :
# stress -c 4 //增加4个cpu进程,处理sqrt()函数函数,以提高系统CPU负荷
内存测试:
# stress –i 4 –vm 10 –vm-bytes 1G –vm-hang 100 –timeout 100s
新增4个io进程,10个内存分配进程,每次分配大小1G,分配后不释放,测试100S
磁盘I/O测试:
# stress –d 1 --hdd-bytes 3G //新增1个写进程,每次写3G文件块
硬盘测试(不删除):
# stress –i 1 –d 10 --hdd-bytes 3G –hdd-noclean
新增1个IO进程,10个写进程,每次写入3G文件块,且不清除,会逐步将硬盘耗尽。
2.2 Stress各主用参数说明
-表示后接一个中划线,--表示后接2个中划线,均可用于stress后接参数,不同表达方式
-?
--help 显示帮助信息
--version 显示软件版本信息
-t secs:
--timeout secs指定运行多少秒
--backoff usecs 等待usecs微秒后才开始运行
-c forks:
--cpu forks 产生多个处理sqrt()函数的CPU进程
-m forks
--vm forks:产生多个处理malloc()内存分配函数的进程,后接进程数量
-i forks
--io forks:产生多个处理sync()函数的磁盘I/O进程
--vm-bytes bytes:指定内存的byte数,默认值是1
--vm-hang:表示malloc分配的内存多少时间后在free()释放掉
-d :
--hdd:写进程,写入固定大小,通过mkstemp()函数写入当前目录
--hdd-bytes bytes:指定写的byte数,默认1G
--hdd-noclean:不要将写入随机ascii数据的文件unlink,则写入的文件不删除,会保留在硬盘空间。
3.docker-Cpu资源限制
3.1 概述
Cpu 资源:主机上的进程会通过时间分片机制使用 CPU,CPU 的量化单位是频率,也就是每秒钟能执行的运算次数。为容器限制 CPU 资源并不能改变 CPU 的运行频率,而是改变每个容器能使用的 CPU 时间片。理想状态下,CPU 应该一直处于运算状态(并且进程需要的计算量不会超过 CPU 的处理能力)。
默认设置下,所有容器可以平等地使用 host CPU 资源并且没有限制。
Docker 可以通过 -c 或 --cpu-shares 设置容器使用 CPU 的权重。如果不指定,默认值为 1024。
与内存限额不同,通过 -c 设置的 cpu share 并不是 CPU 资源的绝对数量,而是一个相对的权重值。某个容器最终能分配到的 CPU 资源取决于它的 cpu share 占所有容器 cpu share 总和的比例。
案例:通过 cpu share 可以设置容器使用 CPU 的优先级:
# docker run --name "container_A" -c 1024 progrium/stress
# docker run --name "container_B" -c 512 progrium/stress
当两个容器都需要 CPU 资源时,container_A 可以得到的 CPU 是 container_B 的两倍。
这种按权重分配 CPU 只会发生在 CPU 资源紧张的情况下。如果 container_A 处于空闲状态,这时,为了充分利用 CPU 资源,container_B 也可以分配到全部可用的 CPU
案例:--cpu 用来设置工作线程的数量。因为当前 host 只有 1 颗 CPU,所以一个工作线程就能将 CPU 压满。如果 host 有多颗 CPU,则需要相应增加 --cpu 的数量:
docker run --name "container_s" -c 512 -it progrium/stress --cpu 1
docker run --name "container_z" -c 1024 -it progrium/stress --cpu 1
container_z消耗的 CPU 是 container_s 的两倍。
3.2 CPU 绑定
限制容器运行在某些 CPU 核
注:一般并不推荐在生产中这样使用
docker 允许调度的时候限定容器运行在哪个 CPU 上。
限制容器运行在哪些核上并不是一个很好的做法,因为它需要实现知道主机上有多少 CPU 核,而且非常不灵活。除非有特别的需求,一般并不推荐在生产中这样使用。
假如主机上有 4 个核,可以通过 --cpuset 参数让容器只运行在前两个核上:
# docker run --rm -it --cpuset-cpus=0,1 progrium/stress --cpu 2
--cpuset-cpus 参数可以和 -c --cpu-shares 一起使用,限制容器只能运行在某些 CPU 核上,并且配置了使用率。
4.Mem资源限制
4.1 概述
容器可使用的内存包括两部分:物理内存和 swap。 Docker 通过下面两组参数来控制容器内存的使用量。
-m 或 --memory:设置内存的使用限额,例如 100M, 2G。
--memory-swap:设置 内存+swap 的使用限额。
docker run -m 200M --memory-swap=300M progrium/stress
允许该容器最多使用 200M 的内存和 300M 的 swap 默认情况下容器内存和 swap 的使用没有限制
使用 progrium/stress 镜像来学习如何为容器分配内存。该镜像可用于对容器执行压力测试
docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
--vm 1:启动 1 个内存工作线程。 --vm-bytes 280M:每个线程分配 280M 内存。
因为 280M 在可分配的范围(300M)内,所以工作线程能够正常工作,其过程是:
分配 280M 内存。
释放 280M 内存。
再分配 280M 内存。
再释放 280M 内存。
一直循环......
如果让工作线程分配的内存超过 300M
分配的内存超过限额,stress 线程报错,容器退出
如果在启动容器时只指定 -m 而不指定 --memory-swap,那么 --memory-swap 默认为 -m 的两倍,比如:
docker run -it -m 200M ubuntu
容器最多使用 200M 物理内存和 200M swap。
5.IO 资源限制
5.1 概述
Block IO 指的是磁盘的读写,docker 可通过设置权重、限制 bps 和 iops 的方式控制容器读写磁盘的带宽
目前 Block IO 限额只对 direct IO(不使用文件缓存)有效
block IO 权重
默认情况下,所有容器能平等地读写磁盘,可以通过设置 --blkio-weight 参数来改变容器 block IO 的优先级。
--blkio-weight 与 --cpu-shares 类似,设置的是相对权重值,默认为 500。
在下面的例子中,container_A 读写磁盘的带宽是 container_B 的两倍。
docker run -it --name container_A --blkio-weight 600 ubuntu
docker run -it --name container_B --blkio-weight 300 ubuntu
限制 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 的速率为 30 MB/s
docker run -it --device-write-bps /dev/sda:30MB ubuntu
以上是关于Docker----Docker资源限制的主要内容,如果未能解决你的问题,请参考以下文章