Red Hat Training

A Red Hat training course is available for Red Hat Linux

第 3 章 使用 libcgroup 工具

libcgroup 数据包, 在 Red Hat Enterprise Linux 之前版本中是管理 cgroup 的主要工具,但现已过时。为避免冲突,请不要将 libcgroup 工具应用于默认资源管控器(列于 Red Hat Enterprise Linux 7 中可用的管控器),它们现在是 systemd 的专属域。这就让 libcgroup 工具的应用空间变得有限,只有当您需要管理目前不受 systemd 支持的控制器时,请再使用它,例如 net_prio
以下章节将描述:与层级的默认系统没有冲突时,如何在相关情景中使用 libcgroup 工具。

注意

使用 libcgroup 工具前,请先确保 libcgrouplibcgroup-tools 数据包已安装在系统上。安装方法:请以 root 身份运行:
~]# yum install libcgroup
~]# yum install libcgroup-tools

注意

net_prio 管控器没有像其它管控器一样被编译在 kernel 中,它是一个在挂载前必须被装载的模块。如要装载这一模块,请以 root 身份输入:
modprobe netprio_cgroup

3.1. 挂载层级

如需使用非自动挂载的 kernel 资源管控器,您需要创建一个包含这一管控器的层级。通过编写 /etc/cgconfig.confmount 部分来添加或者分离层级。这一方法可让管控器附载持续,也就是说系统重启后,您的设定也将被保留并运作。或者,您可以使用 mount 指令为当前会话创建临时挂载。

使用 cgconfig 服务

通过 libcgroup-tools 数据包安装的 cgconfig 服务可以让附加资源的管控器挂载层级。默认情况下,这一服务不会自动启动。当您启动 cgconfig 时,它会应用 /etc/cgconfig.conf 配置文件中的设置。因此,从会话到会话,配置会被重建,并且持续。请注意,如果您终止 cgconfig,那它之前挂载的层级都将被卸载。
通过 libcgroup 数据包安装的默认 /etc/cgconfig.conf 文件不包含任何配置设置,仅会有 systemd 自动挂载主要资源管控器的信息。
/etc/cgconfig.conf 可创建三种条目 —— mountgrouptemplate。mount 条目用于创建层级并将层级挂载为虚拟文件系统,并且将管控器附加到这些层级中。Red Hat Enterprise Linux 7 中, 默认层级会被自动挂载到 /sys/fs/cgroup/ 目录,因此,cgconfig 被用来单独附载非默认的管控器。mount 条目通过以下句法定义:
mount {
    controller_name = /sys/fs/cgroup/controller_name;
    …
}
用您希望挂载到层级的 kernel 资源管控器名称来替换controller_name。示例请参见 例 3.1 “创建挂载条目”

例 3.1. 创建挂载条目

如要将 net_prio 管控器附加到默认 cgroup 树中,请将下列字符添加到 /etc/cgconfig.conf 配置文件:
mount {
    net_prio = /sys/fs/cgroup/net_prio;
}
然后重启 cgconfig 服务来应用这些设置:
systemctl restart cgconfig.service
/etc/cgconfig.conf 中的组条目可以用来设定资源管控器的参数。更多组条目的信息,请参阅〈第 3.5 节 “设定 cgroup 参数”〉。
/etc/cgconfig.conf 中的样板条目可以用来创建组定义,这个组定义将应用于所有进程。

使用挂载指令

mount 指令可以用于临时挂载层级。如需这样做,请先在 /sys/fs/cgroup/ 目录中创建一个挂载点,systemd 将在此目录中挂载主要资源管控器。请以 root 身份输入:
mkdir /sys/fs/cgroup/name
请用新挂载目标的名称替代 name,通常是用管控器的名称。接下来,执行 mount 指令来挂载层级,同时附载一个或更多子系统。以 root 身份来输入:
mount -t cgroup -o controller_name none /sys/fs/cgroup/controller_name
用管控器的名称取代 controller_name 来具体说明被挂载的设备和目标文件夹。-t cgroup 参数可以明确挂载的类型。

例 3.2. 使用挂载指令来附加控制器

如要使用 mount 指令给 net_prio 管控器挂载层级,请先创建挂载节点:
~]# mkdir /sys/fs/cgroup/net_prio
然后将 net_prio 挂载到您之前创建的目标中。
~]# mount -t cgroup -o net_prio none /sys/fs/cgroup/net_prio
通过 lssubsys 指令(参见〈“将管控器列表”一节〉),将所有可用层级沿当前挂载节点列表,您就可以验证是否正确附加了层级:
~]# lssubsys -am
cpuset /sys/fs/cgroup/cpuset
cpu,cpuacct /sys/fs/cgroup/cpu,cpuacct
memory /sys/fs/cgroup/memory
devices /sys/fs/cgroup/devices
freezer /sys/fs/cgroup/freezer
net_cls /sys/fs/cgroup/net_cls
blkio /sys/fs/cgroup/blkio
perf_event /sys/fs/cgroup/perf_event
hugetlb /sys/fs/cgroup/hugetlb
net_prio /sys/fs/cgroup/net_prio