Docker入门系列–Docker资源限制(八)

1、内存资源限制

相关说明

  • CGroup是Control Groups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物力资源(如cpu mempry i/o等等)的机制。2007年进入Linux2.6.24内核,CGroup不是全新创咋的,它将进程管理从cpuset中剥离出来,作者是Google的Paul Menage
  • 默认情况下,如果不对容器做任何限制,容器能够占用当前系统能给容器提供的所有资源
  • Docker限制可以从Memory、CPU、BlockI/O三个方面
  • OOME:Out Of menory Exception
    &emps;一旦发生OOME,任何进程都可以被杀死,包括docker daemon 在内
    &emps;为此,Docker调整了,docker daemon的OOM优先级,以免被内核关闭

重点提示

  • 为应用做内存压力测试,理解正常业务需求下使用的内存情况,然后才能进入生产环境使用
  • 一定要设置容器的内存使用呢上限
  • 尽量保证主机资源充足,一旦通过监控发现资源不足,就进行扩容或者对容器进行迁移
  • 如果可以(内存资源充足的情况下),尽量不要使用swap,swap的使用会导致内存计算复杂,对调度器非常不友好。

2、内存限制设置方式

在docker启动参数中,和内存限制有关的包括(参数值一般是内存大小,也就是一个正数,后面跟着内存的单位b、k、m、g,分别对应bytes、KB、MB、和GB):

  • -m -memory:容器能使用的最大内存大小,最小值为4m
  • –memory-swap:容器能够使用swap大小
  • –memory-swappiness:默认情况下,主机可以把容器使用的匿名页(anonymous page)swap出来,你可以设置一个0-100之间的值,代表允许swap出来的比例
  • –memory-reservation:设置一个内存使用的soft limit,设置值小于-m设置
  • –kernel-memory:容器能够使用的kernel memory大小,最小值为4m。
  • –oom-kill-disable:是否运行OOM的时候杀死容器,只有设置了-m,才可以把这个选项设置为false,否则容器会耗尽主机内存,而且导致主机应用被杀死。

3、参数示意图

–memory-swap

–memory

功能

正数S

正数M

容器可用空间为S,其中ram为M,swap为(S-M),若S=M,则无可用swap资源

0

正数M

相当于未设置swap(unset)

unset

正数M

若主机(Docker Host)启用了swap,则容器的可用swa为2*M

-l

正数M

若主机(Docker Host)启用了swap,则容器可以使用最大至主机上的所有swap空间的swap资源

注意:在容器内使用free命令可以看到的swap空间并不具有其所闪现的空间知识意义

4、CPU资源限制
相关说明
Docker提供的CPU资源限制选项可以在多核系统上限制容器能利用哪些vCPU。而对容器最多能使用的CPU时间有两种限制方式:

  • 一是有多个CPU密集型的融国企竞争CPU时,设置各个容器能使用的CPU时间相对比
  • 二是以绝对的方式设置容器在每个调度周期内最多能使用的CPU时间

CPU限制方式

  • –cpuset-cpus=" " 允许使用的CPU集,值可以为0-3,0,1
  • -c,–cpu-shares=0 CPU共享权值(相对权重),默认值1024
  • –cpuset-mems=" " 允许在上执行的内存节点(MEMs)
  • –cpu-period=0 即可设置调度周期,CFS周期的有效范围是1ms-1s,对应的–cpu-period的数值范围是1000~1000000
  • –cpu-quota=0 设置在每个周期内容器能使用的CPU时间,容器的CPU配额必须不小于1ms,即–cpu-quota的值必须>=1000,单位微妙
  • –cpus 能够限制容器可以使用的主机CPU个数,并且还可以指定如1.5之类的小数
    Example
    docker run -it --cpu-period=50000 --cpu-quota=25000 ubuntu:16.04 /bin/bash
    doker run -it --cpu-period=10000 --cpu0quota=20000 ubuntu:16.04 /bin/bash

5、限制性试验
docker run --name stress -it --rm -m 256m lorel/docker-stress-ng:latest stress stress -vm2
docker run --name stress -it --rm --cpus2 lorel/docker-stress-ng:latest stress stress --cpu 8
docker run --name stress -it --rm --cpuset-cpus 0 lorel/docker-stress-ng:latest stress stress --cpu 8