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访问权限。(动态的分配机制,该参数需要的是一个数值)

例:

  1. container1 --cpu-shares 1024
  2. container2: --cpu-shares 1024
  3. container3: --cpu-shares 512
  4. container4: --cpu-shares 1024
  5. container5: --cpu-shares 512
  6. 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,如下测试

  1. 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粘性

例:

  1. docker run --name s1 --rm --cpu-shares 1024 stress:latest stress -c 4 #限定cpu的权重值
  2. docker run --name s2 --rm --cpus 2.5 stress:latest stress -c 4 #分配4个cpu但只润许使用2.5个cpu
  3. docker run --name s3 --rm --cpu-period 100000 --cpu-quota 150000 stress:latest stress -c 4
  4. docker stats s1 查看s1的状态
  5. docker stats s2 查看s2的状态

 

三、测试容器内存

对容器的内存压力测试,我们可以使用 ubuntu-stress:latest 镜像来完成(http://blog.opskumu.com/docker-memory-limit.html)

  1. 获得基于alpine的内存测试镜像
  2. docker pull alexeiled/stress-ng

 

文档更新时间: 2020-03-27 13:42   作者:张尚