在Linux上加速Qemu KVM磁盘子系统



有时,我会执行各种设置服务器的任务。不久前,一家小型托管公司的所有者向我提出了一个有趣的问题。他希望在已安装Ubuntu 18.04的服务器上的KVM下运行Windows虚拟机。

但是,他的测试表明,KVM磁盘系统明显落后于他在Hyper-V下的性能指标。他想在自己的Ubuntu服务器上释放qemu,以避免购买昂贵的Windows服务器许可证(由于受限,Microsoft Hyper-V Server的免费版本无法使用)。

0.处置


为了进行测试,我们使用了三星970 Pro 1TB SSD。客户检查了CrystalDiskMark中的工作结果,因此在本文中进一步介绍了其中的所有图表。

Windows 10 LTSCHyper-V
2 CPU
KVM
2 CPU
第一步是提高随机I / O性能。这种类型的负载对于虚拟机是很典型的,尤其是那些使用各种数据库的虚拟机。

Ubuntu(16.04 LTS和18.04)仍使用qemu版本2.11。因此,本文不考虑一些最新的qemu包子。

我们决定避免将铁绑在虚拟机上,因为这会使虚拟机的可移植性变得复杂,因此将SSD /物理磁盘/分区丢入虚拟机的选项被认为是不可取的。

关于CrystalDiskMark的测试文件大小
, 100 4. , : , .

, , Windows . 100 4 , 40 .

, , 100-1. 4.

1.我们使用LVM卷,而不是用于存储虚拟机磁盘的文件。


逻辑是这样。带有虚拟磁盘的文件存储在Linux文件系统中,NTFS位于文件本身内部。每个文件系统在磁盘操作期间都会消耗资源。因此,玩偶的深度越小,输入/输出越快。

如果我们谈论qcow2文件,它们的名称代表“ Qemu写时复制”,实际上,它们具有自己的转换表,该转换表负责哪些块忙,哪些块不忙以及位于何处。

LVM层比文件系统消耗的处理器资源少得多。原因之一是其中的块比典型的文件系统块(4KB)大得多。物理LVM设备上的块(范围)越大,IO发生得越快,碎片越少。

但是,即使是SSD随机I / O也要比串行速度慢得多。因此,在创建卷组时,我们将指定很大的范围:256MB。

应该关闭逻辑卷上的预读,因为它花费了IO而不花钱,因为现在没有人对Windows上的SSD上的磁盘进行碎片整理。

LVM用于托管虚拟机非常方便。 LVM卷可以在物理磁盘之间轻松移植;具有快照并可以在线调整大小。此外,virt-manager(libvirt)可以为Volume组中的虚拟机磁盘开箱即用地创建逻辑卷。

创建精简卷的功能看起来也很吸引人,但是鉴于精简卷是附加的抽象层,很明显,它将降低IO性能。此外,libvirt还没有一种优雅的方法来自动为精简池中的虚拟机创建磁盘。

#    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。精简卷作为磁盘和/或快照的逻辑卷设置


如果要使用要在其中创建精简卷的精简池,则有必要将池的块大小设置为4MB,这比默认大小64KB大得多。
这将需要更快地进行此抽象层的工作。

LVM中的快照机制几乎与精简卷在相同的代码上工作,因此设置相同以提高快照速度。

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

该选项-Zn禁用突出显示时用零覆盖的块,从而提高了工作速度。

lvm.conf或类似文件(例如lvmlocal.conf)的设置:

thin_pool_chunk_size = 4096
thin_pool_zero = n

您可以通过使用以下命令完成测试并选择值来确定块的最佳大小--blocksize

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

您可以使用以下命令查看块的当前大小:

lvs -ao name,chunksize

2.增加分配给每个KVM虚拟机的逻辑处理器的数量可以提高磁盘性能


10个CPU8个CPU4个CPU

显然,几乎没有人会为虚拟机分配10个处理器,但是看看极端情况很有趣。

它已经取决于空闲处理器的数量。我认为分配大于4的值是不合适的。在线程数等于8的情况下,我们获得了最大的随机读写性能。这是CrystalDiskMark 6.0.2的特性,其中第二项测试执行8个线程。

从中可以得出结论,对于每个主动使用IO的任务,最好有一个逻辑处理器。

3.我们使用大页面的随机存取存储器(hugepages)以避免由于RAM碎片而导致性能下降


当我们在操作过程中需要有关大页面的各种信息时,此包可以派上用场。

apt install hugepages

编辑/etc/default/grub

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

在这种情况下,为所有虚拟机分配了64GB的内存作为大页。根据您的情况,可能会更少/更多。

我们将这些设置应用于GRUB,以便下次系统启动时,它们将变为活动状态:

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

编辑虚拟机配置:

virsh edit vm_name

加:

<memoryBacking>
  <hugepages/>
</memoryBacking>

4.向每个虚拟机添加专用流以服务IO


您需要添加以粗体突出显示的内容。virsh与上段一样,我们使用

<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


要加快意外写入磁盘的速度,但会增加数据丢失的风险,可以使用cache=writeback上一段。仅在对电源的质量和备用以及存在备用非常有信心的情况下才能使用它。

5. Virt Manager中的磁盘子系统设置


磁盘总线:VirtIO
存储格式:原始
高速缓存模式:回写
IO模式:线程

5.1。通过配置文件配置磁盘子系统


Qemu 2.11(当前由Ubuntu使用)支持两种类型的磁盘虚拟设备:virtio-blk和virtio-scsi。在Virt Manager中指定时Disk bus: VirtIO,这意味着使用virtio-blk设备。

在所有情况下,virtio-blk的速度都更好,尽管事实是,在经过测试的qemu版本中,它仍然不支持TRIM,这与virtio-scsi不同(从5.x版本开始就已经支持它)。

在磁盘IO速度方面,virtio-scsi仅在特殊情况下才有意义,例如,当您需要将数百个磁盘连接到虚拟机时。

6.在Windows安装过程中,安装VirtIO驱动程序


否则,该磁盘将无法用于操作系统。为此,请使用我们预连接到虚拟机的驱动程序映像。

7.应用所有调整后的结果


实际上,未使用调整4.1,因为我不确定来自客户端的电源的可靠性。
Hyper-V
2 CPU
KVM
2 CPU
KVM
4 CPU

您需要了解这些结果具有一定的约定,因为每次启动CrystalDiskMark时,这些值都会略有不同。

开箱即用的KVM
2 CPU
调整
2个CPU 后的KVM

我们看到,在内核数量相同的情况下,可以大大加快qemu(kvm)中磁盘子系统的工作。写作速度平均提高了58%,阅读速度提高了25%。

成功的关键要素:使用LVM卷代替qcow2文件,单独的I / O和大页面。

将发现的错误定向到PM。我为此增加业力。

PS vhost-用户-blk和vhost-用户-nvme


在实验过程中,还编译了Qemu 2.12和版本3。已测试磁盘的vhost-user-blk选项。

最后,它比virtio-blk更糟。

vhost-user-blk
4个CPU
virtio-blk
4 CPU

要使用vhost-user-nvme,有必要修补qemu,此选项使生产中服务器的自动更新变得复杂,因此未经测试。

PPS SPDK


英特尔设计了该框架,以实现应在其处理器上运行的虚拟机中磁盘系统的出色性能指标。

为了使spdk正常工作,他们花了很多技巧-他们为它分配了单独的内核,将spdk和虚拟机内核放置在一个套接字中。将虚拟机加载到连续的内存块中。如果您对常规的virtio-blk应用此类措施,那么它也将更快地工作。

SPDK能够以3种模式工作:vhost-user-scsi,vhost-user-blk和vhost-user-nvme。第二种模式仅在2.12版的qemu中可用,而在ubuntu中尚不可用。 vhost-user-nvme模式通常是大型实验-您需要为此修补qemu。当前,仅scs​​i仿真有效,并且速度很慢。

vhost-user-scsi模式还有一个更严重的限制-spdk无法启动。
确保为vhost-user-scsi-pci设备提供了bootindex = 2 Qemu选项。
当记录使用它们的驱动程序在多个设备上共享SSD并将其作为vhost-user-nvme转发时,便会设置记录。穿铁方法不适合我们。

给人的印象是,仅将SPDK与逻辑磁盘一起使用才是正常的(这与标准的lvm完全不同)。这是一辆带有图片和克隆的自制自行车。团队都不同于LVM。

配置SPDK的困难,虚拟机的支持和可移植性以及与Intel处理器的连接,使它不再使用它。

致谢


感谢您的图像TripletConcept最好在单独的窗口中观看完整尺寸的影片。

允许共享工作材料-st_neon




您可以从RUVDS订购具有SSD的虚拟机,以获取下面的优惠券。将发现的错误定向到PM。我为此增加业力。




All Articles