第 2 章 使用控制群组
以下部分将概述与创建、管理控制群组相关的任务。systemd 是管理 cgroup 的推荐方式并会在将来版本中被支持,此指南会着重介绍其提供的实用工具。Red Hat Enterprise Linux 的之前版本使用 libcgroup 数据包来达到相同目的。此数据包目前仍然可用,以确保后向兼容性(请参阅警告),但 Red Hat Enterprise Linux 之后的版本将不再支持其运行。
2.1. 创建控制群组
从 systemd 的角度来看,cgroup 会连接到一个系统单位,此单位可用单位文件进行配置、用 systemd 命令列实用工具进行管理。根据应用的类型,您的资源管理设定可以是 transient(临时的) 或者 persistent(永久的)。
要为服务创建 transient cgroup(临时 cgroup),请使用
systemd-run
指令启动此服务。如此,可以限制此服务在运行时所用资源。对 systemd 进行 API 调用,应用程序可以动态创建临时 cgroup。关于如何使用 API,请参阅〈“在线文档”一节〉。服务一旦停止,临时单位就会被自动移除。
要给服务分配 persistent cgroup(永久 cgroup),请对其单位配置文件进行编写。系统重启后,此项配置会被保留,所以它可以用于管理自动启动的服务。请注意,scope 单位不能以此方式创建。
2.1.1. 用 systemd-run 创建临时 cgroup
systemd-run
指令用于创建、启动临时 service 或 scope 单位,并在此单位中运行自定义指令。在 service 单位中执行的指令在后台非同步启动,它们从 systemd 进程中被调用。在 scope 单位中运行的指令直接从 systemd-run
进程中启动,因此从调用方继承执行状态。此情况下的执行是同步的。
在一个指定 cgroup 中运行指令,请以
root
身份输入:
systemd-run
--unit
=name--scope
--slice
=slice_name command
- name 代表您想要此单位被识别的名称。如果
--unit
没有被指定,单位名称会自动生成。建议选择一个描述性的名字,因为它将代表systemctl
输出中的单位。在单位运行时期间,此名字需为独一无二的。 - 使用可选的
--scope
参数创建临时 scope 单位来替代默认创建的 service 单位。 --slice
选项,让您新近创建的 service 或 scope 单位可以成为指定 slice 的一部分。用现存 slice(如systemctl -t slice
输出所示)的名字替代 slice_name,或者通过传送一个独有名字来创建新 slice。默认情况下,service 和 scope 做为 system.slice 的一部分被创建。- 用您希望在 service 单位中运行的指令替代 command。将此指令放置于
systemd-run
句法的最末端。这样,此指令的参数就不会与systemd-run
参数混淆。
除上述选项外,
systemd-run
也有一些其它可用参数。例如,--description
可以创建对单位的描述;service 进程结束后,--remain-after-exit
可以收集运行时信息;--machine
选项可以在密闭容器中执行指令。更多信息,请参阅 systemd-run
(1) manual page。
例 2.1. 用 systemd-run 来启动新 service
使用下列指令在名为
test
的新 slice 的 service 单位中运行 top 实用功能。以 root
身份输入:
~]#systemd-run
--unit
=toptest--slice
=test
top
-b
如果您正确启动了 service,将显示以下信息:
Running as unit toptest.service
现在,toptest.service 名称可以与
systemctl
指令结合,以监控或修改 cgroup。
2.1.2. 创建永久 cgroup
若要在系统启动时,配置一个自动启动的单位,请执行
systemctl enable
指令(参见《Red Hat Enterprise Linux 7 系统管理员指南 · 使用 systemd 管理 service 》)。自动运行此指令会在 /usr/lib/systemd/system/
目录中创建单位文件。如要对 cgroup 做出永久改变,请添加或修改其单位文件中的配置参数。更多信息,请参阅〈第 2.3.2 节 “修改单位文件”〉。