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。
子系统
- cpu:主要限制进程的 cpu 使用率。
- cpuacct:可以统计 cgroups 中的进程的 cpu 使用报告。
- cpuset:可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。
- memory:可以限制进程的 memory 使用量。
- blkio:可以限制进程的块设备 io。
- devices:可以控制进程能够访问某些设备。
- net_cls:可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
- freezer:可以挂起或者恢复 cgroups 中的进程。
- ns:可以使不同 cgroups 下面的进程使用不同的 namespace。
CPU子系统通过Linux CFS(Completely Fair Scheduler)调度器实现,当前进程调度时CFS会惩罚当前进程,使其他进程在下次调度时尽可以取代当前进程,实现公平调度。
安装和使用
内核版本2.6.24及以上才有。
yum install libcgroup
sudo apt-get install cgroup-bin
#服务启动和停止
service cgconifg start
service cgconifg stop
Cgroups启动时,会读取配置文件/etc/cgconifg.conf内容。
mount {
cpu = /cgroup/cpu_test;
}