![Linux 内核中决定哪个 CPU 处理哪个中断的策略是什么?](https://linux22.com/image/152635/Linux%20%E5%86%85%E6%A0%B8%E4%B8%AD%E5%86%B3%E5%AE%9A%E5%93%AA%E4%B8%AA%20CPU%20%E5%A4%84%E7%90%86%E5%93%AA%E4%B8%AA%E4%B8%AD%E6%96%AD%E7%9A%84%E7%AD%96%E7%95%A5%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我一直在阅读Linux Kernel Development
,有一点我不太清楚——当硬件触发中断时,决定哪个CPU运行中断处理逻辑的标准是什么?
我可以想象它必须始终是提出 IO 请求的同一个 CPU,但由于线程现在出于所有目的而处于睡眠状态,因此这样做并没有多大意义。
另一方面,可能需要引发定时中断(例如对于调度程序)。在 SMP 系统上,它们总是在同一个核心上引发(比如说,#0),还是总是在任何核心上引发?
它实际上是如何运作的?
谢谢
答案1
在多处理器/多核系统上,您可能会发现名为的守护进程irqbalance
。它的工作是调整处理器之间硬件中断的分配。
在启动时,当固件将系统控制权移交给内核时,最初只有一个 CPU 内核在运行。第一个核心(通常是核心 #0,有时称为“monarch CPU/核心”)最初从固件接管所有中断处理职责,然后初始化系统并启动其他 CPU 核心。因此,如果不采取任何措施来分配负载,最初启动系统的核心将承担所有中断处理职责。
https://www.kernel.org/doc/Documentation/IRQ-affinity.txt建议在现代内核上,默认情况下允许所有 CPU 内核平等地处理 IRQ。但这可能不是最佳解决方案,因为它可能会导致 CPU 高速缓存线的使用效率低下以及频繁的 IRQ 源。irqbalance
解决这个问题就是我们的工作。
irqbalance
不是内核进程:它是一个独立的二进制文件/usr/sbin/irqbalance
,可以以一次性模式运行(即作为引导过程的一部分调整中断的分配,然后退出)或作为守护进程运行。不同的 Linux 发行版可以选择以不同的方式使用它,或者完全省略它。它允许通过简单地更新用户空间二进制文件来轻松测试和实现任意复杂的策略,以将 IRQ 分配给处理器。
它的工作原理是使用每个 IRQ/proc/irq/%i/smp_affinity
文件来控制每个 CPU 可以处理哪些 IRQ。如果你对细节感兴趣,检查源代码irqbalance
:IRQ 设置的实际分配发生在activate.c
。