Linux

乙太網 smp_affinity vs /proc/interrupts vs /sys/class/net/ethX/device

  • September 16, 2021

我的目標是為自定義低延遲網路程序配置我們的 CentOS(“免費”RHEL)5.x 伺服器。我想嘗試將乙太網 NIC 中斷處理綁定到程序執行的同一個 CPU(希望提高記憶體使用率)。此過程的第一步是確定 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”有多個“eth1-X”形式的條目?

此外,“/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呢?

我能找到的線上範例和文件都沒有提到任何這樣的案例;它們在 /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的,但它有一個標題為“遮罩格式”,我假設它與我在 /proc/irq//smp_affinity 文件中看到的相同。報價:

此格式以十六進制顯示每個 32 位字(使用 ASCII 字元“0”-“9”和“a”-“f”);如果需要,單詞用前導零填充。對於超過一個單詞的遮罩,單詞之間使用逗號分隔符。單詞以大端順序顯示,最高有效位在前。單詞中的十六進制數字也是大端順序。

顯示的 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”有多個“eth1-X”形式的條目?

因為有多個 tx/rx 隊列。這些隊列通常是(本地地址、埠、遠端地址、埠)和其他一些東西的雜湊。假設您的流量來源很少,抑制多個隊列可能更容易使您的應用程序更具確定性。或者您可以查找算法並避免使用臨時埠,如果這樣更容易的話。

你用的是實時核心嗎?您是在利用cgroups還是cpusets隔離您的應用程序?如果您使用的是股票分發核心,那麼您將在桌面上留下大量的延遲收益。此外,我看到 16 個 CPU 核心。這表明超執行緒已啟用。你怎麼知道你是綁定到一個真實的還是邏輯的核心?

引用自:https://serverfault.com/questions/254355