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

4

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.

    
por Matt 31.03.2011 / 23:26

2 respostas

3

Why are there multiple entries for "eth1" in the form of "eth1-X"?

Porque existem várias filas tx / rx. Essas filas são muitas vezes um hash de (addr local, porta, addr remoto, porta) e algumas outras coisas. Suprimir as várias filas pode facilitar  para tornar sua aplicação mais determinista, supondo que você tenha poucas origens de tráfego. Ou você pode procurar o algoritmo e evitar portas efêmeras, se isso for mais fácil.

    
por 24.11.2011 / 07:52
2

Você está usando um kernel em tempo real? Você está aproveitando cgroups ou cpusets para isolar seu aplicativo? Se você está em um kernel de distribuição de ações, está deixando uma boa quantidade de ganhos de latência na tabela. Além disso, vejo 16 núcleos de CPU. Isso indicaria que o HyperThreading está ativado. Como você sabe se você está ligado a um núcleo real versus lógico?

    
por 12.04.2012 / 17:05