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 是间隔内的平均值,两者相减或互相印证前先统一采样窗口。