systemd服务资源统计需通过cgroups机制实现:用systemd-cgtop实时监控、systemd-cgls查路径并读取/sys/fs/cgroup底层文件、systemd-analyze分析启动耗时、systemd-cgtop -b导出结构化数据,配合sar交叉验证。

Linux 中 systemd 服务的资源使用统计报表,不能靠 systemctl status 直接生成,而是要结合 systemd 自带的资源监控机制——cgroups(控制组)来获取。每个 systemd 服务默认运行在独立的 cgroup 下,系统会自动记录其 CPU、内存、I/O 等资源消耗,只需用对应工具提取即可。
用 systemd-cgtop 实时查看服务级资源占用
这是最直接的方式,类似 top,但专为 cgroup 设计,能按服务名分组显示实时资源使用:
- 运行
systemd-cgtop即可进入交互界面,默认按 CPU 使用率排序 - 按
P键切换排序字段:输入cpu、memory或io可分别按对应资源排序 - 按
/输入正则(如nginx或mysql)快速过滤特定服务 - 加
-n 10 -d 2参数可限制显示前 10 行、每 2 秒刷新一次:systemd-cgtop -n 10 -d 2
用 systemd-cgls 查看服务所属 cgroup 路径
每个服务在 cgroup 中有明确路径(如 /system.slice/nginx.service),查清路径后才能精准采集数据:
-
systemd-cgls --no-page列出所有服务及其 cgroup 层级结构 -
systemd-cgls --all | grep "mysqld"快速定位某服务路径 - 路径确认后,可直接读取底层统计文件,例如:
cat /sys/fs/cgroup/cpu,cpuacct/system.slice/mariadb.service/cpuacct.usage(CPU 时间,纳秒)cat /sys/fs/cgroup/memory/system.slice/mariadb.service/memory.usage_in_bytes(当前内存字节数)
用 systemd-analyze 生成启动阶段资源耗时报表
虽然不反映运行时资源,但对诊断“为什么某个服务拖慢开机”非常关键:
-
systemd-analyze blame按启动耗时倒序列出所有服务,一眼识别慢服务(如16.159s mariadb.service) -
systemd-analyze critical-chain nginx.service显示该服务及其依赖项的启动时间链,定位瓶颈环节 -
systemd-analyze plot > boot-timeline.svg导出 SVG 启动时序图,适合存档或协作分析
导出结构化数据做长期统计
若需生成日报、趋势图或对接监控平台,建议定时采集并保存:
- 用
systemd-cgtop -b -n 1(批处理模式)一次性输出当前快照,配合date和重定向写入日志 - 脚本示例:
echo "$(date): $(systemd-cgtop -b -n 1 | awk '/nginx.service/ {print $2,$3,$4}')" >> /var/log/nginx-cgroup.log - 配合
sar(来自 sysstat 包)可交叉验证:启动sudo systemctl start sysstat后,sar -r 1 60记录内存变化,再关联服务启停时间











