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,
ff
: CPU0 usado 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:
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:
PCI
interrupções? Pelo que entendi, deve ser definitivamente possível com IO-APIC
interrupções. Tags pci interrupts linux irq affinity