标准答案

  1. 先确认是单线程还是多线程、用户态还是内核态,再用采样 profiler、火焰图、系统调用和线程状态定位热点。
  2. 高 system CPU 可能来自网络、文件、内存或频繁系统调用,不等于内核本身出错。
  3. 线程 CPU 不高但整体延迟高时,还要查锁等待、I/O、运行队列和下游依赖;CPU 采样只能解释正在运行的时间。
  4. 修复应针对热点减少计算和系统调用、修正忙轮询或锁竞争,并用同一负载复测。

题目解析

user CPU 反映进程在用户态执行,system CPU 反映内核代码时间,但两者都只是“正在运行了什么”的统计。高 CPU 可能来自业务计算、序列化、系统调用、忙等、锁自旋或异常重试;锁等待和 I/O 等待反而可能让 CPU 不高但请求很慢。

排查应先按线程确认热点,再结合 perf/采样火焰图、pidstat、off-CPU、上下文切换、run queue 和请求 P99。system CPU 高还要看系统调用类型、网络包率、文件 I/O 和内存回收,不能直接等同于带宽用满。

常见误区

  • 误区:看到 CPU 高就扩容。改正:先确认热点、并发、单核饱和、锁和下游,再判断扩容是否有效。
  • 误区:只分析主线程。改正:按线程采样并检查 worker、线程池和后台任务。
  • 误区:把 system CPU 高等同于网络带宽用满。改正:同时看 syscall、包率、网卡、磁盘和内核回收指标。

作者信息