Docker-Linux Cgroups

什么是Linux Cgroups

Linux Cgroups提供了对一组进程以及将来子进程的资源限制、控制和统计的能力,包含CPU、内存、存储、网络等。通过Cgroups,可以方便的限制某个进程的资源占用,并且可以实时统计监控进程和统计消息。

Cgroups的组件

cgroup

cgroup是对进程分组管理的一种机制,一个cgroup包含一组进程,并且在cgroup 上增加Linux subsystem的各种参数配置,将一组进程和一组subsystem系统参数关联起来

subsystem

subsystem是一组资源控制模块,有下面的几个模块

  • blkio设置对块设备(比如硬盘)输入输出的访问控制

  • cpu设置cgroup中进程的CPU被调度的策略

  • cpuacct可以统计cgroup中进程调度的CPu占用

  • cpuset在多核机器上设置cgroup中进程可以使用的CPU和内存(此内存仅适用于NUMA架构)

  • devices控制cgroup中进程对于设备的访问

  • freezer用于挂起(suspend)和恢复(resume)cgroup中的进程

  • memory用于控制cgroup中进程的内存占用

  • net_cls用于将cgroup中进程产生的网络包分类,以便Linux的tc(traffic controller)可以根据分类区分出来自某个cgroup的包做限流和监控

  • net_prio设置cgroup中进程产生的网络流量的优先级

  • ns使cgroup中的进程在新的Namespace中fork新进程(NEWNS)时,创建出一个新的cgroup,这个cgroup包含新的Namespace中的进程

查看当前版本的Kernel支持的subsytem

/ lssubsys -a

hierarchy

把一组cgroup串成一个树状结构,一个这样的树便是一个hierarchy,通过树状结构,Cgroup实现了继承。

三个组件的关系

  • 系统在创建了新的hierarchy之后,系统中所有的进程都会加入到hierarchy的cgroup的根节点,这个cgroup根节点是hierarchy默认创建的
  • 一个subsystem只能附加到一个hierarchy上面
  • 一个hierarchy可以附加多个subsystem
  • 一个进程可以作为多个cgroup的成员,但是这些cgroup必须在不同的hierarchy中
  • 一个进程fork出子进程时,子进程和父进程在同一个cgroup,也可以根据需要将其移动到其他的cgroup中