老白学编程Cgroup插件

编程

为什么要cgroup

统一将进程进行分组,并在分组的基础上对进程进行监控和资源控制管理等。

subsystem

cgroup 是 Linux 下的一种将进程按组进行管理的机制,在用户层看来,cgroup 技术就是把系统中的所有进程组织成一颗一颗独立的树,每棵树都包含系统的所有进程,树的每个节点是一个进程组,而每颗树又和一个或者多个 subsystem 关联,树的作用是将进程分组。

一个 subsystem 就是一个内核模块,他被关联到一颗 cgroup 树之后,就会在树的每个节点(进程组)上做具体的操作。subsystem 经常被称作 resource controller,因为它主要被用来调度或者限制每个进程组的资源,但是这个说法不完全准确,因为有时我们将进程分组只是为了做一些监控,观察一下他们的状态,比如 perf_event subsystem。到目前为止,Linux 支持 12 种 subsystem,比如限制 CPU 的使用时间,限制使用的内存,统计 CPU 的使用情况,冻结和恢复一组进程等,后续会对它们一一进行介绍。

centos安装以下的包,

libcgroup libcgroup-tools

查看子系统

$ lssubsys -a

cpuset

cpu,cpuacct

memory

devices

freezer

net_cls,net_prio

blkio

perf_event

hugetlb

pids

    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系统进行限制,这是一个大页文件系统。

hierarchy

层级树,多个cgroup的集合,这些集合构成的树叫hierarchy。

一个 hierarchy 可以理解为一棵 cgroup 树,树的每个节点就是一个进程组,每棵树都会与零到多个 subsystem 关联。

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

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

创建了 cgroups 层级结构中的节点(cgroup 结构体)之后,可以把进程加入到某一个节点的控制任务列表中,一个节点的控制列表中的所有进程都会受到当前节点的资源限制。同时某一个进程也可以被加入到不同的 cgroups 层级结构的节点中,因为不同的 cgroups 层级结构可以负责不同的系统资源。所以说进程和 cgroup 结构体是一个多对多的关系。

最下面的P代表一个进程。每一个进程的描述符中有一个指针指向了一个辅助数据结构css_set(cgroups subsystem set)。 指向某一个css_set的进程会被加入到当前css_set的进程链表中。一个进程只能隶属于一个css_set,一个css_set可以包含多个进程,隶属于同一css_set的进程受到同一个css_set所关联的资源限制。

上图中的”M×N Linkage”说明的是css_set通过辅助数据结构可以与 cgroups 节点进行多对多的关联。但是 cgroups 的实现不允许css_set同时关联同一个cgroups层级结构下多个节点。 这是因为 cgroups 对同一种资源不允许有多个限制配置。

一个css_set关联多个 cgroups 层级结构的节点时,表明需要对当前css_set下的进程进行多种资源的控制。而一个 cgroups 节点关联多个css_set时,表明多个css_set下的进程列表受到同一份资源的相同限制。

cgroupfs

cgroup相关的所有操作都是基于内核中的cgroup virtual filesystem,使用cgroup很简单,挂载这个文件系统就可以了。一般情况下都是挂载到/sys/fs/cgroup目录下,当然挂载到其它任何目录都没关系。

挂载一颗和所有subsystem关联的cgroup树到/sys/fs/cgroup.

mount -t cgroup xxx /sys/fs/cgroup

挂载一颗和cpuset subsystem关联的cgroup树到/sys/fs/cgroup/cpuset.

mkdir /sys/fs/cgroup/cpuset

mount -t cgroup -o cpuset xxx /sys/fs/cgroup/cpuset

挂载一棵cgroup树,但不关联任何subsystem,下面就是systemd所用到的方式

mkdir /sys/fs/cgroup/systemd

mount -t cgroup -o none,name=systemd xxx /sys/fs/cgroup/systemd

systemd已经帮我们将各个subsystem和cgroup树关联并挂载好了.

$ mount -t cgroup

cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)

cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)

cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)

cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)

cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)

cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)

cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)

cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)

cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)

cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)

cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)

注意点:

  1. 第一次挂载一颗和指定subsystem关联的cgroup树时,会创建一颗新的cgroup树,当再一次用同样的参数挂载时,会重用现有的cgroup树,也即两个挂载点看到的内容是一样的。

  2. 挂载一颗cgroup树时,可以指定多个subsystem与之关联,但一个subsystem只能关联到一颗cgroup树,一旦关联并在这颗树上创建了子cgroup,subsystems和这棵cgroup树就成了一个整体,不能再重新组合。

  3. 可以创建任意多个不和任何subsystem关联的cgroup树,name是这棵树的唯一标记,当name指定的是一个新的名字时,将创建一颗新的cgroup树,但如果内核中已经存在一颗一样name的cgroup树,那么将mount已存在的这颗cgroup树

查看进程的cgroup

$ cat /proc/672/cgroup

11:blkio:/system.slice/crond.service

10:cpuacct,cpu:/system.slice/crond.service

9:cpuset:/

8:freezer:/

7:pids:/system.slice/crond.service

6:devices:/system.slice/crond.service

5:net_prio,net_cls:/

4:memory:/system.slice/crond.service

3:perf_event:/

2:hugetlb:/

1:name=systemd:/system.slice/crond.service

每一行包含用冒号隔开的三列,他们的意思分别是

  1. cgroup树的ID, 和/proc/cgroups文件中的ID一一对应。
  2. 和cgroup树绑定的所有subsystem,多个subsystem之间用逗号隔开。这里name=systemd表示没有和任何subsystem绑定,只是给他起了个名字叫systemd。
  3. 进程在cgroup树中的路径,即进程所属的cgroup,这个路径是相对于挂载点的相对路径。

实践

查看挂载点

$ mount -t cgroup

cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)

cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)

cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)

cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)

cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)

cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)

cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)

cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)

cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)

cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)

cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)

创建隔离组

cd /sys/fs/cgroup/cpu

mkdir cpu_test

创建完后,包含了一系列的文件

$ ls

cgroup.clone_children cpuacct.stat cpu.cfs_period_us cpu.rt_runtime_us notify_on_release

cgroup.event_control cpuacct.usage cpu.cfs_quota_us cpu.shares tasks

cgroup.procs cpuacct.usage_percpu cpu.rt_period_us cpu.stat

默认-1, 改为20000可以理解为把cpu限制为20%。

echo 20000 > /sys/fs/cgroup/cpu/cpu_test/cpu.cfs_quota_us

找到进程号,加到task中

/sys/fs/cgroup/cpu/cpu_test/tasks

Netdata 的cgroup 插件

读取配置

读取配置文件。

主要是采集周期等配置。

cgroup 结构体

以上是 老白学编程Cgroup插件 的全部内容, 来源链接: utcz.com/z/516210.html

回到顶部