乙太網 smp_affinity vs /proc/interrupts vs /sys/class/net/ethX/device
我的目標是為自定義低延遲網路程序配置我們的 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 核心。這表明超執行緒已啟用。你怎麼知道你是綁定到一個真實的還是邏輯的核心?