docker 利用 Linux 内核的 cgroup 功能,实现对容器的资源使用限制,通过将容器内的进程 PID号 加入同一个以容器ID为开头命名的cgroup控制组内,实现容器进程的资源限制

验证cgroup对CPU资源的限制

  1. 验证当前主机已挂载cgroup

    1. mount -t cgroup

    image.png

  2. 创建控制组 demo

  1. cd /sys/fs/cgroup/cpu
  2. mkdir demo
  3. ls -l demo #正常创建后demo控制组目录下会生成如cpu.cfs.quota_us 等文件

image.png

  1. 生成一个CPU占用100%的进程

    1. while true;do : ; done &

    image.png
    该进程会进入死循环,将当前系统cpu使用率堆到100%

  2. 检查当前cpu使用率,及该进程占用cpu情况

    1. top #top 工具一般为系统自带,用于显示当前系统负载情况

    image.png

  1. pidstat -p 15028 3 # pidstat 工具可通过sysstat包安装,此处 -p 15028 表示查询PID为15028的进程, 3 表示每3秒显示一次

image.png
通过 pidstat 工具确认是该进程导致系统CPU升高,该进程CPU占用为100%

  1. 将该进程加入demo控制组,并限制cpu使用率为20%

    1. demo控制组下还未设置cpu限制,所以 cpu.cfs_quota_us 值为 -1

      1. cat cpu.cfs_quota_us
      2. cat cpu.cfs_period_us

      image.png
      cpu.cfs_period_us 值为 100000ns 表示 100ms 内该控制组下进程可以使用的CPU时间
      cpu.cfs_quota_us 值为 -1 表示当前demo控制组下进程组在100ms内可以使用的cpu时间无限制

      b. 将 cpu.cfs_quota_us 修改为 20000,并将 15028 这个 PID加入到demo控制组

      1. echo 20000 > cpu.cfs_quota_us
      2. echo 15028 > tasks

      image.png
      cpu.cfs_quota_us 配置为 20000ns (20ms) 表示 100ms 内该控制组下进程可以使用20ms的cpu时间,相当于限制该进程组下的进程可以使用20%的CPU资源

      c. 验证进程CPU占用是否降低到20%
      image.png

      1. top

      image.png

Docker对容器的资源限制

Docker会在每个可使用cgroup限制的资源内创建一个docker目录(相当于创建一个Docker控制组),并在Docker控制组内为每个容器创建一个独立的控制组,容器启动后,将容器的进程ID 加入到tasks路径下,实现对容器的资源限制,如下截图展示了demo容器内内存限制为512M的情况
image.png