Como alterar a afinidade do SMP de um IRQ no Ubuntu PV domU dentro do Xen XCP?

3

Eu gostaria de alterar a afinidade do IRQ SMP por motivos, descritos nesta pergunta: CPU0 é inundado com interrupções de eth1

Mas não consigo - vejo Input/output error quando tento escrever em /proc/irq/*/smp_affinity .

Por favor me aponte para o HOWTO sobre o assunto. (Uma referência formal sobre /proc/irq/*/ seria legal também.)

Detalhes sangrentos:

Note que esta é uma VM (PV domU) dentro de um host Xen XCP baseado em Ubuntu.

$ uname -a
Linux MYHOST 2.6.38-15-virtual #59-Ubuntu SMP Fri Apr 27 16:40:18 UTC 2012 i686 i686 i386 GNU/Linux

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 11.04
Release:    11.04
Codename:   natty

$ sudo cat /proc/irq/*/smp_affinity
01
01
01
01
01
80
80
80
80
80
80
40
40
40
40
40
40
20
20
20
20
20
20
10
10
10
10
10
10
08
08
08
08
08
08
04
04
04
04
04
04
02
02
02
02
02
02
01
01
01
01
01
01

Atualizar. Os detalhes do erro:

$ N=$(grep -c processor /proc/cpuinfo)
$ echo $N
8

$ printf %x $((2**N-1))
ff

$ printf %x $((2**N-1)) | sudo tee /proc/irq/*/smp_affinity
fftee: /proc/irq/288/smp_affinity: Input/output error
tee: /proc/irq/289/smp_affinity: Input/output error
tee: /proc/irq/290/smp_affinity: Input/output error
tee: /proc/irq/291/smp_affinity: Input/output error
tee: /proc/irq/292/smp_affinity: Input/output error
tee: /proc/irq/293/smp_affinity: Input/output error
tee: /proc/irq/294/smp_affinity: Input/output error
tee: /proc/irq/295/smp_affinity: Input/output error
tee: /proc/irq/296/smp_affinity: Input/output error
tee: /proc/irq/297/smp_affinity: Input/output error
tee: /proc/irq/298/smp_affinity: Input/output error
tee: /proc/irq/299/smp_affinity: Input/output error
tee: /proc/irq/300/smp_affinity: Input/output error
tee: /proc/irq/301/smp_affinity: Input/output error
tee: /proc/irq/302/smp_affinity: Input/output error
tee: /proc/irq/303/smp_affinity: Input/output error
tee: /proc/irq/304/smp_affinity: Input/output error
tee: /proc/irq/305/smp_affinity: Input/output error
tee: /proc/irq/306/smp_affinity: Input/output error
tee: /proc/irq/307/smp_affinity: Input/output error
tee: /proc/irq/308/smp_affinity: Input/output error
tee: /proc/irq/309/smp_affinity: Input/output error
tee: /proc/irq/310/smp_affinity: Input/output error
tee: /proc/irq/311/smp_affinity: Input/output error
tee: /proc/irq/312/smp_affinity: Input/output error
tee: /proc/irq/313/smp_affinity: Input/output error
tee: /proc/irq/314/smp_affinity: Input/output error
tee: /proc/irq/315/smp_affinity: Input/output error
tee: /proc/irq/316/smp_affinity: Input/output error
tee: /proc/irq/317/smp_affinity: Input/output error
tee: /proc/irq/318/smp_affinity: Input/output error
tee: /proc/irq/319/smp_affinity: Input/output error
tee: /proc/irq/320/smp_affinity: Input/output error
tee: /proc/irq/321/smp_affinity: Input/output error
tee: /proc/irq/322/smp_affinity: Input/output error
tee: /proc/irq/323/smp_affinity: Input/output error
tee: /proc/irq/324/smp_affinity: Input/output error
tee: /proc/irq/325/smp_affinity: Input/output error
tee: /proc/irq/326/smp_affinity: Input/output error
tee: /proc/irq/327/smp_affinity: Input/output error
tee: /proc/irq/328/smp_affinity: Input/output error
tee: /proc/irq/329/smp_affinity: Input/output error
tee: /proc/irq/330/smp_affinity: Input/output error
tee: /proc/irq/331/smp_affinity: Input/output error
tee: /proc/irq/332/smp_affinity: Input/output error
tee: /proc/irq/333/smp_affinity: Input/output error
tee: /proc/irq/334/smp_affinity: Input/output error
tee: /proc/irq/335/smp_affinity: Input/output error

Atualizar. irqbalance está sendo executado:

$ sudo service irqbalance status
irqbalance start/running, process 560
    
por Alexander Gladysh 07.11.2012 / 14:52

3 respostas

3

Eu não acho que mover interrupções para CPUs diferentes - especialmente para lidar com eventos de rede - aumentaria o desempenho.

O contrário acontecerá, já que o código de rede não pode mais ser mantido em uma CPU específica.

Portanto, contanto que você não experimente pacotes descartados em sua interface de rede, eu diria - isso é um comportamento bastante normal para uma rede que serve muitos pacotes.

Você precisa diminuir o número de interrupções - movê-las não ajudará (ao contrário, como tentei descrever).

Eu vejo duas soluções possíveis:

  • Aumentar seu tamanho de MTU para diminuir o número de interrupções
  • PIN a vCPU 0 do DomU para uma CPU dedicada no Dom0 (que não é usada por nenhuma outra VM ou pelo Dom0).

Atualização 2012-12-17: Desde que você solicitou links autorizados - tentei fazer uma pergunta geral Quando não usar a virtualização - Acho que esse é um dos casos em que você está atingindo os limites gerais da VM. Uma das respostas para a pergunta contém uma abordagem diferente: use contêineres, em vez de virtualização.

Espero que isso ajude ...

    
por 11.11.2012 / 23:04
6

Existe um ficheiro chamado Documentation/IRQ-affinity.txt no código-fonte do Linux.

/proc/irq/IRQ#/smp_affinity specifies which target CPUs are permitted
for a given IRQ source. It's a bitmask of allowed CPUs. It's not allowed
to turn off all CPUs, and if an IRQ controller does not support IRQ
affinity then the value will not change from the default 0xffffffff.

A pegadinha aqui é que o bitmask está em hexadecimal. Então, se você tem N CPUs,

N=$(grep -c processor /proc/cpuinfo)

para habilitar todos os IRQs para todas as CPUs, onde você tem N CPUs que você pode

printf %x $((2**N-1)) | sudo tee /proc/irq/*/smp_affinity

Kernel 3.0 e posterior tem um arquivo chamado smp_affinity_list . Esse arquivo usa uma lista separada por vírgulas de CPUs ou intervalos de CPU. Exemplos válidos: 0 , 2,3,5-7 , 0-7 . O comando anterior é equivalente a:

echo 0-$((N-1)) | sudo tee /proc/irq/*/smp_affinity_list
    
por 07.11.2012 / 16:21
0

But I'd like to see an authoritative answer on why affinity configuration does not work. It worries me that everyone seems to assume that it is possible, but I can't do that.

Apenas nesta pergunta específica - e não tenho idéia se o Xen afeta essa resposta - você recebe a mensagem Input/output error quando nenhum driver de dispositivo tem atualmente um manipulador instalado para essa interrupção.

Se um driver instalar um manipulador em '105', por exemplo, o diretório /proc/irq/105 será criado e conterá smp_affinity , entre outras coisas. Agora você pode escrever em smp_affinity . Se você fechar o dispositivo, o diretório permanecerá com o smp_affinity , mas você não poderá mais gravar nele. Abra o dispositivo (via open , ou o que eventualmente chama request_irq no driver) e agora você pode gravar no arquivo. Apenas testado no RHEL / SL 6.

Se você não souber se o dispositivo está ou não aberto no momento, verifique o diretório. Ele conterá o nome do dispositivo, se estiver aberto.

    
por 10.11.2015 / 14:40