5、docker系统资源限制
docker系统资源限制 1、内存限制: 默认docker内存限制可以使用-m参数进行限制,但如果仅-m参数,不添加其他,那么内存限制不会限制死,比如你-m 256m内存,那么容器里程序可以跑到256m*2=512m后才会被oom给杀死,原因是源码里memory.memsw.limit_in_bytes 值是被设置成我们指定的内存参数的两倍。 目的:限制每一个内存线程分配多大内存。 注意:限制的时候不能超过物理内存,可以运行,但是会占用所有物理内存。 格式: docker run -itd -m 200M --memory-swap=300M centos /bin/bash 参数解释:memory可以使用200 swap可以使用100 例子: docker run -itd -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M progrium/stress:测试镜像,启动一个内存工作线程给280m内存 目前Docker支持内存资源限制选项: (1)-m, --memory="" 内存限制(格式:) <number>[<unit>]。Number是正整数。单位可以是一个b,k,m,或g。最低为4M。 (2)--memory-swap="" 总内存限制(内存+交换,格式:) <number>[<unit>]。Number是正整数。单位可以是一个b,k,m,或g。 # docker run -it --rm -m 100M --memory-swap -1 ubuntu-stress:latest /bin/bash 指定限制内存大小并且设置memory-swap值为-1,表示容器程序使用内存受限,而交换空间使用不受限制(宿主交换支持使用多少则容器即可使用多少。如果--memory-swap设置小于--memory则设置不生效,使用默认设置)。 使用docker stats查看当前容器内存资源使用: docker stats 4b61f98e787d 通过top实时监控stress进程内存占用: # pgrep stress --stress进程的pid # top -p stress_pid 也可以通过如下命令获取stress进程的交换占用: for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 2 -n -r | grep stress stress # docker run -it --rm -m 100M ubuntu-stress:latest /bin/bash 按照官方文档的理解,如果指定-m内存限制时不添加--memory-swap选项,则表示容器中程序可以使用100M内存和100M交换内存。默认情况下,--memory-swap会被设置成存的2倍。 我们只设置内存限制(300M),这意味着容器中的进程可以使用300M内存和300M交换内存,默认情况下,总虚拟内存大小--memory-swap将设置为内存的两倍,在这种情况下,内存+交换将是2 * 300M,因此进程也可以使用300M交换内存 如果按照以上方式运行容器提示如下信息: WARNING: Your kernel does not support swap limit capabilities, memory limited without swap. (3)--memory-swappiness="" 调整容器的内存swappiness行为。接受0到100之间的整数。0表示尽量不适用swap,100表示尽可能的使用swap; swappiness可以认为是宿主/proc/sys/vm/swappiness设定: Swappiness是一个Linux内核参数,它控制交换运行时内存的相对权重,而不是从系统页面缓存中删除页面。Swappiness可以设置为0到100之间的值。较低的值会导致内核避免交换,较高的值会导致内核尝试使用交换空间 --memory-swappiness=0 表示禁用容器swap powerpower(这点不同于宿主机,宿主机swappiness设置为0也不保证swap不会被使用) # docker run -it --rm -m 100M --memory-swappiness=0 ubuntu-stress:latest /bin/bash (4)--shm-size="" 大小/dev/shm。格式是<number><unit>。number必须大于0. Unit是可选的,可以是b(字节),k(千字节),m(兆字节)或g(千兆字节)。如果省略该单位,则系统使用字节。如果完全省略大小,则系统使用64m。 根据实际需求设置,这里不作过多的介绍 (5)--memory-reservation="" 内存软限制(格式:) <number>[<unit>]。Number是正整数。单位可以是一个b,k,m,或g。 如果不设置-m选项,那么容器使用内存可以理解为是不受限的。按照官方的说法,memory reservation设置可以确保容器不会长时间占用大量内存。 (6)--kernel-memory="" 内核内存限制(格式:) <number>[<unit>]。Number是正整数。单位可以是一个b,k,m,或g。最低为4M。 内核内存没有特殊需求,则无需额外设置 (7)--oom-kill-disable=false 是否为容器禁用OOM Killer。 # docker run -it --rm -m 100M --memory-swappiness=0 --oom-kill-disable ubuntu-stress:latest /bin/bash 默认启动一个容器,对于容器的内存是没有任何限制的。 2、CPU限制: 安装优先级进行限制,数值大,优先级高。 docker run -it --name containera -c 1024 progrium/stress --cpu 1 参数解释: 1024:优先级越大越优先,占用比值,一个占用100,两个各自50% 目前 Docker 支持 CPU 资源限制选项: (1)-c, --cpu-shares=0 CPU shares (relative weight) -c 选项将会废弃,推荐使用 --cpu-shares 默认所有的容器对于 CPU 的利用占比都是一样的,-c或者--cpu-shares可以设置CPU利用率权重,默认为1024,可以设置权重为2或者更高(单个CPU为1024,两个为2048)。如果设置选项为0,则系统会忽略该选项并且使用默认值1024。通过以上设置,只会在CPU密集(繁忙)型运行进程时体现出来。当一个 container 空闲时,其它容器都是可以占用CPU的。cpu-shares值为一个相对值,实际CPU利用率则取决于系统上运行容器的数量。 测试:当只有一个container时,可以使用任意cpu: # docker run -it --rm --cpu-shares 512 ubuntu-stress:latest /bin/bash root@87asjse889:/#: stress -c 4 测试:两个 container,一个设置为 3072,一个设置 1024,CPU 占用如下: # docker run -it --rm --cpu-shares 3072 ubuntu-stress:latest /bin/bash root@87asjse889:/#: stress -c 4 (2)--cpu-period=0 Limit the CPU CFS (Completely Fair Scheduler) period 默认的 CPU CFS「Completely Fair Scheduler」period 是 100ms。我们可以通过 --cpu-period 值限制容器的 CPU 使用。一般 --cpu-period 配合 --cpu-quota 一起使用。 设置 cpu-period 为 100ms,cpu-quota 为 200ms,表示最多可以使用 2 个 cpu, 测试: # docker run -it --rm --cpu=period=100000 --cpu-quota=200000 ubuntu-stress:latest /bin/bash (3)--cpuset-cpus="" CPUs in which to allow execution (0-3, 0,1) 通过 --cpuset-cpus 可以绑定指定容器使用指定 CPU: 设置测试容器只能使用 cpu1 和 cpu3,即最多使用 2 个 固定的 CPU 上: # docker run -it --rm --cpuset-cpus="1,3" ubuntu-stress:latest /bin/bash root@87asjse889:/#: stress -c 4 以下表示容器可以利用 CPU1、CPU2 和 CPU3: # docker run -it --rm --cpuset-cpus="1-3" ubuntu-stress:latest /bin/bash (4)--cpuset-mems="" Memory nodes (MEMs) in which to allow execution (0-3, 0,1). Only effective on NUMA systems. (5)--cpu-quota=0 Limit the CPU CFS (Completely Fair Scheduler) quota 2、硬盘(Block IO)限制: 限制原因:会反复读写硬盘,容易坏 bps 每秒钟读写的数据量 设置参数:--device-read-bps --device-write-bps iops 每秒钟读写IO次数 --device-read-iops --device-write-iops 例子: docker run -itd --name containerc --blkio-weight 600 centos /bin/bahs 参数解释: 优先设置权重 --blkio-weight 600 验证: **docker run -it --device-write-bps /dev/sda:30MB centos /bin/bash 设置对硬盘的读写为30MB **time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct 测试: **然后删除这个限制,创建一个新的容器,在进行测试,查看读写速度。