layout: post
title: Docker资源限制
date: 2018-04-20
tags: [“Docker”,”自动化运维工具”]
Docker的资源限制是由内核的control group来进行限制的。我们可以在启动Docker容器的使用使用资源限制参数。
一、在RUN时可以启动docker的内存资源限制。
-m or --memory=
分配给容器的最大空间容量(硬限制)。
--memory-swap
分配给容器最大可用多少交换内存。(-1表示不做空间限制)
--memory-swapiness int
默认情况下,主机内核可以交换容器使用的匿名页面的百分比。您可以将—memory-swappiness设置为介于0和100之间的值,以调整此百分比。(一般设定为0)
--memory-reservation
内存使用的软限制,其值必须比 -m —memory 值小,且使用内存的超过了软限制,会有使用时长限制。
--kernel-memory
容器最大可以占用的内核内存(用的不多,很难定义),默认4M
--oom-kill-disable
宿主机当发生oom时,优先kill掉容器。
--oom-score-adj int
宿主机发生oom时,被kill的优先级(-1000 — 1000)
二、CPU资源限制(当计算机上跑着多个容器的时候,可以限制单个容器对CPU的限制)
--cpu-shares
CPU共享方式;将此标志设置为大于或小于默认值1024的值,以增加或减小容器的重量,并使其可访问主机CPU周期的更大或更小比例。这仅在CPU周期受到限制时才会执行。当大量CPU周期可用时,所有容器都使用尽可能多的CPU。这样,这是一个软限制。 —cpu-shares不会阻止容器在群集模式下进行调度。它优先考虑容器CPU资源的可用CPU周期。它不保证或保留任何特定的CPU访问权限。(动态的分配机制,该参数需要的是一个数值)
例:
container1: --cpu-shares 1024
container2: --cpu-shares 1024
container3: --cpu-shares 512
container4: --cpu-shares 1024
container5: --cpu-shares 512
当cpu使用满载时,按照所设置的数值进行cpu时间片的分配(可以认为其是权重)。 即container1 所分配到的cpu时间片为1024/(1024*3+512*2)
--cpu-period=
指定CPU CFS(默认的CPU CFS[completely Fair Scheduler 完全公平的调度] 是100ms)调度程序周期,该周期与—cpu-quota一起使用。默认为100微秒。大多数用户不会从默认值更改此设置。如果您使用Docker 1.13或更高版本,请改用—cpus。
--cpu-quota=
在容器上添加一个CPU CFS配额。每个—cpu-period允许CPU访问的容器数微秒数。换句话说,cpu-quota / cpu-period。如果您使用Docker 1.13或更高版本,请改用—cpus
例:设置cpu-period 为100ms,cpu-quota为200ms,表示最多可以使用2个cpu,如下测试
docker rum -it --rm --cpu-perio=100000 --cpu-quota=200000 ubuntu-stress:latest
--cpus
直接限定cpu数(可以设定像 1.5这样的值,表示1个CPU用满,另一颗CPU可以使用50%)
--cpuset-cpus
做cpu粘性([0-3])绑定几号cpu。
--cpuset-mems
限制cpu能够运行在哪些物理内存段中(只用高端服务器支持才可以做次限制,用处不多)
--cpu-rt-period int
限定在cpu真实许CPU访问的容器数微秒数
--cpu-rt-runtime int
限定cpu真实CPU CFS调度程序周期
总结:使用cpu限定有三种方法
1)--cpu-shares
动态分配cpu
2)--cpus
或 --cpu-period=
加 --cpu-period=
限定使用CPU数量
3)--cpuset-cpus
做CPU粘性
例:
docker run --name s1 --rm --cpu-shares 1024 stress:latest stress -c 4 #限定cpu的权重值
docker run --name s2 --rm --cpus 2.5 stress:latest stress -c 4 #分配4个cpu但只润许使用2.5个cpu
docker run --name s3 --rm --cpu-period 100000 --cpu-quota 150000 stress:latest stress -c 4
docker stats s1 查看s1的状态
docker stats s2 查看s2的状态
三、测试容器内存
对容器的内存压力测试,我们可以使用 ubuntu-stress:latest 镜像来完成(http://blog.opskumu.com/docker-memory-limit.html)
获得基于alpine的内存测试镜像
docker pull alexeiled/stress-ng