CPU7 上 arch_timer、IPI5、HRTIMER、ksoftirqd 的关系
1. 先说结论
这四个量不是同一层次的"调用次数",不能一一对应,但它们在你的 CPU7 数据里有清楚的因果顺序:
arch_timer是硬件定时器中断,是源头。HRTIMER是高精度定时器软中断计数,表示 timer 核心把到期工作交给 softirq 层处理。IPI5 (IRQ work interrupts)是irq_work的远端通知路径,表示有 work 要在目标 CPU 上处理。ksoftirqd是处理 softirq 的线程,不是中断计数;它的意义是"softirq 最后是谁来跑"。
在这组数据里,CPU7 的增量是:
| 项目 | CPU7 增量 | 含义 |
|---|---|---|
arch_timer |
+3,956,459 | 硬件定时器中断 |
IPI5 |
+366,243 | irq_work 远端通知 |
HRTIMER |
+357,689 | 高精度定时器 softirq |
ksoftirqd/7 spike 归因 |
61 | 延迟尖峰由 ksoftirqd/7 作为 waker 出现 |
2. 这四者的直接关系
2.1 arch_timer 是入口
arch_timer 是 CPU7 上的本地定时器中断。它触发后,内核会检查当前是否有 timer 到期,是否需要:
- 立即在硬中断上下文执行;
- 或者把工作交给
HRTIMERsoftirq; - 或者通过
irq_work再往下传递。
所以 arch_timer 是上游,不是最终处理者。
2.2 HRTIMER 是 timer 核心的软中断层
HRTIMER 计数表示高精度定时器软中断被执行了多少次。它不是单纯的"到期个数",而是"softirq 处理次数"。
一个 arch_timer 中断:
- 可能直接处理多个到期 timer;
- 可能只触发一次
HRTIMERsoftirq; - 也可能根本不进入软中断路径,而在硬中断上下文直接完成。
因此 arch_timer 和 HRTIMER 不会 1:1。
2.3 IPI5 是 irq_work 的通知通道
IPI5 在你这台机器上标成 IRQ work interrupts,它对应的是:
- 某个 CPU 上有
irq_work被排队; - 需要通知目标 CPU 去处理;
- 内核通过 IPI 把这个消息送过去。
这条路和 HRTIMER 不是同一个计数,但在你的数据里两者非常接近,说明:
- 大量 timer/irq_work 处理是成对出现的;
irq_work的通知和高精度定时器软中断在 CPU7 上是绑定出现的。
2.4 ksoftirqd 是最后执行 softirq 的线程
ksoftirqd 不在 /proc/interrupts 或 /proc/softirqs 里直接体现为一个"中断类型计数",它是线程。
它的作用是:
- 当 softirq 不能在硬中断里及时处理;
- 或者在 PREEMPT_RT 下需要线程化处理;
- softirq 就会由
ksoftirqd去跑。
所以 ksoftirqd 和前面三个量的关系是:
arch_timer触发 timer 事件;HRTIMER/IPI5代表 timer/irq_work 的下沉处理;ksoftirqd是这类下沉处理最后由哪个线程执行。
3. 调用数量上怎么理解
3.1 不能把它们当成同一口径
这四个数字不是同一层的计数:
arch_timer:硬件中断次数;IPI5:跨核通知次数;HRTIMER:softirq 执行次数;ksoftirqd:线程被调度、开始跑 softirq 的次数。
所以不能期待 1 个 arch_timer 必然等于 1 个 HRTIMER,也不能期待 1 个 HRTIMER 必然等于 1 次 ksoftirqd。
3.2 这组数据里最明显的数量关系
CPU7 上:
arch_timer / IPI5 ≈ 10.80arch_timer / HRTIMER ≈ 11.06IPI5 / HRTIMER ≈ 1.02IPI5 - HRTIMER = 8,554
这说明:
arch_timer是更上游、更宽口径的事件;IPI5和HRTIMER量级很接近,说明这两个路径在 CPU7 上高度相关;ksoftirqd的数量不能直接和前两者比,因为它统计的是"线程被调度去处理 softirq"的次数,不是 softirq 本身的累计量。
3.3 为什么会有数量差
数量差来自几个原因:
- 一个
arch_timer中断可以处理多个 timer; - 一个
HRTIMERsoftirq 可以一次清掉多个到期项; - 一个
IPI5可以携带多个irq_work; - 一个
ksoftirqd唤醒可以处理一批 softirq; - 一部分 hrtimer 工作在硬中断里直接完成,不进入 softirq 统计。
4. 为什么 CPU7 特别关键
CPU7 是隔离核:
arch_timer在 CPU7 上增长很多;IPI5在 CPU7 上增长 366,243;HRTIMER在 CPU7 上增长 357,689;TIMER几乎没有增长,说明周期性 tick 基本没落到这里;BLOCK、NET_RX、NET_TX、SCHED也几乎没有增长。
这表示 CPU7 的活动主要是:
- 定时器唤醒;
- irq_work 通知;
- 高精度定时器软中断处理。
这和 <bpftrace.log> 里的归因一致:
text
source_waker=ksoftirqd/7
recent_irq=arch_timer / IPI
recent_ipi=IRQ work interrupts
也就是说,ksoftirqd/7 不是源头,它是把上游的 timer/irq_work/softirq 工作真正跑起来的线程;一旦它被普通优先级任务卡住,就会把 cyclictest 的尾延迟放大出来。
5. 一句话总结
arch_timer 负责"发起定时事件",IPI5 负责"把 irq_work 通知到目标 CPU",HRTIMER 负责"执行高精度定时器的 softirq 处理",ksoftirqd 负责"最终让 softirq 真正跑起来"。
在你的 CPU7 数据里,arch_timer 是上游源头,IPI5 和 HRTIMER 量级接近,说明 irq_work/高精度定时器路径高度活跃;而 ksoftirqd/7 是最后的调度执行点,决定了这些上游事件会不会变成 cyclictest 的延迟尖峰。