我过去在 Linux 上通过为 proc 文件设置值来设置 IRQ 亲和力。[1]但是,我注意到当我在使用MSI-X作为设备的系统上执行此操作时(PCIe),我想为例如 NIC、/proc/中断计数器增量设置亲和力对于 IRQ 的每个内核,而不是我为其设置的单个内核。在非MSI-X 系统指定的内核应答中断。
我使用的是 Linux 内核 3.11。
简短:是否可以为使用 MSI-X 中断的设备设置 IRQ 关联?
[1] https://www.kernel.org/doc/Documentation/IRQ-affinity.txt
解开这个线程,我正在尝试为我的 SATA 控制器设置 IRQ (MSI-X) CPU 关联,以避免 CPU 切换延迟。到目前为止,我通过以下方式获得了当前使用的 IRQ:
IRQ=$(cat /proc/interrupts | grep ahci | awk -F':' '/ /{gsub(/ /, "", $1); print $1}')
仅查看通过cat /proc/interrupts
的中断就会发现我的 sata 控制器处理中涉及多个 CPU。
然后,我通过以下方式设置 IRQ 关联(在我的例子中为 cpu 2)
echo 02 > /proc/irq/$IRQ/smp_affinity
我可以测试有效的亲和力
cat /proc/irq/$IRQ/effective_affinity
经过一段时间的磁盘基准测试后,我注意到关联性保持配置。例:
在基准测试之前,将 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]
基准测试后:
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]
因此,就我而言,我设置的亲和力保持应有的状态。我只能想象您irqbalance
作为服务运行。你检查过吗?就我而言,运行 irqbalance 会重新分配相关性并覆盖我设置的相关性。
我的测试系统: CentOS 8.2 4.18.0-193.6.3.el8_2.x86_64 #1 SMP 周三 6 月 10 日 11:09:32 UTC x86_64 x86_64 x86_64 GNU/Linux
最后,我没有获得更好的磁盘利用率/性能。我最初的问题是 fio 基准测试不使用 100% 磁盘,只是 75-85% 之间的一些值(有时是 97%,我不知道为什么)。