确定哪个 CPU 处理 Linux 内核中的哪个中断的策略是什么?

dev*_*ium 7 kernel interrupt linux-kernel

我一直在阅读Linux Kernel Development,但有一些事情对我来说并不完全清楚——当硬件触发中断时,决定哪个 CPU 运行中断处理逻辑的标准是什么?

我可以想象它必须始终与引发 IO 请求的 CPU 相同,但由于线程用于所有目的,现在正在休眠,因此这样做并没有多大意义。

另一方面,可能存在需要引发的定时中断(例如,对于调度程序)。在 SMP 系统上,它们总是在同一个核心上提升(比方说,#0)还是它们几乎总是在任何核心上提升?

它实际上是如何工作的?

谢谢

tel*_*coM 8

在多处理器/多核系统上,您可能会发现一个名为irqbalance. 它的工作是调整处理器间硬件中断的分布。

在启动时,当固件将系统控制权移交给内核时,最初只有一个 CPU 内核在运行。在初始化系统和启动其他 CPU 内核之前,第一个内核(通常是内核 #0,有时称为“主 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.