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
测试:
 
**然后删除这个限制,创建一个新的容器,在进行测试,查看读写速度。

 

posted @ 2024-04-09 22:31  Sky-wings  阅读(32)  评论(0编辑  收藏  举报