跳转至

CGroups

CGroups

功能和定位

Cgroups全称Control Groups,是Linux内核提供的物理资源隔离机制,通过这种机制,可以实现对Linux进程或者进程组的资源限制、隔离和统计功能。

比如可以通过cgroup限制特定进程的资源使用,比如使用特定数目的cpu核数和特定大小的内存,如果资源超限的情况下,会被暂停或者杀掉。

Cgroup是于2.6内核由Google公司主导引入的,它是Linux内核实现资源虚拟化的技术基石,LXC(Linux Containers)和docker容器所用到的资源隔离技术,正是Cgroup。

相关概念介绍

  • 任务(task): 在cgroup中,任务就是一个进程。
  • 控制组(control group): cgroup的资源控制是以控制组的方式实现,控制组指明了资源的配额限制。进程可以加入到某个控制组,也可以迁移到另一个控制组。
  • 层级(hierarchy): 控制组有层级关系,类似树的结构,子节点的控制组继承父控制组的属性(资源配额、限制等)。
  • 子系统(subsystem): 一个子系统其实就是一种资源的控制器,比如memory子系统可以控制进程内存的使用。子系统需要加入到某个层级,然后该层级的所有控制组,均受到这个子系统的控制。

概念间的关系:

  • 子系统可以依附多个层级,当且仅当这些层级没有其他的子系统,比如两个层级同时只有一个cpu子系统,是可以的。
  • 一个层级可以附加多个子系统。
  • 一个任务可以是多个cgroup的成员,但这些cgroup必须位于不同的层级。
  • 子进程自动成为父进程cgroup的成员,可按需求将子进程移到不同的cgroup中。

cgroup关系图如下:

img

两个任务组成了一个 Task Group,并使用了 CPU 和 Memory 两个子系统的 cgroup,用于控制 CPU 和 MEM 的资源隔离。

子系统

  • cpu: 限制进程的 cpu 使用率。
  • cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。
  • cpuset: 为cgroups中的进程分配单独的cpu节点或者内存节点。
  • memory: 限制进程的memory使用量。
  • blkio: 限制进程的块设备io。
  • devices: 控制进程能够访问某些设备。
  • net_cls: 标记cgroups中进程的网络数据包,然后可以使用tc模块(traffic control)对数据包进行控制。
  • net_prio: 限制进程网络流量的优先级。
  • huge_tlb: 限制HugeTLB的使用。
  • freezer:挂起或者恢复cgroups中的进程。
  • ns: 控制cgroups中的进程使用不同的namespace。

cgroups文件系统

Linux通过文件的方式,将cgroups的功能和配置暴露给用户,这得益于Linux的虚拟文件系统(VFS)。VFS将具体文件系统的细节隐藏起来,给用户态提供一个统一的文件系统API接口,cgroups和VFS之间的链接部分,称之为cgroups文件系统。

比如挂在 cpu、cpuset、memory 三个子系统到 /cgroups/cpu_mem 目录下

Bash
mount -t cgroup -o cpu,cpuset,memory cpu_mem /cgroups/cpu_mem

关于虚拟文件系统机制,见浅谈Linux虚拟文件系统机制

查看 cgroup 子系统挂载点

通过命令 mount -t cgroup 就可以查看当前的所有 linux cgroups 子系统与挂载点:

img

6.2 创建隔离组

例如我们要对某一组进程的 cpu 资源进行限制,那么我们就执行:

Bash
 cd /sys/fs/cgroup/cpu
 mkdir test_limit
 cd test_limit

查看创建后的目录,可以看到,目录中已经生成了一系列文件。

6.3 限制 CPU 利用率

接下来我们就可以来对进程进行 CPU 利用率的限制了。

首先我们写一个 C 语言的程序,用来将 CPU 跑到 100%:

C
 int main() {
     int i=0;
     for (;;) i++;
     return 0;
 }

运行这个进程,我们观察到 CPU 利用率确实达到了 100%。

接着我们执行下面的命令:

JavaScript
 # 限制该组进程 CPU 总利用率到 20%
 echo 20000 > /sys/fs/cgroup/cpu/test_limit/cpu.cfs_quota_us

 # 向任务控制列表中添加需要被限制的 pid
 echo 23732 >> /sys/fs/cgroup/cpu/test_limit/tasks

可以看到,在完成上述命令的执行后,可以看到,cpu 利用率很快就被成功限制到了 20%。

其他资源的限制方法与此是完全类似的