CPU 利用率:别被 100% 骗了
CPU 利用率,说白了就是 CPU 忙活的时间占比。但这里有个坑——忙活不等于干活。
我习惯把 CPU 时间分成几类:
- user:跑用户态程序,比如你的 Java 应用、Python 脚本。
- system:内核在干活,比如系统调用、中断处理。
- iowait:CPU 在等磁盘或网络 I/O 完成。注意,这时候 CPU 其实闲着,但不算 idle。
- idle:真正啥也没干。
- steal:虚拟机场景下,宿主机抢走了你的时间片。
重点来了:如果 user 高,说明你的程序在算东西;如果 system 高,可能是系统调用太频繁;如果 iowait 高,别急着加 CPU,先看看磁盘是不是瓶颈。
我在项目中遇到过一回,某服务 CPU 利用率 95%,但业务吞吐量上不去。一查,iowait 占了 60%。说白了,CPU 在等磁盘写日志,根本没在算业务。加 CPU 核心?那是白花钱。
我的习惯:用top看 CPU 时,先按 "1" 看每个核心的分布。如果某个核心 100% 而其他核心空闲,可能是单线程瓶颈。这时候优化方向是并行化,不是加核。
负载均值:一个被误解的指标
负载均值(Load Average)这玩意儿,很多人以为它等于 CPU 利用率。其实不是。它表示的是正在运行 + 等待运行的进程数。
举个例子:你有一个 4 核的机器,负载均值是 4。这意味着每个核心刚好有一个任务在跑,系统很均衡。如果负载均值是 8,说明有一半的任务在排队等 CPU。
| 负载均值 |
|---|