2.4. 获得关于控制群组的信息
使用
systemctl
指令将系统单位列表并检查它们的状态。systemd-cgls
指令可以检查控制群组的层级,systemd-cgtop
可以监控控制群组的实时资源消耗。
2.4.1. 将单位列表
使用下列指令将系统中所有被激活单位列表:
systemctl list-units
list-units
是默认执行选项,也就是说,即便您遗漏了此选项,也不会影响结果:
systemctl
UNIT LOAD ACTIVE SUB DESCRIPTION
abrt-ccpp.service loaded active exited Install ABRT coredump hook
abrt-oops.service loaded active running ABRT kernel log watcher
abrt-vmcore.service loaded active exited Harvest vmcores for ABRT
abrt-xorg.service loaded active running ABRT Xorg log watcher
...
以上所列结果包含四项:
- UNIT —— 单位名称,也反映单位在 cgroup 树中的位置。 如〈“systemd 的单位类型”一节〉所述,有三种单位类型与资源控制相关:slice、scope 和 service。关于
systemd
的单位类型介绍,请参阅《Red Hat Enterprise Linux 7 系统管理员指南 · 使用 systemd 管理 service 》。 - LOAD —— 显示单位配置文件是否被正确装载。如果装载失败,文件会包含 error 而不是 loaded。其它单位装载状态有:stub、merged 和 masked。
- ACTIVE —— 高级单位的激活状态,是 SUB 的一般化。
- SUB —— 低级单位的激活状态。可能值的范围取决于单位类型。
- DESCRIPTION —— 描述单位内容和性能。
默认情况下,
systemctl
只会列出被激活的单位(依据 ACTIVE 域中的高级激活状态)。使用 --all
选项可以查看未被激活的单位。如要限制结果列表中的信息量,请使用 --type
(-t
) 参数,此参数需要单位类型的逗号分隔列表,如:service 和 slice 或者单位装载状态,如:loaded 和 masked。
例 2.7. 使用 systemctl list-units
如要查看系统使用的全部 slice 列表,请输入:
~]$systemctl
-t
slice
如要将全部被激活的已屏蔽 service 列表,请输入:
~]$systemctl
-t
service,masked
对您系统中安装的单位文件及其状态列表,请输入:
systemctl
list-unit-files
2.4.2. 查看控制群组的层级
上述指令不会超越单位水平来显示 cgroup 中运行的真正进程。
systemctl
结果也不会显示单位的层级。您可以使用 systemd-cgls
指令,根据 cgroup 将运行的进程分组来同时实现两者。 要显示您系统中的全部 cgroup 层级,请输入:
systemd-cgls
当
systemd-cgls
不带参数发布,它会返回整体 cgroup 层级。cgroup 树的最高层由 slice 构成,外观如下:
├─system │ ├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 20 │ ... │ ├─user │ ├─user-1000 │ │ └─ ... │ ├─user-2000 │ │ └─ ... │ ... │ └─machine ├─machine-1000 │ └─ ... ...
请注意,只有当您运行了虚拟机或者容器的时候,机器 slice 才会出现。更多关于 cgroup 树的信息,请参阅〈“systemd 的单位类型”一节〉。
如要减少
systemd-cgls
的输出并查看层级的特定一部分,请执行:
systemd-cgls
name
请用您希望检查的资源管控器的名字替换 name。
或者,使用
systemctl status
来显示系统单位的详细信息。cgroup 的子树是此指令结果的一部分。
systemctl
status
name
例 2.8. 查看控制群组的层级
如要查看
memory
资源管控器的 cgroup 树,请执行:
~]$systemd-cgls
memory
memory: ├─ 1 /usr/lib/systemd/systemd --switched-root --system --deserialize 23 ├─ 475 /usr/lib/systemd/systemd-journald ...
以上指令的结果将列出与所选管控器互动的 service。另一种方法是查看 cgroup 树的一部分来查阅 service、slice 或者 scope 单位:
~]#systemctl
status
httpd.service
httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled) Active: active (running) since Sun 2014-03-23 08:01:14 MDT; 33min ago Process: 3385 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS) Main PID: 1205 (httpd) Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec" CGroup: /system.slice/httpd.service ├─1205 /usr/sbin/httpd -DFOREGROUND ├─3387 /usr/sbin/httpd -DFOREGROUND ├─3388 /usr/sbin/httpd -DFOREGROUND ├─3389 /usr/sbin/httpd -DFOREGROUND ├─3390 /usr/sbin/httpd -DFOREGROUND └─3391 /usr/sbin/httpd -DFOREGROUND ...
除了上述工具,systemd 也提供了专门监控 Linux 的
machinectl
指令。
2.4.3. 查看资源管控器
上述的
systemctl
指令可以监控高级单位层级,但是不能显示 Linux kernel 的资源管控器被哪项进程使用。这些信息存储在专门的进程文件中,如要查阅这些文件,请以 root
身份输入:
cat
proc/PID/cgroup
PID 代表您希望查看的进程 ID。默认情况下,此列表对所有 systemd 启动的单位一致,因为它自动挂载所有默认管控器。请参考下列示例:
~]#cat
proc/27/cgroup
10:hugetlb:/ 9:perf_event:/ 8:blkio:/ 7:net_cls:/ 6:freezer:/ 5:devices:/ 4:memory:/ 3:cpuacct,cpu:/ 2:cpuset:/ 1:name=systemd:/
通过检查此文件,您可以确定进程是否被放置在 systemd 单位文件规范所定义的所需 cgroup 中。
2.4.4. 监控资源消耗量
systemd-cgls
指令给 cgroup 层级提供了静态数据快照。要查看按资源使用量(CPU、内存和 IO)排序的、正在运行的 cgroup 动态描述请使用:
systemd-cgtop
systemd-cgtop
提供的统计数据和控制选项与 top
实用工具所提供的相近。更多信息,请参阅 systemd-cgtop
(1) manual page。