systemd-cgtop 和 systemd-cgls 是 systemd 自带的轻量级 cgroup 监控工具:前者提供类 top 的实时资源排序视图,支持按 cpu、内存、任务数等交互式排序及搜索;后者以树状结构展示 cgroup 层级关系,可配合 --all、--machine 等选项增强实用性;二者均需 root 权限查看全部 cgroup,并依赖 defaultcpuaccounting=yes 和 defaultmemoryaccounting=yes 等配置启用对应计量功能。

systemd-cgtop 和 systemd-cgls 是 systemd 提供的轻量级 cgroup 监控工具,无需额外安装(随 systemd 一起分发),适合快速查看服务、用户会话或容器进程的资源占用情况。它们不依赖 cgroup v2 的复杂接口,对 v1/v2 均有支持(行为略有差异),但需注意:默认只显示当前用户有权限访问的 cgroup 路径,root 权限才能看到全部。
systemd-cgtop:类 top 的实时资源排序视图
它按 CPU、内存、IO 等维度动态排序 cgroup,类似传统 top,但作用对象是 cgroup 而非进程。默认刷新周期 3 秒,支持交互式操作:
- 按 P 排序 CPU 使用率(%CPU 列),M 排序内存使用(Memory 列),T 排序任务数(Tasks 列)
- F 进入字段选择模式,可开启/关闭 IO、Swap、CPUAccounting 等列(需对应 cgroup 层级已启用 accounting)
- 按 / 可搜索匹配路径名(如输入
nginx快速定位 nginx.service) - 若发现某 service 占用异常高,可结合
systemctl status xxx.service查看其状态与最近日志
注意:systemd-cgtop 显示的内存值为 memory.current(v2)或 memory.usage_in_bytes(v1),不含 page cache;若未启用 memory accounting,该列将显示 N/A —— 此时需先在 /etc/systemd/system.conf 中设置 DefaultMemoryAccounting=yes 并重启 PID 1。
systemd-cgls:树状结构展示 cgroup 层级关系
它以缩进形式呈现当前系统中活跃的 cgroup 树,默认从 /sys/fs/cgroup 根开始,聚焦于 systemd 托管单元(.service、.scope、.slice)。常用组合提升实用性:
-
systemd-cgls --all:显示所有 cgroup,包括无 name= 的匿名 scope(如临时用户会话、podman run 启动的容器) -
systemd-cgls --machine:仅列出 systemd-machined 管理的虚拟机/容器(如 systemd-nspawn 或 machinectl 启动的实例) -
systemd-cgls --no-pager:禁用分页器,方便配合grep筛选,例如:systemd-cgls --all | grep -A5 "myapp\.service" - 路径末尾带
@表示动态生成的 scope(如 ssh 登录会话、后台脚本启动的临时组),不对应 unit 文件,生命周期由父进程决定
权限与 accounting 启用的关键前提
这两个命令能否显示完整数据,取决于三方面配置:
-
权限:普通用户只能看到自身 user slice(
/user.slice/user-1000.slice)及子 cgroup;要查看 system.slice,必须以 root 运行或加入systemd-journal组并配置 polkit 规则 -
CPUAccounting:在
/etc/systemd/system.conf中设DefaultCPUAccounting=yes,否则 CPU 列恒为 0 -
MemoryAccounting:同理设
DefaultMemoryAccounting=yes,否则 Memory 列为 N/A;cgroup v2 下还需确认内核启动参数含systemd.unified_cgroup_hierarchy=1(现代发行版默认启用)
修改后需执行 sudo systemctl daemon-reload && sudo systemctl restart systemd-logind(对 user slice 生效)或 sudo reboot(确保全局生效)。
结合 journalctl 定位资源突增根源
当 systemd-cgtop 发现某 cgroup 突然飙高,可快速关联日志排查:
-
journalctl -u nginx.service -S "2024-06-15 14:00:00":查指定服务近期日志 -
journalctl _PID=12345:查某个具体进程(从 cgls 输出中获取 PID)的完整上下文 -
journalctl -t systemd-cgroups-agent:查看 cgroup 创建/销毁事件(需启用 debug 日志)
对于短生命周期的 scope(如 cron 启动的备份脚本),可用 systemd-run --scope --scope-prefix=backup-tasks /path/to/script.sh 显式命名,便于后续在 cgls/cgtop 中识别和追踪。










