我有一台相对较小的服务器,配备四核 CPU(Intel i5-7400)和 16 GB RAM(DDR4),使用 运行几个虚拟化客户机libvirt
。我不是使用任何其他中间层,例如 Proxmox。使用的操作系统大约 90% 为 Linux、5% 为 macOS(Mojave 及更高版本)和 5% 为 Windows(2016 年 10 月)。我从不在 Linux 上使用桌面环境。主机(Ubuntu Bionic)使用带有 raidz1 配置的 ZFS 来存储虚拟磁盘文件。创建客户机时,我总是使用virt-install
正确的--os-variant
标志。
为了全部客人的磁盘性能非常低,写入速度几乎达不到 10 MB/s(甚至使用 VirtIO 驱动程序)。无论虚拟磁盘类型如何,都会发生这种情况;QCOW2、原始、具有 4k 簇大小的 QCOW2 和完全预分配的 QCOW2 磁盘都存在相同的问题。当将大约 200 MB 写入文件时,客户机就会锁定,我必须在按 Ctrl+C 执行命令后等待几分钟才能再次使用。在做了进一步的研究/测试后,我发现writeback
缓存模式显著提高了性能,至少对于 Linux 客户机而言。不再有锁定,他们甚至可以在几秒钟内将 1 GB 写入文件,即使在 SATA 总线上使用全新的稀疏/薄 QCOW2 磁盘也是如此。
然而,GUI 客户端的启动时间仍然非常慢,当它们最终启动时,它们几乎无法使用(鼠标指针移动或许每 5 秒仅一次,键盘输入是严重延迟,打开应用程序需要很长时间等)。我可以等一个小时让 Windows 启动,它仍然会停留在黑色启动屏幕上,Windows 徽标和下面的加载图标,即使我在实际安装 Windows 之前设法安装了 VirtIO 驱动程序。MacOS 通常会在 30 分钟左右后启动,但那是使用 SATA 总线,因为我甚至无法安装 VirtIO 驱动程序。Linux 客户机在几秒钟的事,以供比较。
对于 macOS,我曾经设法从自己的计算机通过 SSH 进入它并从那里运行磁盘速度测试,即使使用writeback
缓存模式,它的写入速度也几乎达不到 10 MB/s。
即使 macOS 是仅有的客户机当前正在运行,所以我不认为这是 CPU 或 RAM 的瓶颈。无论如何,内存不会过度使用,因为根据我的经验,这只会导致问题。我尝试为客户机提供双核和四核 vCPU,没有明显的变化。此外,完整的qemu-system-*
命令行正确包含-kvm
标志,因此它不是纯粹在软件中进行虚拟化。
这可能是某个地方的一些愚蠢的配置问题,因为即使在我使用 ESXi 的古老的虚拟化设备(摇摆 DDR2 内存)上,我也可以在合理的时间内启动 Windows 7 客户机。
答案1
经过大量的尝试,发现了一些有用/有趣的东西。
zfs set atime=off <dataset>
最初为 启用了该选项mypool/rootfs
,顾名思义,它代表我的主机操作系统的根目录。VM 文件存储在不同的数据集 ( mypool/vm
) 下,该数据集的选项已经为off
,但挂载点仍在 rootfs ( /vm
) 下。我还有大约 10 个与两者无关的其他数据集,并且该选项off
也适用于所有这些数据集。无论如何,我并不真正关心访问时间,所以我决定将所有内容更改为off
。
zfs set xattr=sa <dataset>
所有数据集均已设置on
为此项,这显然意味着扩展属性存储在隐藏子目录中,而不是 inode 中,从而导致额外的 IO。我知道此更改仅影响创建的文件(或据我所知,修改的文件) 后事实,但它似乎是为 Linux 上的 ZFS 推荐/设计的,所以无论如何我都必须更改它。
由于虚拟磁盘文件实际上在操作系统写入日志文件时被修改,因此这应该会产生某种明显的影响。我继续打开 Mac VM 并启动常规启动(因此不是恢复模式或单用户模式),仅 10 分 54 秒后,我就看到了登录屏幕。登录后我可以正常使用操作系统。鼠标指针移动 2 个像素不需要 5 秒钟,而是几乎是实时的。如果我快速拖动一些窗口,它们就会变得有点不连贯,但这显然是因为libvirt
客户控制台不是那么快。当我使用物理 Mac 的Screen Sharing
客户端时,即使是快速拖动也会非常流畅地呈现。默认屏幕保护程序也是如此;它有点块状,但没有延迟/帧丢失。
注意:以上所有操作均已完成当我的“标准”Linux客户端都在运行(其中 8 个)。与之前不同的是,我甚至可以dd
在 macOS 中写入 10 GB 的文件而不会锁定 VM,这需要大约 23 秒才能写入(466226214 字节/秒或 444.63 MiB/s)。Mac 客户机目前具有双核 CPU 和 4 GB RAM。
尽管如此,Windows 仍然进展缓慢。它甚至花了 55 分 1 秒才显示登录屏幕背景,又花了 4 分 18 秒才显示密码输入框。但登录后的体验与 macOS 相同甚至更好。Awinsat disk -drive c
分别显示顺序读取和写入速度为 778.95 和 742.12 MB/s。
所以我决定尝试一个更冒险的设置:
zfs set sync=disabled mypool/vm
当然,默认设置是standard
。我发现Proxmox 的来源pveperf
并决定对这两个值运行它sync
,并特别检查 fsync 性能:
standard
:勉强达到 50 fsync/sdisabled
:高达 36138 fsync/s(这是可以预料到的)
当它处于 时disabled
,macOS VM 现在需要大约 2 分钟才能完成初始启动过程(带有加载栏的 Apple 徽标),然而它停留在黑屏上 10 多分钟,然后才最终显示登录窗口。这实际上是慢点而不是standard
,所以我将其翻转回那一点。
看起来我还没有完全挖掘完毕,所以让我们尝试重新启动整个主机,让 2 个zfs set
标志也对一堆主机文件生效(通过修改它们)。现在这似乎已经影响颇大:
- Mac:登录窗口弹出 47 秒,10 秒后关闭
- Windows:登录窗口需要 58 秒,13 秒后关闭
这些启动时间完全可以接受,尤其是考虑到存储是由老式的旧硬盘组成的。每次我对任一虚拟机进行冷启动时,我都可以可靠地重现大约一分钟的启动时间。
是的,只需在开始时设置这 2 个 ZFS 属性和writeback
缓存模式qemu
,即可节省大量时间。=]