À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.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.
pvcreate /dev/nvme1n1p1
vgcreate -s 256M win_pool /dev/nvme1n1p1
lvcreate -n vm1 -L 100G win_pool
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 -Zn
desativa 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 comandolvs -ao name,chunksize
2. Aumentar o número de processadores lógicos alocados para cada máquina virtual KVM melhora o desempenho do disco
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=writeback
o 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.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.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.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.