cgroups简介

cgroups,是一个非常强大的linux内核东西,他不仅能够约束被namespace 阻隔起来的资源,还能够 为资源设置权重、核算运用量、操控进程启停等等。所以cgroups (Control groups) 实现了对资源的配额和衡量。

cgroups有四大功用

  • 资源约束:能够对使命运用的资源总额进行约束。

  • 优先级分配:经过分配的cpu时刻片数量以及磁盘IO带宽巨细,实际上相当于操控了使命运转优先级。

  • 资源计算:能够计算系统的资源运用量,如cpu时长,内存用量等。

  • 使命操控: cgroup能够对使命 履行挂起、康复等操作。

Docker 经过cgroup 来操控容器运用的资源配额,包括CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和运用量操控。

cpu时刻片的概念

时刻片即CPU分配给各个程序的时刻,每个线程被分配一个时刻段,称作它的时刻片,即该进程答应运转的时刻,使各个程序从表面上看是一起进行的。假如在时刻片完毕时进程还在运转,则CPU将被剥夺并分配给另一个进程。假如进程在时刻片完毕前阻塞或完毕,则CPU当即进行切换。而不会造成CPU资源浪费。

在宏观上:咱们能够一起翻开多个应用程序,每个程序双管齐下,一起运转。但在微观上:由于只要一个CPU,一次只能处理程序要求的一部分,怎么处理公正,一种方法就是引入时刻片,每个程序轮流履行。

Docker Cgroups资源控制管理

对CPU运用的约束

CPU在处理进程的时分实际上是在一个周期内,给这个进程分配的时刻,让时刻分片再让CPU进行处理

CPU时刻默以为100ms

假如此刻只想独自让进程一独自享受CPU 50%的速度,那么就要分配给进程一50ms的时刻,别的两个能够平均分配剩下的50%的调度周期即50ms的时刻,也能够自定义进程二运用40%,那么进程3就只能运用10%,三个进程的时刻周期,加在一起有必要是100ms,假如设定超过了100ms,CPU在满负荷运转的状态下,可能会呈现进程卡死,乃至宕机。

假如不想运用默许的时刻,能够自己设置,可是三个进程的周期时刻加在一起也有必要是咱们设定的时刻规模。

在特殊的一些场景是能够超负荷运转CPU的,可是不行能让一向超负荷运转,所以还是要在规模值内合理分配进程的运用率。

设置CPU运用率上限

Linux经过CFS (Completely Fair Scheduler, 完全公正调度器)来调度各个进程对CPU的运用。CFS默许的调度周期是100ms

咱们能够设置每个容器进程的调度周期,以及在这个周期内各个容器最多能运用多少CPU时刻。

  • 运用 –cpu-period 即可设置调度周期,运用 –cpu-quota 即可设置在每个周期内容器能运用的CPU时刻。两者能够合作运用。
  • CFS周期的有用规模是1ms ~ 1s, 对应的 –cpu-period 的数值规模是 1000 ~1000000 (单位微秒)
  • 而容器的CPU配额有必要不小于1ms,即 –cpu-quota 的值有必要 >= 1000。

检查容器的默许CPU运用约束

Docker Cgroups资源控制管理

  • cpu.cfs_period_us:分配的周期(微秒,所以文件名顶用u),默以为100000。
  • cpu.cfs_quota_us:表明该cgroups约束占用的时刻(微秒),默以为-1,表明不约束。
  • cpu.cfs_quota_us 假如设为50000,表明占用 50000/100000=50%的CPU。

假如说现在有5个容器正在一起运转,此刻有一台容器没有做CPU的约束,此刻这台没有做约束的容器忽然呈现了bug,使CPU的运用率达到了高峰,可是别的容器也在一起在运转,这样就会是的CPU超负荷运作,会使得机器宕机。这样别的容器业务也会停止。

进行压力测验

Docker Cgroups资源控制管理

Docker Cgroups资源控制管理

Docker Cgroups资源控制管理

Docker Cgroups资源控制管理

Docker Cgroups资源控制管理

创立容器时设置CPU运用时刻约束

Docker Cgroups资源控制管理

登录容器test2,写个死循环脚本并运转

Docker Cgroups资源控制管理

Docker Cgroups资源控制管理

Docker Cgroups资源控制管理

容器的CPU运用时刻约束设为50000,而调度周期为100000,表明容器占用50000/100000=50%的CPU。

对已存在的容器进行CPU约束

直接修正 /sys/fs/cgroup/cpu/docker/容器id/cpu.cfs_quota_us 文件

Docker Cgroups资源控制管理

再进入test1容器履行之前创立好的脚本,进行压力测验

Docker Cgroups资源控制管理

Docker Cgroups资源控制管理

容器的CPU运用时刻约束设为25000,而调度周期为100000,表明容器占用25000/100000=25%的CPU。

设置CPU资源占用比(设置多个容器时才有用)

Docker 经过 –cpu-shares 指定CPU比例,默许值为1024,值为1024的倍数

创立两个容器,设置CPU资源占用比

Docker Cgroups资源控制管理

分别进入两个容器,进行压力测验

进入c1容器,进行压力测验

Docker Cgroups资源控制管理

Docker Cgroups资源控制管理

Docker Cgroups资源控制管理

进入c2容器,进行压力测验

Docker Cgroups资源控制管理

Docker Cgroups资源控制管理

Docker Cgroups资源控制管理

检查容器运转状态,调查CPU运用占比

Docker Cgroups资源控制管理

  • 能够看到在 CPU 进行时刻片分配的时分,容器 c2比容器c1多一倍的机会获得 CPU 的时刻片。

  • 但分配的成果取决于其时主机和其他容器的运转状态,实际上也无法保证容器c1一定能获得 CPU 时刻片 比方容器a1的进程一向是闲暇的,那么容器c2 是能够获取比容器c1更多的 CPU 时刻片的。极端状况下,例如主机上只运转了一个容器,即便它的 CPU 比例只要 50,它也能够独占整个主机的 CPU 资源。

  • Cgroups 只在容器分配的资源紧缺时,即在需要对容器运用的资源进行约束时,才会收效。因此,无法单纯根据某个容器的 CPU 比例来确定有多少CPU 资源分配给它,资源分配成果取决于一起运转的其他容器的 CPU 分配和容器中进程运转状况。

设置容器绑定指定的CPU(绑核)

留意:CPU编号从0开端。

例如:编号1、3代表第二个核和第四个核 。

实际操作

Docker Cgroups资源控制管理

进入容器,进行压力测验

Docker Cgroups资源控制管理

Docker Cgroups资源控制管理

Docker Cgroups资源控制管理

履行top命令再按1检查CPU运用状况

Docker Cgroups资源控制管理

对内存运用的约束

约束容器能够运用的最大内存

-m (或–memory=)选项用于约束容器能够运用的最大内存

Docker Cgroups资源控制管理

Docker Cgroups资源控制管理

约束容器可用的swap 巨细

约束可用的swap 巨细,–memory-swap

  • –memory-swap是有必要要与 –memory(或-m)一起运用的。
  • 正常状况下, –memory-swap 的值包含容器可用内存和可用swap 。
  • 所以 -m 300m –memory-swap=1g 的含义为:容器能够运用300M 的物理内存,并且能够运用700M (1G – 300M)的swap。

不同数值含义

  • 设置为0或许不设置,则容器能够运用的 swap 巨细为 -m 值的两倍。
  • 假如 –memory-swap 的值和 -m 值相同,则容器不能运用swap。
  • 假如 –memory-swap 值为 -1,它表明容器程序运用的内存受限,而能够运用的swap空间运用不受约束(宿主机有多少swap 容器就能够运用多少)。

示例

  • –memory-swap 的值包含容器可用内存和可用swap,减去-m的值才是可用swap的值。

    • 表明容器能够运用512M的物理内存,并且能够运用512M的swap。由于1g减去512m的物理内存,剩余值才是可用swap。
    • docker run -itd --name c1 -m 512m --memory-swap=1g centos:7 bash
  • –memoryswap值和 -m 的值相同,表明容器无法运用swap

    • docker run -itd --name c2 -m 512m --memory-swap=512m centos:7 bash
  • –memory-swap 的值设置为0或许不设置,则容器能够运用的 swap 巨细为 -m 值的两倍。

    • docker run -itd --name c3 -m 512m centos:7 bash
  • –memory-swap 值为 -1,它表明容器程序运用的内存受限,但能够运用的swap空间运用不受约束(宿主机有多少swap 容器就能够运用多少)。

    • docker run -itd --name c4 -m 512m --memory-swap=-1 centos:7 bash

对磁盘IO的配置操控(blkio)的约束

  • –device-read-bps:约束某个设备上的读速度bps ( 数据量),单位能够是kb、mb (M)或许gb。

    • 例: docker run -itd --name test9 --device-read-bps /dev/sda:1M centos:7 /bin/bash
    • 表明该容器每秒只能读取1M的数据量
  • –device-write-bps : 约束某个设备上的写速度bps ( 数据量),单位能够是kb、mb (M)或许gb。

    • 例: docker run -itd --name test10 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
    • 表明该容器每秒只能写入1M的数据量
  • –device-read-iops :约束读某个设备的iops (次数)

  • –device-write-iops :约束写入某个设备的iops ( 次数)

创立容器,不约束写速度

没有约束写速度的状况下,写入很快,0.067秒的时刻内已写入50M的数据,写入速度为779M/s。

Docker Cgroups资源控制管理

创立容器,并约束写速度

写入50M的数据,需要50s左右,由于约束了容器的写速度是 1.0 MB/s。

Docker Cgroups资源控制管理

清除docker占用的磁盘空间

docker system prune -a 可用于整理磁盘,删除封闭的容器、无用的数据卷和网络。

Docker Cgroups资源控制管理

Docker Cgroups资源控制管理

Docker Cgroups资源控制管理

总结

对cpu的约束参数

docker run -cpu-period   #设置调度周期时刻1000~1000000
      -cpu-quota   #设置容器进程的CPU占用时刻,要与调度周期时刻成比例
      --cpu-shares  #设置多个容器之间的CPU资源占用比
      --cpuset-cpus  #绑核(第一个CPU编号从0开端)

对内存的约束

-m 物理内存 [--memory-swap=总值]

对磁盘IO的约束

--device-read-bps 设备文件:1mb/1M   #约束读速度
--device-write-bps 设备文件:1mb/1M  #约束写速度
--device-read-iops          #约束读次数
--device-write-iops         #约束写次数
docker system prune -a  #整理磁盘,删除封闭的容器、无用的数据卷和网络。