我有处理大量网络数据包的服务器。我发现有证据表明,当网络负载较高时,在 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
。