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 ...>