ethernet smp_affinity vs / proc / interrupts vs / sys / class / net / ethX / device

我的目标是为自定义低延迟networking程序configuration我们的CentOS(“免费”RHEL)5.x服务器。 我想尝试绑定以太网NIC中断处理程序运行相同的CPU(希望提高caching利用率)。 此过程的第一步是确定NIC的IRQ。

这里是一个服务器上的/ proc / interrupts的内容(注意,为了简洁,我删除了CPU 2到14):

CPU0 CPU1 CPU15 0: 600299726 0 0 IO-APIC-edge timer 1: 3 0 0 IO-APIC-edge i8042 8: 1 0 0 IO-APIC-edge rtc 9: 0 0 0 IO-APIC-level acpi 12: 4 0 0 IO-APIC-edge i8042 50: 0 0 0 IO-APIC-level uhci_hcd:usb6, uhci_hcd:usb8 58: 6644 25103 0 IO-APIC-level ioc0 66: 0 0 0 IO-APIC-level ata_piix 74: 221 533830 0 IO-APIC-level ata_piix 98: 35 0 2902361 PCI-MSI-X eth1-0 106: 61 11 3841 PCI-MSI-X eth1-1 114: 28 0 61452 PCI-MSI-X eth1-2 122: 24 1586 22 PCI-MSI-X eth1-3 130: 2912 0 337 PCI-MSI-X eth1-4 138: 21 0 28 PCI-MSI-X eth1-5 146: 21 0 56 PCI-MSI-X eth1-6 154: 34 1 1 PCI-MSI-X eth1-7 209: 23 0 0 IO-APIC-level ehci_hcd:usb1 217: 0 0 0 IO-APIC-level ehci_hcd:usb2, uhci_hcd:usb5, uhci_hcd:usb7 225: 0 0 0 IO-APIC-level uhci_hcd:usb3 233: 0 0 0 IO-APIC-level uhci_hcd:usb4 NMI: 7615 2989 2931 LOC: 600328144 600328099 600327086 ERR: 0 MIS: 0 

为什么“eth1-X”forms的“eth1”有多个条目?

此外,“/ sys / class / net / eth1 / device / irq”的内容是“90”。 但是上面的中断列表中没有90。

所以我们来看看我只看到“eth1-0”,这是IRQ 98. / proc / irq / 98 / smp_affinity的内容是:

 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00008000 

这是一个数字列表,而不是一个数字。

那么如何设置eth1的smp_affinity?

我所能find的在线例子和文档都没有提到任何这样的情况; 它们在/ proc / interrupts中总是只有一个“ethX”条目; 指示的中断匹配/ sys / class / net / ethX / device / irq; 在/ proc / irq / N / smp_affinity中只有一个数字。

FWIW,我会补充说这个应用程序延迟非常敏感。 到了我们禁用C状态和处理器频率调整的地步(因为这些特性导致了太多的延迟)。 微秒在这里有所作为。

编辑 :我偶然发现了下面的网页http://www.kernel.org/doc/man-pages/online/pages/man7/cpuset.7.html ,虽然它是关于cpuset,它有一个标题为“ Mask Format“,我假设它和我在/ proc / irq // smp_affinity文件中看到的一样。 引用:

这种格式以hex显示每个32位字(使用ASCII字符“0” – “9”和“a” – “f”); 如果需要的话,填充前导零。 对于长于一个单词的掩码,在单词之间使用逗号分隔符。 单词以big-endian顺序显示,其中第一位最重要。 一个字中的hex数字也是大端顺序。

显示的32位字的数量是根据位掩码的大小显示位掩码的所有位所需的最小数量。

掩码格式的示例:

  00000001 # just bit 0 set 40000000,00000000,00000000 # just bit 94 set 00000001,00000000,00000000 # just bit 64 set 000000ff,00000000 # bits 32-39 set 00000000,000E3862 # 1,5,6,11-13,17-19 set 

比特位为0,1,2,4,8,16,32和64的掩码显示为:

  00000001,00000001,00010117 

第一个“1”用于位64,第二位用于位32,第三用于位16,第四用于位8,第五用于位4,“7”用于位2,1和0。

为什么“eth1-X”forms的“eth1”有多个条目?

因为有多个tx / rx队列。 这些队列往往是(本地地址,端口,远程地址,端口)和一些其他的东西哈希。 假设您的stream量来源较less,那么抑制多个队列可能会使您的应用程序更加确定。 或者你可以查看algorithm,并避免短暂的端口,如果更容易。

你在使用实时内核吗? 你是利用cgroupscpusets隔离你的应用程序? 如果您使用的是股票发行版内核,则会在表格上留下大量的延迟收益。 另外,我看到了16个CPU内核。 这将表明启用了HyperThreading。 你怎么知道你是否绑定到一个真正的逻辑核心?