Acelerando o Subsistema de Disco Qemu KVM no Linux



Às vezes, assumo várias tarefas para configurar servidores. Há algum tempo, o proprietário de uma pequena empresa de hospedagem me abordou com um problema interessante. Ele gostaria de rodar máquinas virtuais Windows sob KVM em seus servidores, onde o Ubuntu 18.04 já estava instalado.

No entanto, seus testes mostraram que o sistema de disco KVM decentemente ficou para trás dos indicadores que ele possuía no Hyper-V. Ele queria liberar o qemu em seus servidores Ubuntu para evitar a compra de licenças caras de servidor Windows (a versão gratuita do Microsoft Hyper-V Server não funcionou devido a suas limitações).

0. Disposição


Para o teste, usamos o SSD Samsung 970 Pro 1TB. O cliente verificou os resultados do trabalho no CrystalDiskMark, para mais adiante no artigo todos os gráficos dele.

Windows 10 LTSC
CPU Hyper-V 2

CPU KVM 2
O primeiro passo foi melhorar o desempenho aleatório de E / S. Esse tipo de carga é típico para máquinas virtuais, especialmente aquelas que usam vários bancos de dados.

O Ubuntu (16.04 LTS e 18.04) ainda usa o qemu versão 2.11. Portanto, alguns dos pães qemu mais recentes não são considerados neste artigo.

Decidimos que precisamos evitar amarrar o ferro a uma máquina virtual, pois isso complica a portabilidade das máquinas virtuais; portanto, as opções de lançamento de discos / partições SSD / físicas nas máquinas virtuais foram consideradas indesejáveis.

Sobre o tamanho do arquivo de teste para o CrystalDiskMark
, 100 4. , : , .

, , Windows . 100 4 , 40 .

, , 100-1. 4.

1. Usamos volumes LVM, não arquivos para armazenar discos de máquinas virtuais.


A lógica é essa. O arquivo com o disco virtual é armazenado no sistema de arquivos Linux, o NTFS está localizado dentro do próprio arquivo. Cada sistema de arquivos consome recursos durante as operações do disco. Portanto, quanto menor a profundidade da boneca, mais rápida será a entrada / saída.

Se falamos sobre arquivos qcow2, o nome deles significa “Qemu Copy-On-Write” e, de fato, eles têm sua própria tabela de tradução dentro da qual é responsável por quais blocos estão ocupados, quais não estão e onde está localizado.

A camada LVM consome significativamente menos recursos do processador que o sistema de arquivos. Uma das razões para isso é que os blocos nele são muito maiores que um bloco típico do sistema de arquivos (4KB). Quanto maior o bloco (extensão) no dispositivo LVM físico, mais rapidamente ocorre a IO e menor fragmentação.

Mas mesmo para E / S aleatória SSD é muito mais lenta que serial. Portanto, ao criar o Grupo de volumes, especificaremos uma extensão muito grande: 256MB.

A leitura antecipada de um volume lógico deve ser desativada, pois gasta IO sem vitória, pois agora ninguém está desfragmentando discos no Windows em SSDs.

O LVM é bastante conveniente para hospedar máquinas virtuais. Os volumes LVM são facilmente portáveis ​​entre discos físicos; há instantâneos e redimensionamentos online. Além disso, o virt-manager (libvirt) pode criar volumes lógicos imediatamente para discos de máquinas virtuais do grupo Volume.

A capacidade de criar volumes finos também parece atraente, mas, como um volume fino é uma camada adicional de abstração, é óbvio que isso prejudicará o desempenho de IO. Além disso, a libvirt não possui uma maneira elegante de criar automaticamente discos para máquinas virtuais em um pool fino.

#    SSD    (volume group)
pvcreate /dev/nvme1n1p1

#    win    (extent) 256.
vgcreate -s 256M win_pool /dev/nvme1n1p1

#    vm1.    C
lvcreate -n vm1 -L 100G win_pool

#      (read ahead)
lvchange -r none /dev/win_pool/vm1

1.1 Volume fino como um disco e / ou configurações de volume lógico para capturas instantâneas


Se você deseja usar um pool fino no qual criará volumes finos, faz sentido definir o tamanho do bloco para 4 MB, que é muito maior que o tamanho padrão de 64 KB.
O que implicará um trabalho mais rápido dessa camada de abstração.

O mecanismo de captura instantânea no LVM funciona quase no mesmo código que volumes finos, portanto, as configurações serão as mesmas para aumentar a velocidade da captura instantânea.

lvcreate -c 4m -L 300G -T -Zn win_pool/thin

A opção -Zndesativa a substituição do bloco com zeros ao realçar, o que aumenta a velocidade do trabalho.

Configurações para lvm.conf ou um arquivo semelhante (por exemplo, lvmlocal.conf):

thin_pool_chunk_size = 4096
thin_pool_zero = n

Você pode determinar o tamanho ideal do pedaço concluindo o teste com o seguinte comando, escolhendo o valor --blocksize:

fio --name=randwrite --filename=/dev/nvme0n1p9 --size=10G --ioengine=libaio --iodepth=1 --buffered=0 --direct=1 --rw=randwrite --blocksize=4m

Você pode visualizar o tamanho atual do pedaço com o comando

lvs -ao name,chunksize

2. Aumentar o número de processadores lógicos alocados para cada máquina virtual KVM melhora o desempenho do disco


10 CPU8 CPU4 CPU

Está claro que quase ninguém alocará 10 processadores para a máquina virtual, mas foi interessante observar o caso extremo.

Já depende do número de processadores livres. Na minha opinião, é inconveniente alocar mais de 4. Com o número de threads igual a 8, obtivemos o desempenho máximo de leitura e gravação aleatória. Essa é uma especificidade do CrystalDiskMark 6.0.2, na qual o segundo teste realiza 8 threads.

A partir do qual podemos concluir que é bom ter um processador lógico para cada tarefa que usa ativamente o IO.

3. Usamos páginas enormes de memória de acesso aleatório (páginas enormes) para evitar a degradação do desempenho devido à fragmentação da RAM


Este pacote pode ser útil quando precisamos de várias informações sobre páginas enormes durante a operação.

apt install hugepages

Editar /etc/default/grub:

GRUB_CMDLINE_LINUX="default_hugepagesz=1GB hugepagesz=1G hugepages=64"

Nesse caso, 64 GB de memória foram alocados para todas as máquinas virtuais como grandes páginas. No seu caso, pode haver menos / mais.

Aplicamos essas configurações ao GRUB para que, na próxima vez em que o sistema inicialize, elas se tornem ativas:

grub-mkconfig -o /boot/grub/grub.cfg

Editando a configuração da máquina virtual:

virsh edit vm_name

Adicionar:

<memoryBacking>
  <hugepages/>
</memoryBacking>

4. Adicione um fluxo dedicado a cada máquina virtual para atender às E / S


Você precisa adicionar o que está destacado em negrito. Usamos virsh, como no parágrafo anterior.

<iothreads>1</iothreads>

<disk type='block' device='disk'>
<driver name='qemu' type='raw' cache='none' io='threads' iothread='1'/>
<source dev='/dev/win/terminal'/>
<target dev='vda' bus='virtio'/>
<boot order='2'/>
<address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
</disk>


4.1. writeback


Para acelerar a gravação acidental no disco, mas com um risco maior de perda de dados, você pode usar cache=writebacko parágrafo anterior. Só pode ser usado se houver grande confiança na qualidade e no backup de energia e na presença de backups.

5. Configurações do subsistema de disco no Virt Manager


Barramento de disco: VirtIO
Formato de armazenamento: bruto
Modo de cache:
modo de E / S de write-back : threads

5.1 Configurando um Subsistema de Disco Através de um Arquivo de Configuração


O Qemu 2.11 (atualmente usado pelo Ubuntu) suporta dois tipos de dispositivos virtuais de disco: virtio-blk e virtio-scsi. Quando especificado no Virt Manager Disk bus: VirtIO, isso significa usar o dispositivo virtio-blk.

Em todos os casos, o virtio-blk é melhor em velocidade, apesar do fato de que na versão qemu testada ainda não era compatível com TRIM, diferentemente do virtio-scsi (ele já é suportado desde a versão 5.x ).

Do ponto de vista da velocidade de E / S do disco, o virtio-scsi só faz sentido em casos exóticos, por exemplo, quando você precisa conectar centenas de discos a uma máquina virtual.

6. Durante a instalação do Windows, instale o driver VirtIO


Caso contrário, o disco não estará disponível para o sistema operacional. Para fazer isso, use a imagem do driver, que pré-conectamos à máquina virtual.

7. Resultados após a aplicação de todos os ajustes


De fato, o tweak 4.1 não foi usado, pois eu não tinha certeza da confiabilidade da fonte de alimentação do cliente.

CPU Hyper-V 2

CPU KVM 2

CPU KVM 4

Você precisa entender que esses resultados têm uma certa convenção, pois cada vez que você inicia o CrystalDiskMark, os valores são ligeiramente diferentes.

KVM fora da caixa
2 CPU
KVM após ajustes
2 CPU

Vimos que foi possível acelerar significativamente o trabalho do subsistema de disco no qemu (kvm) com o mesmo número de núcleos. A escrita foi acelerada em média 58% e a leitura em 25%.

Principais elementos de sucesso : usando volumes LVM em vez de arquivos qcow2, E / S separadas e páginas enormes.

Direcione os erros observados para o PM. Eu aumento o carma por isso.

PS vhost-user-blk e vhost-user-nvme


Durante os experimentos, o Qemu 2.12 e a versão 3 também foram compilados. A opção vhost-user-blk para um disco foi testada.

No final, funcionou pior que o virtio-blk.


CPU vhost-user-blk 4

CPU virtio-blk 4

Para usar o vhost-user-nvme foi necessário corrigir o qemu, esta opção complicou a atualização automática de servidores em produção, para que não fosse testado.

PPS SPDK


A Intel projetou essa estrutura para alcançar excelentes indicadores de desempenho para sistemas de disco em máquinas virtuais que devem ser executadas em seus processadores.

Para fazer com que o spdk funcione bem, eles usam muitos truques - eles alocam kernels separados para ele, colocam os spdk e os kernels da máquina virtual em um soquete. Carregue a máquina virtual em uma parte contínua da memória. Se você aplicar essas medidas ao virtio-blk regular, ele também funcionará mais rápido.

O SPDK é capaz de trabalhar em três modos: vhost-user-scsi, vhost-user-blk e vhost-user-nvme. O segundo modo está disponível apenas no qemu a partir da 2.12, que ainda não está disponível no ubuntu. O modo vhost-user-nvme é geralmente mega-experimental - você precisa corrigir o qemu para isso. Atualmente, apenas a emulação scsi funciona e é lenta.

Há uma limitação mais séria para o modo vhost-user-scsi - o spdk não pode ser inicializado.
Certifique-se de que a opção bootindex = 2 Qemu seja dada ao dispositivo vhost-user-scsi-pci.
Os registros são definidos quando eles usam seu driver para compartilhar SSDs em vários dispositivos e encaminhá-los como vhost-user-nvme. A abordagem de perfuração de ferro não nos convinha.

A impressão era de que era normal usar o SPDK apenas com a implementação de discos lógicos (que é completamente diferente do lvm padrão). Esta é uma bicicleta fabricada com suas fotos e clonagem. As equipes são todas diferentes do LVM.

A dificuldade em configurar o SPDK, o suporte e a portabilidade de máquinas virtuais, bem como a conexão com os processadores Intel, se afastaram do uso.

Agradecimentos


Obrigado pela imagem TripletConcept . É melhor assistir em tamanho real em uma janela separada.

Para permissão para compartilhar materiais de trabalho -st_neon




Você pode solicitar uma máquina virtual com SSD da RUVDS para o cupom abaixo. Direcione os erros observados para o PM. Eu aumento o carma por isso.




All Articles