要分析历史cpu用户态与内核态占比,需确认sysstat服务活跃且存在对应日期的/var/log/sa/sadd日志文件,再用sar -u -f /var/log/sa/sadd读取,其中%user和%system列即分别为用户态和内核态占比。

要分析历史 CPU 的用户态(%user)与内核态(%system)占比,关键不是“实时看”,而是准确读取已保存的二进制历史日志,并确保这些日志里确实采集了对应指标——因为 sar 默认就记录 %user 和 %system,无需额外开启。
✅ 确认历史数据已采集并可用
系统必须已启用 sysstat 服务,且 sa1 脚本每 10 分钟写入一次数据到 /var/log/sa/saDD(DD 是日期,如 sa29 表示 29 号)。
验证方式:
systemctl is-active sysstat # 应返回 "active" ls -l /var/log/sa/sa$(date -d yesterday +%d) # 检查昨天的日志是否存在,比如 sa28
若返回 no such file 或服务 inactive,则没有历史 CPU 数据,后续命令无效。
? 查指定日期的用户态与内核态占比
以查询 6 月 25 日 的 CPU 用户态和内核态使用情况为例:
sar -u -f /var/log/sa/sa25
-
-u:输出 CPU 使用率,默认含%user、%system、%idle等列 -
-f /var/log/sa/sa25:显式指定归档文件(注意:不是sa0625或sa-25,就是sa25)
⚠️ 如果该文件被压缩(如
sa25.gz),需先解压再读:zcat /var/log/sa/sa25.gz | sar -u -f -
输出示例:
03:40:01 AM CPU %user %nice %system %iowait %steal %idle 03:50:01 AM all 8.21 0.00 3.45 0.12 0.00 88.22 04:00:01 AM all 12.67 0.00 4.89 0.05 0.00 82.39 ...
其中 %user 就是用户态占比,%system 是内核态占比。
? 精准筛选某时段或高占比时刻
比如查 6 月 25 日上午 9:00–11:00 的数据,并只看 %user > 30 或 %system > 15 的行:
sar -u -f /var/log/sa/sa25 -s 09:00:00 -e 11:00:00 | awk '$4 > 30 || $5 > 15 {print $1, $2, $4, $5}'
字段顺序为:时间、CPU、%user、%nice、%system、%iowait……
所以 $4 是 %user,$5 是 %nice,$6 是 %system(注意列偏移,不同版本可能略有差异,建议先 head -2 看表头)。
? 补充说明:用户态 vs 内核态的典型场景
-
%user高 → 应用程序计算密集(如 Java 服务、Python 脚本、Node.js 渲染) -
%system高 → 系统调用频繁(如大量 fork/exec、文件操作、网络收发、驱动处理) - 若
%user低但%system异常高(>25%),可进一步用sar -w查上下文切换(cswch/s),或perf top -g定位内核热点
❗常见误区提醒
-
sar -u 25不是查 25 号,而是“每 25 秒采样一次”,和日期无关 -
sar -u ALL中的ALL是指显示所有细分项(如%irq,%soft),不是“全部日期” - 默认
sar -u已包含%user和%system,无需加额外参数;想看软中断等才需-u ALL - 时间列只有
HH:MM:SS,不带日期,务必配合-f明确文件来源,避免误读成当天数据
不复杂但容易忽略。











