第二篇:《CPU 基础指标:负载、上下文切换与中断》

CPU 是 Linux 性能分析中最先被关注的资源,但也是最容易被误解的资源。平均负载不等于 CPU 使用率,上下文切换高不一定是坏事,中断过多也不一定意味着故障。本文深入讲解这三个 CPU 核心指标的本质、正确的解读方法以及它们之间的联动关系,帮你建立 CPU 性能分析的扎实基础。

一、平均负载(Load Average):最被误解的指标
1.1 平均负载的本质
uptime 或 top 命令输出的三个数字——分别代表过去 1 分钟、5 分钟、15 分钟的系统平均负载。

平均负载的定义是:单位时间内,系统处于可运行状态(R)和不可中断状态(D)的平均进程数。

这个定义包含两个关键点:

可运行状态(R) :正在使用 CPU 或正在等待 CPU 调度的进程。

不可中断状态(D) :正在等待 I/O 完成的进程(如磁盘读写、网络等待)。

⚠️ 核心误区:很多人把平均负载等同于 CPU 使用率。实际上,平均负载 ≠ CPU 使用率。高负载可能是 CPU 繁忙,也可能是大量进程在等待 I/O。

1.2 如何正确解读平均负载
第一步:看趋势,而非绝对值

如果 1 分钟值 > 5 分钟值,说明负载正在上升。

如果 1 分钟值 < 5 分钟值,说明负载正在下降。

趋势比绝对值更重要——上升趋势意味着系统正在变差。

第二步:与 CPU 核数对比

平均负载的理想上限是 CPU 核数。当负载持续超过核数时,说明有进程在排队等待 CPU。

举例:一个 16 核的系统,负载为 27.28 意味着平均每个 CPU 核心上有约 1.7 个进程在竞争——系统已严重过载。

第三步:区分 CPU 负载和 I/O 负载

由于平均负载包含 D 状态(不可中断睡眠)的进程,高负载可能来自:

1.3 平均负载的实战案例

$uptime14:23:01 up10days,3:15,2users, load average:2.50,1.80,1.20

解读:系统有 4 个 CPU 核心。1 分钟负载 2.50 < 4,说明 CPU 有余量;但 1 分钟 > 5 分钟 > 15 分钟(2.50 > 1.80 > 1.20),说明负载在持续上升,需要警惕。

1.4 负载的常见误区

二、上下文切换(Context Switch):CPU 的“换台”成本
2.1 什么是上下文切换?
上下文切换是 CPU 从一个进程或线程切换到另一个进程或线程时,保存当前状态(寄存器、程序计数器、栈指针、页表等)并加载下一个任务状态的过程。

它分为两种类型:

2.2 上下文切换为什么影响性能?
上下文切换的直接开销是微秒级的(保存和恢复 CPU 状态),但真正的性能杀手是间接开销:

CPU 缓存失效:切换后新进程的指令和数据不在 L1/L2/L3 缓存中,需要从内存重新加载。

TLB 失效:页表缓存被刷新,地址转换变慢。

流水线冲刷:CPU 指令流水线需要重新填充。

一个频繁上下文切换的系统,即使 CPU 使用率不高,应用性能也可能很差——因为大量时间花在了“换台”而不是“干活”上。

2.3 如何监控上下文切换

  1. vmstat 1 查看系统级切换
$vmstat1procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpdfreebuff cache si so bi boincs us syidwa st2001024001200045000000102050080002556820

cs 列:每秒上下文切换次数。

in 列:每秒中断次数。

参考阈值:正常情况下,cs 应低于 50000 次/秒。持续过高说明调度压力大。

  1. pidstat -w 1 查看进程级切换
$ pidstat-w103:45:01 PMUIDPID cswch/s nvcswch/s Command 03:45:02 PM0123485.002.00mysqld 03:45:02 PM05678120.0045.00java

cswch/s:自愿上下文切换。

nvcswch/s:非自愿上下文切换。

高 nvcswch/s(非自愿切换) 是 CPU 饱和的典型信号——进程因为时间片耗尽被频繁抢占。

2.4 上下文切换异常的排查思路

三、中断(Interrupts):硬中断与软中断
中断是 CPU 响应硬件或软件事件的机制,分为两种:

3.1 硬中断(Hard IRQ)
由硬件设备触发(网卡收到数据包、磁盘完成 I/O、键盘输入等),会立即打断当前进程的执行。

查看硬中断:cat /proc/interrupts

每一行代表一个中断号,每一列代表一个 CPU 核心上的中断计数。

$cat/proc/interrupts CPU0 CPU1 CPU2 CPU30:12000IR-IO-APIC2-edge timer8:0000IR-IO-APIC8-edge rtc0

16: 12345678 12345678 12345678 12345678 IR-IO-APIC 16-fasteoi ehci_hcd:usb1
3.2 软中断(SoftIRQ)
由内核在硬中断之后触发,用于处理耗时较长的工作(如网络协议栈处理、定时器任务)。

查看软中断:cat /proc/softirqs

$cat/proc/softirqs CPU0 CPU1 CPU2 CPU3 HI:0000TIMER:12345678123456781234567812345678NET_TX:123456123456123456123456NET_RX:98765432987654329876543298765432BLOCK:123456123456123456123456TASKLET:0000SCHED:1234567123456712345671234567

NET_RX(网络接收)和 NET_TX(网络发送)是网络密集型系统中最常见的软中断。

高 NET_RX 通常意味着网络流量大或网卡中断合并配置不当。

3.3 硬中断与软中断的处理流程
text
硬件设备产生中断

CPU 暂停当前进程,执行硬中断处理程序(快速、不可抢占)

硬中断处理完成,标记软中断

CPU 返回进程上下文,稍后(或通过 ksoftirqd 内核线程)处理软中断

软中断执行耗时操作(网络协议栈、磁盘 I/O 完成等)
硬中断必须快速完成,否则会阻塞其他中断;软中断可以延迟处理,但过多软中断会消耗 CPU。

3.4 中断相关的性能问题

四、三个指标的联动分析
平均负载、上下文切换、中断不是孤立的指标,它们之间存在紧密的联动关系:

text
高负载(load average)
↓ 可能原因
CPU 密集型 → 进程竞争 CPU → 高非自愿上下文切换(nvcswch)→ CPU 饱和
I/O 密集型 → 进程等待 I/O → 高自愿上下文切换(cswch)→ 高 wa%
网络密集型 → 网卡中断频繁 → 高 in(中断)→ 高软中断(NET_RX)
实战排查路径:

看到高负载 → 先看 vmstat 1 的 r(运行队列)和 b(阻塞进程)。

r 高 → 用 mpstat -P ALL 1 看是否单核打满 → 用 pidstat 1 定位进程。

b 高或 wa 高 → 用 iostat -xz 1 看磁盘 I/O。

in(中断)高 → 用 cat /proc/interrupts 看哪个设备中断最多 → 检查网卡或磁盘。

cs(上下文切换)高 → 用 pidstat -w 1 看是自愿还是非自愿切换。

五、小结
平均负载:包含 R 状态(CPU 运行/等待)和 D 状态(I/O 等待)的进程数。不等于 CPU 使用率。

上下文切换:自愿切换(I/O 等待)和非自愿切换(CPU 抢占)。高 cs + 高 nvcswch 是 CPU 饱和的信号。

中断:硬中断(硬件触发)和软中断(内核处理)。高中断通常意味着网络或磁盘压力大。

三个指标联动分析才能准确定位问题根因,孤立看任何一个指标都可能误判。