可以使用 MSI-X 设备设置 IRQ 关联(Linux)吗?

jon*_*ipp 5 affinity irq linux-kernel

我过去在 Linux 上通过设置 proc 文件的值来设置 IRQ 关联。[1] 但是,我注意到,当我在使用 MSI-X 的设备 (PCIe) 的系统上执行此操作时,我想为例如 NIC 设置关联性,IRQ 的每个内核的 /proc/interrupt 计数器都会增加,并且不是针对我设置的单核。在非 MSI-X 系统中,指定的内核响应中断。

我正在使用 Linux 内核 3.11。

简短:可以为使用 MSI-X 中断的设备设置 IRQ 关联吗?

[1] https://www.kernel.org/doc/Documentation/IRQ-affinity.txt

Ors*_*ong 0

为了避免 CPU 切换延迟,我试图为我的 SATA 控制器设置 IRQ (MSI-X) CPU 关联性。到目前为止,我通过以下方式获取了当前使用的 IRQ:

IRQ=$(cat /proc/interrupts | grep ahci | awk -F':' '/ /{gsub(/ /, "", $1); print $1}')
Run Code Online (Sandbox Code Playgroud)

仅通过查看中断就cat /proc/interrupts可以看出,我的SATA 控制器处理涉及多个CPU。

然后我通过以下方式设置 IRQ 关联性(在我的例子中是 cpu 2)

echo 02 > /proc/irq/$IRQ/smp_affinity
Run Code Online (Sandbox Code Playgroud)

我可以测试与的有效亲和力

cat /proc/irq/$IRQ/effective_affinity
Run Code Online (Sandbox Code Playgroud)

经过一段时间的磁盘基准测试后,我注意到亲和力保持配置不变。例子:

在进行基准测试之前,将 IRQ 134 绑定到 cpu 2:

 cat /proc/interrupts | egrep "ahci|CPU"
             CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7
  134:   12421581          1          0         17       4166          0          0          0  IR-PCI-MSI 376832-edge      ahci[0000:00:17.0]
Run Code Online (Sandbox Code Playgroud)

基准测试后:

 cat /proc/interrupts | egrep "ahci|CPU"
            CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7
 134:   12421581    2724836          0         17       4166          0          0          0  IR-PCI-MSI 376832-edge      ahci[0000:00:17.0]
Run Code Online (Sandbox Code Playgroud)

因此,就我而言,我设置的亲和力保持了应有的状态。我只能想象你irqbalance作为服务运行。你检查过了吗?就我而言,运行 irqbalance 会重新分配关联性并覆盖我设置的关联性。

我的测试系统: CentOS 8.2 4.18.0-193.6.3.el8_2.x86_64 #1 SMP Wed Jun 10 11:09:32 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

最终,我没有实现更好的磁盘利用率/性能。我最初的问题是 fio 基准测试不使用 100% 磁盘,仅使用 75-85% 之间的一些值(有时是 97%,我不知道为什么)。