kvm e qemu host: Existe um limite para CPUs máximas (Ubuntu 10.04)?

6

Hoje encontramos um comportamento muito estranho em dois hosts kvm e qemu idênticos (Dell R910). Cada um dos sistemas host tem 4 x 10 Cores, o que significa que 40 núcleos físicos são exibidos como 80 dentro do sistema operacional (Ubuntu Linux 10.04 64 Bit, Kernel 3.0).

Iniciamos uma VM de 32 bits do Windows 2003 (1 CPU, 1 GB de RAM, alteramos esses valores várias vezes) em um dos nós e notamos que levou 15 minutos até o processo de inicialização começar. Durante esses 15 minutos, uma tela preta é mostrada e nada acontece. O libvirt e o sistema host mostram que o processo qemu-kvm para o convidado está quase ocioso. stracing este processo mostra apenas algumas entradas FUTEX, mas nada de especial.

Após esses 15 minutos, a VM do Windows de repente começa a inicialização e o logotipo do Windows ocorre. Após alguns segundos, a VM está pronta para ser usada. A VM em si é muito eficiente, então isso não é problema de desempenho.

Nós tentamos fixar as CPUs com as ferramentas virsh e taskset, mas isso só piorou as coisas.

Quando inicializamos a VM do Windows com um Live CD do Linux, há também uma tela preta por vários minutos, mas não por até 15. Ao inicializar outra VM nesse host (Ubuntu 10.04) ela também tem o problema da tela preta. e também aqui a tela preta é mostrada apenas por 2-3 minutos (em vez de 15).

Então, no verão, é isso: Cada convidado em cada um desses nós idênticos sofre de inatividade alguns minutos depois de ser iniciado. Após alguns minutos, o processo de inicialização é iniciado de repente. Observamos que o tempo de inatividade acontece logo após o bios do convidado ser inicializado.

Um de nossos funcionários teve a ideia de limitar a quantidade de CPUs com maxcpus = 40 (devido a 40 núcleos físicos existentes) dentro do Grub (parâmetro kernel) e de repente o comportamento "black-screen-idling" desapareceu.

Pesquisando as listas de discussão do KVM e Qemu, a internet, fóruns, serverfault e outros vários sites para bugs conhecidos, etc., não mostraram resultados úteis. Mesmo perguntando nos canais dev IR IRC não trouxe novas idéias. As pessoas de lá nos recomendam usar pinagem de CPU, mas como dito antes, não ajudou.

Minha pergunta agora é: Existe algum tipo de limite de CPUs para um sistema host qemu ou kvm? Navegar no código fonte dessas duas ferramentas mostrou que o KVM enviaria um aviso se o seu host tivesse mais de 255 CPUs. Mas nós não estamos nem mesmo coçando esse limite.

Algumas coisas sobre o sistema host:

3.0.0-20-server
kvm 1:84+dfsg-0ubuntu16+0.14.0+noroms+0ubuntu4
kvm-pxe 5.4.4-7ubuntu2
qemu-kvm 0.14.0+noroms-0ubuntu4
qemu-common 0.14.0+noroms-0ubuntu4
libvirt 0.8.8-1ubuntu6
4 x Intel(R) Xeon(R) CPU E7-4870  @ 2.40GHz, 10 Cores

Edit: Também tentei o kernel 3.2 (com o parâmetro maxcpus não sendo usado) - infelizmente isso piorou as coisas. dstat mostra uma quantidade crescente de swiches de contexto:

----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw 
  0   0  99   0   0   0|1164k  638k|   0     0 |   0     0 |4972  6319 
  0   1  99   0   0   0|   0     0 |3456B 4847B|   0     0 |  18k   33k
  0   1  99   0   0   0|   0     0 |6126B 4550B|   0     0 |  17k   33k
  0   1  99   0   0   0|   0     0 |1772B 4139B|   0     0 |  17k   33k
  0   1  99   0   0   0|   0     0 |5507B 3674B|   0     0 |  17k   32k

Os valores normais seriam em torno de 7000 para este sistema com uma VM ativa.

Editar: Eu iniciei os sistemas host com maxcpus = 40 como um parâmetro de inicialização. O virgin nodeinfo mostra 40 núcleos físicos e não hyperthreaded.

Ao iniciar a máquina virtual, ela ainda tem uma "quebra de inicialização" de cerca de 30 segundos. Durante esse tempo, a quantidade de interruptores de contexto aumenta de 300 (por segundo) para 600.000 (por segundo). Após 30 segundos de tela preta, a VM inicia o processo de inicialização normal e os interruptores de contexto passam para < 7000 por segundo:

----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw 
  1   2  97   0   0   0| 943k    0 |  26k   12k|   0     0 |  22k   40k
  3   7  84   6   0   0|  26M   64k|  71k   18k|   0     0 |  10k   16k
  1   1  97   1   0   0|5282k 2560B|9751B   15k|   0     0 |  13k   23k
  1   4  95   0   0   0|1216k    0 |  14k   18k|   0     0 | 295k  592k
  1   3  96   0   0   0|   0    52k|5518B 7299B|   0     0 | 228k  456k
  1   3  96   0   0   0|  12k   24k|1228B 1514B|   0     0 | 258k  518k
  1   4  96   0   0   0|   0     0 |  14k   32k|   0     0 | 280k  565k
  1   3  96   0   0   0|   0     0 |  19k   38k|   0     0 | 284k  573k
  1   3  96   0   0   0|   0     0 |6465B 7203B|   0     0 | 288k  581k
  1   3  96   0   0   0|   0   172k|  26k   11k|   0     0 | 290k  584k
  1   3  96   0   0   0|   0     0 |  23k   11k|   0     0 | 288k  580k
  1   3  96   0   0   0|   0    12k|5678B 4556B|   0     0 | 289k  583k
  1   3  96   0   0   0|   0     0 |1192B 2929B|   0     0 | 288k  580k
  1   3  96   0   0   0|   0     0 |6304B   10k|   0     0 | 272k  547k
  1   3  96   0   0   0|4096B   52k|8330B   14k|   0     0 | 300k  605k
  1   3  96   0   0   0|   0    24k|  11k   20k|   0     0 | 293k  591k
  1   3  96   0   0   0|   0     0 |  13k   28k|   0     0 | 291k  587k
  1   3  96   0   0   0|   0   512B|  10k   18k|   0     0 | 291k  587k
  2   3  95   0   0   0|   0     0 |6653B   10k|   0     0 | 167k  337k
  3   0  97   0   0   0|   0   160k|  23k 5524B|   0     0 |  10k   19k
  7   0  92   0   0   0|   0    36k|  22k 3335B|   0     0 | 949   924 
 10   0  90   0   0   0|   0     0 |5172B 3318B|   0     0 | 908   923 
  5   0  94   0   0   0|   0     0 |2234B 2825B|   0     0 | 846   875 

Edit: Conforme solicitado, adicionarei um trecho da string -f -p:

25734 <... read resumed> "
3.0.0-20-server
kvm 1:84+dfsg-0ubuntu16+0.14.0+noroms+0ubuntu4
kvm-pxe 5.4.4-7ubuntu2
qemu-kvm 0.14.0+noroms-0ubuntu4
qemu-common 0.14.0+noroms-0ubuntu4
libvirt 0.8.8-1ubuntu6
4 x Intel(R) Xeon(R) CPU E7-4870  @ 2.40GHz, 10 Cores
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw 
  0   0  99   0   0   0|1164k  638k|   0     0 |   0     0 |4972  6319 
  0   1  99   0   0   0|   0     0 |3456B 4847B|   0     0 |  18k   33k
  0   1  99   0   0   0|   0     0 |6126B 4550B|   0     0 |  17k   33k
  0   1  99   0   0   0|   0     0 |1772B 4139B|   0     0 |  17k   33k
  0   1  99   0   0   0|   0     0 |5507B 3674B|   0     0 |  17k   32k
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw 
  1   2  97   0   0   0| 943k    0 |  26k   12k|   0     0 |  22k   40k
  3   7  84   6   0   0|  26M   64k|  71k   18k|   0     0 |  10k   16k
  1   1  97   1   0   0|5282k 2560B|9751B   15k|   0     0 |  13k   23k
  1   4  95   0   0   0|1216k    0 |  14k   18k|   0     0 | 295k  592k
  1   3  96   0   0   0|   0    52k|5518B 7299B|   0     0 | 228k  456k
  1   3  96   0   0   0|  12k   24k|1228B 1514B|   0     0 | 258k  518k
  1   4  96   0   0   0|   0     0 |  14k   32k|   0     0 | 280k  565k
  1   3  96   0   0   0|   0     0 |  19k   38k|   0     0 | 284k  573k
  1   3  96   0   0   0|   0     0 |6465B 7203B|   0     0 | 288k  581k
  1   3  96   0   0   0|   0   172k|  26k   11k|   0     0 | 290k  584k
  1   3  96   0   0   0|   0     0 |  23k   11k|   0     0 | 288k  580k
  1   3  96   0   0   0|   0    12k|5678B 4556B|   0     0 | 289k  583k
  1   3  96   0   0   0|   0     0 |1192B 2929B|   0     0 | 288k  580k
  1   3  96   0   0   0|   0     0 |6304B   10k|   0     0 | 272k  547k
  1   3  96   0   0   0|4096B   52k|8330B   14k|   0     0 | 300k  605k
  1   3  96   0   0   0|   0    24k|  11k   20k|   0     0 | 293k  591k
  1   3  96   0   0   0|   0     0 |  13k   28k|   0     0 | 291k  587k
  1   3  96   0   0   0|   0   512B|  10k   18k|   0     0 | 291k  587k
  2   3  95   0   0   0|   0     0 |6653B   10k|   0     0 | 167k  337k
  3   0  97   0   0   0|   0   160k|  23k 5524B|   0     0 |  10k   19k
  7   0  92   0   0   0|   0    36k|  22k 3335B|   0     0 | 949   924 
 10   0  90   0   0   0|   0     0 |5172B 3318B|   0     0 | 908   923 
  5   0  94   0   0   0|   0     0 |2234B 2825B|   0     0 | 846   875 
25734 <... read resumed> "%pre%%pre%%pre%%pre%%pre%%pre%%pre%6777%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%"..., 128) = 128
25752 futex(0x927e60, FUTEX_WAIT_PRIVATE, 2, NULL <unfinished ...>
25734 rt_sigaction(SIGALRM, NULL, {0x4b2300, ~[KILL STOP RTMIN RT_1], SA_RESTORER, 0x7fe09ac108f0}, 8) = 0
25734 write(8, "%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 8)   = 8
25734 read(15, 0x7fffcea69f70, 128)     = -1 EAGAIN (Resource temporarily unavailable)
25734 timer_gettime(0x1, {it_interval={0, 0}, it_value={0, 0}}) = 0
25734 timer_settime(0x1, 0, {it_interval={0, 0}, it_value={0, 250000}}, NULL) = 0
25734 timer_gettime(0x1, {it_interval={0, 0}, it_value={0, 182592}}) = 0
25734 futex(0x927e60, FUTEX_WAKE_PRIVATE, 1 <unfinished ...>
25752 <... futex resumed> )             = 0
25734 <... futex resumed> )             = 1
25752 futex(0x927e60, FUTEX_WAKE_PRIVATE, 1 <unfinished ...>
25734 select(25, [7 10 14 15 16 17 18 24], [], [], {1, 0} <unfinished ...>
%pre%%pre%%pre%6777%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%"..., 128) = 128 25752 futex(0x927e60, FUTEX_WAIT_PRIVATE, 2, NULL <unfinished ...> 25734 rt_sigaction(SIGALRM, NULL, {0x4b2300, ~[KILL STOP RTMIN RT_1], SA_RESTORER, 0x7fe09ac108f0}, 8) = 0 25734 write(8, "%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 8) = 8 25734 read(15, 0x7fffcea69f70, 128) = -1 EAGAIN (Resource temporarily unavailable) 25734 timer_gettime(0x1, {it_interval={0, 0}, it_value={0, 0}}) = 0 25734 timer_settime(0x1, 0, {it_interval={0, 0}, it_value={0, 250000}}, NULL) = 0 25734 timer_gettime(0x1, {it_interval={0, 0}, it_value={0, 182592}}) = 0 25734 futex(0x927e60, FUTEX_WAKE_PRIVATE, 1 <unfinished ...> 25752 <... futex resumed> ) = 0 25734 <... futex resumed> ) = 1 25752 futex(0x927e60, FUTEX_WAKE_PRIVATE, 1 <unfinished ...> 25734 select(25, [7 10 14 15 16 17 18 24], [], [], {1, 0} <unfinished ...>
    
por Valentin 21.06.2012 / 20:42

2 respostas

5

Como recomendo em um dos comentários (obrigado cperrin88), o Ubuntu 12.04 trouxe a solução. Alguns parâmetros:

  • Kernel 3.2
  • 80 núcleos (40 físicos, 80 por causa do Intel HT)
  • kvm 1: 84 + dfsg-0ubuntu16 + 1.0 + noroms + 0ubuntu13
  • kvm-ipxe 1.0.0 + git-3.55f6c88-0ubuntu1
  • qemu-kvm 1.0 + noroms-0ubuntu13
  • libvirt 0.9.8-2ubuntu17.1

O convidado do Windows agora mostra uma barra de inicialização durante os primeiros 30 segundos da inicialização e depois apenas inicializa (comportamento normal).

A quantidade de interruptores de contexto agora é muito baixa em comparação com o cenário de teste que eu tive anteriormente (entre 200 e 24k por segundo).

Então, problema resolvido. Eu só preciso descobrir o que mudou (acho que foi um bug no KVM).

Obrigado a todos os comentários e seus esforços!

    
por 25.06.2012 / 11:48
3

Eu encontrei alguns bugs com o KVM no Ubuntu 10.04. (que eu ainda tenho que usar), incluindo caches crescentes que são trocados e sérios problemas de desempenho.

Eu recomendo que você atualize para a versão mais recente do LTS na esperança de corrigir alguns bugs.

    
por 30.06.2012 / 03:30