KVM / Qemu, Ubuntu: Por que mais CPUs de convidados aprimoram a I / O de disco rapidamente?

9

Temos um cluster Heartbeat / DRBD / Pacemaker / KVM / Qemu / libvirt que consiste em dois nós. Cada nó executa o Ubuntu 12.04 64 Bit com os seguintes pacotes / versões:

  • Kernel 3.2.0-32-generic # 51-Ubuntu SMP
  • DRBD 8.3.11
  • qemu-kvm 1.0 + noroms-0ubuntu14.3
  • libvirt 0.9.13
  • pacemaker 1.1.7
  • heartbeat 3.0.5

Os convidados virtuais estão executando o Ubuntu 10.04 64 Bit e o Ubuntu 12.04 64 Bit. Utilizamos um recurso libvirt para transmitir os recursos das CPUs host aos convidados virtuais, a fim de obter o melhor desempenho da CPU.

Agora, aqui está uma configuração comum neste cluster:

  • O "monitoramento" da VM possui 4 vCPUs
  • O "monitoramento" da VM usa o ide como interface de disco (atualmente estamos mudando para o VirtIO por motivos óbvios)

Recentemente, fizemos alguns testes simples. Sei que eles não são profissionais e não alcançam altos padrões, mas já mostram uma forte tendência:

O nó A está executando a VM "bla" O nó B está executando a "monitoração" da VM

Quando sincronizamos um arquivo da VM "bla" para a "monitoração" da VM, atingimos apenas 12 MB / s. Quando executamos um dd simples se = / dev / null de = / tmp / blubb dentro do "monitoramento" da VM, atingimos cerca de 30 MB / s.

Em seguida, adicionamos mais 4 vCPUs à "monitoração" da VM e a reiniciamos. A "monitoração" da VM agora possui 8 vCPUs. Executamos novamente os testes com os seguintes resultados: Quando sincronizamos novamente um arquivo da VM "bla" para a "monitoração" da VM, atingimos 36 MB / s. Quando executamos um dd simples se = / dev / null de = / tmp / blubb dentro do "monitoramento" da VM, atingimos agora cerca de 61 MB / s.

Para mim, esse efeito é bastante surpreendente. Como é que, aparentemente, adicionar mais CPUs virtuais a esse convidado virtual significa automaticamente mais desempenho do disco dentro da VM?

Não tenho uma explicação para isso e realmente aprecio sua opinião. Quero entender o que causa esse aumento de desempenho, pois posso reproduzir esse comportamento 100%.

Valentin
fonte
2
Use uma ferramenta de benchmarking criada especificamente para fins como iozone ou bonnie ++ para ajudar a eliminar outras variáveis.
ewwhite
Seria interessante a aparência das cargas reais da CPU ... é algo vinculado à CPU introduzido em um local oculto (o rsync mais provavelmente o ssh certamente é até certo ponto, também são os drivers de rede introduzidos dessa maneira, o dd também pode fazer coisas inesperadas vinculadas à CPU ...), ou são realmente coisas esperando otimamente uma pela outra devido a menos threads de execução disponíveis?
rackandboneman
3
execute kvm_tracepara ver como o número de IO_Exitsalterações é alterado quando você altera os números da CPU. Eu acho que é porque você está usando o IDE, que é agendado com as CPUs convidadas. Com o virtio, o desempenho deve ser consistente e, quando o plano de dados estiver no qemu, obterá um impulso drástico. Outro palpite pode estar no fato de você estar usando uma distribuição conhecida por uma pilha de virtualização de buggy.
dyasny
@ ewwhite: Sim, executar testes profissionais seria uma boa escolha. No entanto, quero entender primeiro por que esse comportamento de E / S ocorre. @ rachandboneman: Quando olhei pela última vez, as 4 CPUs tinham um valor de espera muito alto (cerca de 70-80%). @dyasny: Obrigado, vou tentar isso. Como posso verificar se o plano de dados está ativado / usado atualmente?
Valentin
O data-plane é experimental por enquanto, e tenho certeza de que a primeira distribuição a buscá-lo será o Fedora. pl.digipedia.org/usenet/thread/11769/28329
dyasny

Respostas:

9

Vou dar uma idéia / explicação muito grosseira.

Na situação do OP, além de medir na VM, o host também deve ser visto.

Nesse caso, podemos assumir que o seguinte está correto

  1. Em todo o teste, a largura de banda de E / S (disco) do host não está no máximo. À medida "monitoring"que a E / S da VM ( ) aumenta, mais CPUs são alocadas a ela. Se a E / S do host já tiver atingido o limite máximo, não deverá haver ganho de desempenho de E / S.
  2. "bla"não é o fator limitante Como "monitoring"o desempenho de E / S melhorou sem alterações no"bla"
  3. A CPU é a principal fábrica de ganho de desempenho (no caso de OP), já que a E / S não é o gargalo da garrafa e a OP não menciona nenhuma alteração no tamanho da memória. Mas por que? Ou como?

Fator adicional

  1. A gravação leva mais tempo que a leitura É o mesmo para a VM e para o host. Coloque-o em termos extremamente simples: a VM espera o host concluir a leitura e gravação.

O que acontece quando mais cpu é atribuído "monitoring"?

Quando "monitoring"são alocadas mais CPUs, elas ganham mais poder de processamento, mas também ganham mais tempo de processamento de E / S.

Isso não tem nada a ver rsync, pois é um programa de thread único.

É a camada de E / S que utiliza o aumento da potência da CPU ou, mais precisamente, o aumento do tempo de processamento.

Se o programa de monitoramento da CPU (por exemplo, top) for usado "monitoring"durante o teste, ele mostrará não um, mas todo o uso da CPU aumentará e também% wa. % wa é o tempo de espera gasto em E / S.

Esse aumento de desempenho ocorrerá apenas quando a E / S do host não for máxima. Fora.

Não consigo encontrar o agendamento da CPU no site KVM, mas existe um blog que menciona que o KVM está usando CFS e cgroups, a seguir está a citação

No KVM, cada vcpu é mapeado para um processo Linux que, por sua vez, utiliza assistência de hardware para criar a 'fumaça e os espelhos' necessários para a virtualização. Como tal, um vcpu é apenas mais um processo para o CFS e também importante para cgroups que, como gerenciador de recursos, permite que o Linux gerencie a alocação de recursos - normalmente proporcionalmente para definir alocações de restrição. Os cgroups também se aplicam à memória, rede e E / S. Grupos de processos podem fazer parte de um grupo de agendamento para aplicar requisitos de alocação de recursos a grupos hierárquicos de processos.

Em poucas palavras, mais cpu = mais tempo de cpu = mais intervalo de tempo de E / S em um determinado período de tempo.

John Siu
fonte
Obrigado por escrever esta resposta. "Mais vCPUs significa mais tempo de processamento para E / S" é a explicação que eu estava procurando. Vale a recompensa!
Valentin