无法在 CPU 之间平衡 eth0 IRQ

无法在 CPU 之间平衡 eth0 IRQ

我有处理大量网络数据包的服务器。我发现有证据表明,当网络负载较高时,在 CPU0 上运行的用户空间进程的性能会受到影响。我确信这与中断处理有关,特别是对于网络设备。

因此,我尝试改变网络(eth)设备的亲和性,以测试我的假设并看看是否可以提高性能。

我了解,为了改变 IRQ 亲和性,我必须改变中的值/proc/irq/XXX/smp_affinity

当我更改该文件中的值时,我只能将中断处理从一个 CPU 移动到另一个 CPU。例如,在 4 核系统中,我可以将该值设置为 1、2、4 或 8,然后我会看到中断分别从核心 0、1、2 和 3 移动(通过监控/proc/interrupts)。但是,如果我将亲和性值设置为任何核心组合,那么我看不到中断在所有核心之间保持平衡。它们始终停留在一个核心上。例如,

  • 设置ff:使用 CPU0
  • 设置12:使用 CPU4

(因此似乎只使用了最低指定的核心)

我已经停止了irqbalance守护进程,以防这会影响到其他事情(尽管我怀疑不会,因为我的理解是这irqbalance会改变文件的值smp_affinity,但我没有看到这一点)。

我的问题是:

  • 如何平衡各个核心之间的中断?
  • 这确实有可能吗?

注意:我已在 2 台机器上尝试过:一个在 VBox 中运行的 ubuntu VM,具有 2 个核心并使用 eth 设备IO-APIC;一个 ubuntu 真实机器,具有 4 个核心(8 个超线程)并使用 eth 设备PCI-MSI

作为附加问题:

  • 是否可以平衡PCI中断?据我所知,使用中断肯定是可行的IO-APIC

相关内容