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。