cgroups 是Linux内核提供的一种可以限制单个进程或者多个进程所使用资源的机制,可以对 cpu,内存等资源实现精细化的控制。Yarn和Docker都是使用cgroups控制CPU资源。可以限制、记录、隔离进程组使用的资源(CPU、内存、IO)。

术语表

  • task(任务):task 就表示系统的一个进程。
  • cgroup(控制组):cgroups 中的资源控制都以 cgroup 为单位实现。cgroup 表示按某种资源控制标准划分而成的任务组,包含一个或多个子系统。一个任务可以加入某个 cgroup,也可以从某个 cgroup 迁移到另外一个 cgroup。
  • subsystem(子系统):cgroups 中的 subsystem 就是一个资源调度控制器(Resource Controller)。比如 CPU 子系统可以控制 CPU 时间分配,内存子系统可以限制 cgroup 内存使用量。子系统必须附加到层级树上。
  • hierarchy(层级树):hierarchy 由一系列 cgroup 以一个树状结构排列而成,每个 hierarchy 通过绑定对应的 subsystem 进行资源调度。hierarchy 中的 cgroup 节点可以包含零或多个子节点,子节点继承父节点的属性。整个系统可以有多个 hierarchy。

    子系统

  1. cpu:主要限制进程的 cpu 使用率。
  2. cpuacct:可以统计 cgroups 中的进程的 cpu 使用报告。
  3. cpuset:可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。
  4. memory:可以限制进程的 memory 使用量。
  5. blkio:可以限制进程的块设备 io。
  6. devices:可以控制进程能够访问某些设备。
  7. net_cls:可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
  8. freezer:可以挂起或者恢复 cgroups 中的进程。
  9. ns:可以使不同 cgroups 下面的进程使用不同的 namespace。

CPU子系统通过Linux CFS(Completely Fair Scheduler)调度器实现,当前进程调度时CFS会惩罚当前进程,使其他进程在下次调度时尽可以取代当前进程,实现公平调度。

安装和使用

内核版本2.6.24及以上才有。

  1. yum install libcgroup
  2. sudo apt-get install cgroup-bin
  3. #服务启动和停止
  4. service cgconifg start
  5. service cgconifg stop

Cgroups启动时,会读取配置文件/etc/cgconifg.conf内容。

  1. mount {
  2. cpu = /cgroup/cpu_test;
  3. }

参考

https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/resource_management_guide/index