Docker Notes-cgroups

摘要: Docker Notes系列为学习Docker笔记,本文是学习cgroups 资源限制的笔记

正文:

上节我们了解了Docker背后的资源隔离技术namespace,本节介绍另一个内核工具cgroups。

cgroups作用

cgroups可以限制、记录、隔离进程组所使用的物理资源(包括:CPU、memory、IO等),为容器实现虚拟化提供了基本保证,是构建Docker等一系列虚拟化管理工具的基石

cgroups提供:

  • 资源限制

    对进程组的资源使用限制,如对应用运行时使用内存的限制

  • 优先级

    通过分配CPU的时间片数量和磁盘IO带宽大小

  • 资源统计

    统计系统的资源使用量

  • 控制

    对进程组挂起、恢复、重启动等操作

cgroups子系统

cgroups现在全称是control groups,它为每种可以控制的资源定义了一个子系统

  • blkio

    可以限制块设备的输入输出,如磁盘、USB

  • cpu

    可以限制进程的cpu 使用率

  • cpuacct

    可以生成cpu 使用报告

  • cpuset

    可以为cgroups中进程分配独立的CPU和内存

  • devices

    可以控制进程对设备的访问

  • freezer

    可以对进程进行挂起或恢复

  • memory

    可以对进程的memory使用量进行限制,并生成内存资源使用情况报告

  • perf_event

    可以对进程进行统一的性能测试

  • net_cls

    可以使用classid标记网络包,然后Linux流量控制程序识别从具体cgroups中生成的数据包

docker组的层级结构

docker daemon会在每个子系统的控制组目录下创建一个叫docker的控制组,在这个组里为每一个容器创建一个容器id命名的容器控制组

  • 如cpu子系统层级结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[root@cf /]# tree /sys/fs/cgroup/cpu/docker
/sys/fs/cgroup/cpu/docker
├── 69aa00d7aa3b6654b63280e66b671f509a3019a032ec5a09e299b793b37c6775
│   ├── cgroup.clone_children
│   ├── cgroup.event_control
│   ├── cgroup.procs
│   ├── cpuacct.stat
│   ├── cpuacct.usage
│   ├── cpuacct.usage_percpu
│   ├── cpu.cfs_period_us
│   ├── cpu.cfs_quota_us
│   ├── cpu.rt_period_us
│   ├── cpu.rt_runtime_us
│   ├── cpu.shares
│   ├── cpu.stat
│   ├── notify_on_release
│   └── tasks
├── cgroup.clone_children
├── cgroup.event_control
├── cgroup.procs
├── cpuacct.stat
├── cpuacct.usage
├── cpuacct.usage_percpu
├── cpu.cfs_period_us
├── cpu.cfs_quota_us
├── cpu.rt_period_us
├── cpu.rt_runtime_us
├── cpu.shares
├── cpu.stat
├── notify_on_release
└── tasks
  • 一些文件的作用

    • tasks

      1
      2
      3
      4
      5
      [root@cf 69aa00d7aa3b6654b63280e66b671f509a3019a032ec5a09e299b793b37c6775]# cat tasks 
      29001
      29058
      29059
      29060

      该文件罗列了所有在该groups中的进程id

    • cgroup.procs

      1
      2
      [root@cf 69aa00d7aa3b6654b63280e66b671f509a3019a032ec5a09e299b793b37c6775]# cat cgroup.procs 
      29001

      该文件罗列了所有在该groups中的进程组id(第一个进程的pid)

    • notify_on_release

      该文件默认0,表示cgroups是否在最后一个进程退出时通知运行release agent,0表示不运行

    • cpuacct.stat

      1
      2
      3
      [root@cf 69aa00d7aa3b6654b63280e66b671f509a3019a032ec5a09e299b793b37c6775]# cat cpuacct.stat
      user 2435
      system 4548

      该文件统计了该控制组中进程用户态和内核态的 cpu 使用量

    • cpuacct.usage&cpuacct.usage_percpu

      该文件统计了该控制组中进程消耗的cpu时间,单位是纳秒