NFS ou 9p Virtio..., eis a questão

Amigos, como solicitado em nossos inúmeros e-mails, crio agora este post acerca de minha saga com a utilização de 9p Virtio ou NFS (Network File System) para compartilhamento de pastas entre Hospedeiro (Host) e Hospedado (Guest). Este tipo de compartilhamento é muito útil e largamente utilizado (por mim) no VirtualBox, devido a sua praticidade. Entretanto, confesso nunca ter analisado afinco sua performance. Nas últimas semanas a necessidade de utilização de compartilhamento de pastas com alto desempenho surgiu, e junto esta necessidade os problemas.

Em todos os testes que se seguem, o Hospedeiro foi o servidor do CEFALA. A pasta a ser compartilhada do Hospedeiro para uma VM foi a /home/backup_users. O Sistema Operacional de ambos é o Debian 8. O comando utilizado para obter a performance de gravação foi dd if=/dev/zero of=test count=100000 && rm test, variações de configuração neste comando alteram a performance observada, no entanto o percentual entre o desempenho do Hospedeiro e da pasta montada no Hospedado segue o mesmo. Para a coleta de resultados o comando será executado por cinco vezes e o último resultado será considerado (vale lembrar que a diferença entre os cinco é mínima).

Para a configuração do 9p Virtio a referência oficial do KVM/QEMU foi seguida, sendo realizada a configuração via Virt-Manager. Os parâmetros para compartilhamento foram Driver: Default e Modo: Mapped. O modo Mapped foi escolhido por preservar as permissões dos arquivos na pasta compartilhada. Entretanto, no Hospedeiro, a pasta compartilhada deverá ter como do o usuário dono o mesmo usuário que executa a VM que a montará, no caso libvirt-qemu. A pasta compartilhada no Hospedeiro está sob uma partição RAID 5, que tem a performance abaixo:

root@CEFALA:/home# dd if=/dev/zero of=test count=100000 && rm test
100000+0 records in
100000+0 records out
51200000 bytes (51 MB) copied, 0.196585 s, 260 MB/s

Na VM CEFALA-NFS, utilizada para os testes, a performance de acesso da em seu próprio sistema de arquivos (root) foi a seguinte:

root@NFS:/# dd if=/dev/zero of=test count=100000 && rm test
100000+0 registros de entrada
100000+0 registros de saída
51200000 bytes (51 MB) copiados, 0,190469 s, 269 MB/s

pode-se dizer que é igual a performance do sistema de arquivos onde encontra-se o arquivo imagem desta VM. Entretanto, ao montar na VM a pasta /home/backup_users compartilhada do Hospedeiro, a performance do 9p Virtio não segue o desempenho observado nos testes anteriores:

root@NFS:/mnt/backup_users# dd if=/dev/zero of=test count=100000 && rm test
100000+0 registros de entrada
100000+0 registros de saída
51200000 bytes (51 MB) copiados, 8,01939 s, 6,4 MB/s

Foram utilizadas diversas formas de montagem da pasta compartilhada, como por exemplo mount -t 9p -o trans=virtio,version=9p2000.L, que é uma orientação do manual oficial KVM/QEMU. Em todos os testes a performance se manteve a mesma.

Um teste comparativo foi realizado com o VirtualBox, neste a máquina utilizada foi um Laptop (laptop pessoal). O sistema de arquivos onde a imagem da VM Ubuntu está alocada tem o seguinte desempenho:

lopan@lopan:~# dd if=/dev/zero of=test count=100000 && rm test
100000+0 registros de entrada
100000+0 registros de saída
51200000 bytes (51 MB) copiados, 0,155031 s, 330 MB/s

na VM que foi executada pelo VirtualBox, seu sistema de arquivos tem um desempenho inferior ao observado no Hospedeiro, comportamento que não ocorre no KVM/QEMU:

root@lopan:/# dd if=/dev/zero of=test count=100000 && rm test
100000+0 registros de entrada
100000+0 registros de saída
51200000 bytes (51 MB) copiados, 0,379748 s, 135 MB/s

ainda que inferior em relação ao desempenho do Hospedeiro, trata-se de um desempenho razoável. No entanto, ao utilizar o mecanismo de compartilhamento de pasta do VirtualBox o desempenho do compartilhamento de pasta é parecido com o do KVM/QEMU, ridiculamente baixo:

root@lopan:/media/sf_tmp# dd if=/dev/zero of=test count=100000 && rm test
100000+0 registros de entrada
100000+0 registros de saída
51200000 bytes (51 MB) copiados, 9,26114 s, 5,5 MB/s

Diferentemente daquilo que foi visto em VirtFS - A virtualization aware File System pass-through, o desempenho observado com o NFS é muito maior que o 9p Virtio. No teste com o NFS a configuração do servidor obedeceu o indicado pelo Debian NFS Server Setup, e a montagem da partição foi configurada da seguinte forma (em /etc/fstab): 172.16.10.254:/mnt/backup/PPGEEMaster /mnt/backup nfs rw,async,nfsvers=3,rsize=65536,wsize=65536,timeo=5,retrans=4 0 0, sendo observado o seguinte desempenho:

root@ppgeemaster:/mnt/backup# dd if=/dev/zero of=test count=100000 && rm test
100000+0 registros de entrada
100000+0 registros de saída
51200000 bytes (51 MB) copiados, 0,263266 s, 194 MB/s

Meus amigos do CEFALA, os testes que foram executados podem e devem conter falhas! Do contrário não seria possível uma afirmação como a do artigo VirtFS - A virtualization aware File System pass-through. Apesar do desempenho do VirtualBox e KVM/QEMU serem parecidos, não creio que o KVM/QEMU deveria ficar tão abaixo do NFS (Network File System), visto as afirmações do artigo. Este post deve ser complementado à medida em que: (i) encontrarmos o problema e nivelarmos o desempenho em conformidade com o exposto no artigo; (ii) confirmar a baixa performance através de testes conclusivos, contradizendo assim o artigo.

Todas as configurações iniciais utilizadas foram sob orientações de manuais oficiais do Debian, KVM, entre outros. Pesquisas em fóruns foram realizadas e testes com diversas configurações e linhas de execução do comando mount foram utilizadas, em nada alterou o desempenho em relação ao percentual comparado entre os sistemas de arquivo de Hospedeiro e Hospedado.

Update (por Rafael): Excelente artigo, Arlindo. Eu escrevi alguns comentários sobre os testes acima em um outro artigo.

social