当前位置 博文首页 > Linux下cgroup的原理及应用_weixin_39639040的博客:linux操作系

    Linux下cgroup的原理及应用_weixin_39639040的博客:linux操作系

    作者:[db:作者] 时间:2021-09-14 10:24

    什么是cgroup

    是什么

    CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组 (process groups) 所使用的物力资源 (如 cpu memory i/o 等等) 的机制。2007 年进入 Linux 2.6.24 内核,CGroups 不是全新创造的,它将进程管理从 cpuset 中剥离出来,作者是 Google 的 Paul Menage。CGroups 也是 LXC 为实现虚拟化所使用的资源管理手段。

    子系统

    subsystem,子系统,一个通过cgroup提供的工具和接口来管理进程集合的模块。一个子系统就是一个典型的“资源控制器”,用来调度资源或者控制资源使用的上限。其实每种资源就是一个子系统。子系统可以是以进程为单位的任何东西,比如虚拟化子系统、内存子系统。

    hierarchy,层级树,多个cgroup的集合,这些集合构成的树叫hierarchy。可以认为这是一个资源树,附着在这上面的进程可以使用的资源上限必须受树上节点(cgroup)的控制。hierarchy上的层次关系通过cgroupfs虚拟文件系统显示。系统允许多个hierarchy同时存在,每个hierachy包含系统中的部分或者全部进程集合。

    cgroupfs是用户管理操纵cgroup的主要接口:通过在cgroupfs文件系统中创建目录,实现cgroup的创建;通过向目录下的属性文件写入内容,设置cgroup对资源的控制;向task属性文件写入进程ID,可以将进程绑定到某个cgroup,以此达到控制进程资源使用的目的;也可以列出cgroup包含的进程pid。这些操作影响的是sysfs关联的hierarchy,对其它hierarchy没有影响。

    对于cgroup,其本身的作用只是任务跟踪。但其它系统(比如cpusets,cpuacct),可以利用cgroup的这个功能实现一些新的属性,比如统计或者控制一个cgroup中进程可以访问的资源。举个例子,cpusets子系统可以将进程绑定到特定的cpu和内存节点上。

    cgroups子系统的特点

    cpu 子系统,主要限制进程的 cpu 使用率。

    cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。

    cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。

    memory 子系统,可以限制进程的 memory 使用量。

    blkio 子系统,可以限制进程的块设备 io。

    devices 子系统,可以控制进程能够访问某些设备。

    net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。

    net_prio — 这个子系统用来设计网络流量的优先级

    freezer 子系统,可以挂起或者恢复 cgroups 中的进程。

    ns 子系统,可以使不同 cgroups 下面的进程使用不同的 namespace

    hugetlb — 这个子系统主要针对于HugeTLB系统进行限制,这是一个大页文件系统。

    cgroups 层级结构(Hierarchy)

    内核使用 cgroup 结构体来表示一个 control group 对某一个或者某几个 cgroups 子系统的资源限制。cgroup 结构体可以组织成一颗树的形式,每一棵cgroup 结构体组成的树称之为一个 cgroups 层级结构。

    cgroups层级结构可以 attach 一个或者几个 cgroups 子系统,当前层级结构可以对其 attach 的 cgroups 子系统进行资源的限制。每一个 cgroups 子系统只能被 attach 到一个 cpu 层级结构中。

    cbad4a780a1d71eb2033c77cd1cd2c9e.pngcs