Meu objetivo é configurar nossos servidores CentOS ("gratuitos" RHEL) 5.x para programas personalizados de rede de baixa latência. Eu gostaria de experimentar com a ligação de interrupção de NIC ethernet para a mesma CPU em que o programa é executado (para melhorar a utilização do cache). O primeiro passo neste processo é determinar o IRQ da NIC.
Aqui está o conteúdo de / proc / interrupts em um servidor (note que eu deletei as CPUs de 2 a 14 para brevidade):
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
Por que existem várias entradas para "eth1" na forma de "eth1-X"?
Além disso, o conteúdo de "/ sys / class / net / eth1 / device / irq" é "90". Mas não há 90 na lista de interrupções acima.
Então, digamos que eu olhe apenas "eth1-0", que é o IRQ 98. O conteúdo de / proc / irq / 98 / smp_affinity é:
00000000,00000000,00000000,00000000,00000000,00000000,00000000,00008000
Essa é uma lista de números, em vez de apenas um número.
Então, como eu defino o smp_affinity da eth1?
Nenhum dos exemplos online e documentação que encontrei mencionou casos como este; eles sempre têm exatamente uma entrada "ethX" em / proc / interrupts; a interrupção indicada corresponde a / sys / class / net / ethX / device / irq; e há apenas um número em / proc / irq / N / smp_affinity.
FWIW, acrescentarei que esta aplicação é extremamente sensível à latência. Até o ponto em que desabilitamos os estados-C e a escala de freqüência do processador (porque esses recursos induzem muita latência). Os Micro segundos fazem a diferença aqui.
Editar : eu tropecei na seguinte página da Web
link
que, embora seja sobre o cpuset, ele tem uma seção intitulada "Mask Format", que eu assumo é a mesma que eu estou vendo no arquivo / proc / irq // smp_affinity. Citando:
This format displays each 32-bit word in hexadecimal (using ASCII
characters "0" - "9" and "a" - "f"); words are filled with leading zeros,
if required. For masks longer than one word, a comma separator is used
between words. Words are displayed in big-endian order, which has the
most significant bit first. The hex digits within a word are also in
big-endian order.
The number of 32-bit words displayed is the minimum number needed to
display all bits of the bitmask, based on the size of the bitmask.
Examples of the Mask Format:
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
A mask with bits 0, 1, 2, 4, 8, 16, 32, and 64 set displays as:
00000001,00000001,00010117
The first "1" is for bit 64, the second for bit 32, the third for bit 16,
the fourth for bit 8, the fifth for bit 4, and the "7" is for bits 2, 1,
and 0.