Não é possível balancear IRQs eth0 entre CPUs

2

Eu tenho servidores que lidam com um grande número de pacotes de rede. Vi evidências de que os processos de espaço do usuário executados na CPU0 tiveram seu desempenho afetado quando a carga da rede é alta. Tenho quase certeza de que isso está relacionado ao manuseio de interrupções, especificamente para dispositivos de rede.

Assim, estou experimentando mudar a afinidade dos dispositivos de rede (eth) para testar minha hipótese e ver se posso melhorar o desempenho.

Entendo que, para alterar a afinidade de IRQ, devo alterar o valor em /proc/irq/XXX/smp_affinity .

Quando altero o valor desse arquivo, só consigo mover o tratamento de interrupção de uma CPU para outra. Por exemplo, em um sistema de quatro núcleos, posso definir esse valor para 1, 2, 4 ou 8 e vejo as interrupções se moverem dos núcleos 0,1,2 e 3, respectivamente (monitorando /proc/interrupts ). No entanto, se eu definir o valor de afinidade para qualquer combinação de núcleos, não vejo interrupções equilibradas em todos os núcleos. Eles sempre se ater a um núcleo. Por exemplo,

  • Definindo ff : CPU0 usado
  • Definindo 12 : CPU4 usado

(Assim, parece que apenas o menor núcleo especificado é usado)

Eu parei o daemon irqbalance caso isso estivesse afetando as coisas (embora eu desconfie que não como meu entendimento seria que irqbalance mudaria os valores do arquivo smp_affinity e não vejo isso).

Minhas perguntas são assim:

  • Como equilibro as interrupções nos núcleos?
  • É mesmo possível fazê-lo?

N.B. Eu tentei isso em 2 máquinas: Uma VM ubuntu rodando no VBox com 2 núcleos e com o dispositivo eth usando IO-APIC ; Uma máquina real do Ubuntu com 4 núcleos (8 hyperthreaded) e com dispositivo eth usando PCI-MSI .

Como uma pergunta bônus:

  • É possível equilibrar PCI interrupções? Pelo que entendi, deve ser definitivamente possível com IO-APIC interrupções.
por Andrew Parker 18.08.2016 / 06:48

0 respostas