概念

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

cgroup概述:cgroup是Control Groups的缩写。是Linux内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如qpu、 memory、磁盘、IO等等)的机制,被LXC、docker 等很多项目用于实现进程资源控制。cgroup将任意进程进行分组化管理的Linux内核功能。

cgroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,IO或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。

cpu

—cpu-share

这个命令是按照权重来分配cpu的资源

  1. // 查看指令
  2. docker run --help | grep cpu-share
  3. // 查看当前cpu配额,需要进入容器,否则看到的是外面的
  4. cat /sys/fs/cgroup/cpu/cpu.shares
  5. // 运行
  6. docker run -it --cpu-shares 512 centos bash

默认每个docker容器的cpu份额值都是1024,在同一个CPU核心上同时运行多个容器时,容器的cpu加权的效果才能体现出来。

例:两个容器A、B的cpu份额分别为1000和500,结果会怎么样?
情况1:A和B正常运行,在cpu进行时间片分配的时候,容器A比容器B多一倍的机会获得CPU
的时间片。
情况2:分配的结果取决于当时其他容器的运行状态。比如容器A的进程一直是空闲的,那么容器B是可以获取比容器A更多的CPU时间片的;比如主机上只运行了一个容器,即使它的cpu份额只有50,它也可以独占整个主机的qpu资源。

cgroups只在多个容器同时争抢同一个cpu资源时, cpu配额才会生效。因此,无法单纯根据某个容器的cpu份额来确定有多少cpu资源分配给它,资源分配结果取决于同时运行的其他容器的cpu分配和容器中进程运行情况。

—cpuset-cpus

互动:为什么把进程绑定到cpu上,运行效率就高?
注:当cpu数量很多时,确实需要绑定进程到cpu上,这样可以减少cpu上下文切换的开销,节约时间。

docker run -it --name centos --cpuset-cpus 0-2 centos bash

内存

—cpuset-mems

-m

// 限制内存128m
docker run -it -m 128m centos bash

IO

—device

—device将主机设备添加到容器

—device-read-bps value

mkdir /var/test
docker run --help | grep device
// 限制IO需要先使用--device添加可以限制的设备
docker run -it --device /dev/sda --device-read-bps /dev/sda:1m centos bash
// 测试
time dd if=/dev/sda of=test.txt bs=1M count=10

—device-write-bps value

引用

https://www.bilibili.com/video/BV1h5411P7Nm?p=5&spm_id_from=pageDriver