首页/系统/Linux 内核与性能调优速查/用户态与内核态占比判读
CPU 与调度60 条

用户态与内核态占比判读

us/sy 比例定位 CPU 消耗归属:用户态高是应用计算,内核态高指向系统调用、锁竞争、页错误或网络栈处理。

us 与 sy 是什么

us(user)与 sy(system)表示 CPU 时间花在用户态还是内核态:us 高说明时间消耗在应用自身的计算逻辑上,sy 高说明时间在内核里被消耗——高频系统调用、锁竞争引起的调度、缺页异常、网络协议栈与软中断处理都会抬高 sy。两者的比例是最省力的「缩圈」手段:先确定瓶颈在应用还是在内核,再决定用 perf、strace 还是改架构。

基本信息

系统视图mpstat -P ALL、sar -u
进程视图pidstat -u、top 中单进程的 %usr/%system
相关列hi(硬中断)、si(软中断)、st(被虚拟化偷走)、wa(等 IO)
下钻工具perf top / strace -c / bpftrace
口径差异top 是短窗口瞬时值,pidstat/sar 是间隔均值

典型使用场景

  • 判断优化方向:us 占主导就改算法与并发模型,sy 占主导先查系统调用与内核路径
  • 小块 IO 场景(每次读写几百字节)在 sy 上留下明显痕迹,是大缓冲区优化的依据
  • 区分「计算忙」与「被中断打断」:si 高说明软中断在抢时间,通常来自网络流量
  • 识别虚机噪声:st 大于 0 表示 CPU 被宿主或其他虚机抢占,不是自身消耗
  • 锁竞争定位:sy 高同时上下文切换极高,多指向自旋锁或频繁唤醒

定位示例

定位示例
mpstat -P ALL 1 5  # 每核的 %usr/%sys/%soft/%steal,先看是否集中在个别核
pidstat -u -p 12345 1 5  # 单进程的 %usr 与 %system 拆分
sar -u 1 5  # 系统总览,也可用 sar -u -f /var/log/sa/saXX 回看历史
sudo perf top -g --stdio 2>/dev/null | head -30  # 直接看内核态热点函数
sudo strace -c -p 12345  # 统计系统调用次数,验证 sy 是否来自高频 syscall(有性能开销)

组合判读

组合常见原因下一步
us 高、sy 低应用自身计算密集优化算法、并行度或增加算力
us 低、sy 高高频系统调用、内核路径开销大用 strace/perf 看调用频次与热点函数
sy 高 + cs 高锁竞争或频繁唤醒看 pidstat -w 的自愿/非自愿切换来源
si / hi 高中断与软中断(网络为主)查网卡中断分布、RPS/RFS 与队列数
st 明显大于 0虚机被宿主抢占找宿主侧的超卖或限流,而非在本机调参
在 /proc/stat 中 user、system、irq、softirq 是彼此独立的字段,mpstat 的 %irq、%soft 与 %sys 相加才是内核态总消耗。只看 %sys 偏低就断定「内核没问题」,会漏掉软中断打满单核的情况。
不同工具的统计口径不能混算:top 的 sy 是短窗口瞬时值,sar/pidstat 是间隔内的平均值,两者相减或互相印证前先统一采样窗口。

易错点

  • 看到 sy 高就断定内核有缺陷:高频 syscall、小 IO、页错误都会抬高 sy,先量化调用次数再谈优化
  • 只看整机平均而不看每核分布:单核 sy 打满与全核均摊是完全不同的故障,平均后会被稀释掉
  • 容器里直接读 /proc 判断自身 us/sy:多数场景看到的是宿主视角数据,需与 cgroup 的 cpu.stat 对照
  • 忽略 st 列:虚机里把宿主抢占计入自身消耗,会一直优化自己的代码却看不到效果
  • 只看百分比不看绝对时间:核数变化后百分比会自动摊薄,评估趋势要用核数 × 百分比换算成绝对 CPU 时间

数据来源与参考

  • sysstat 文档 pidstat(1)/sar(1)
  • Linux 内核 perf 文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌