我应该在 QEMU 来宾上使用“检测零”来支持 TRIM/丢弃吗?

MrC*_*vin 1 libvirt qemu kvm-virtualization

到目前为止,我已经使用 libvirt XML 命令在 QEMU 来宾上启用了丢弃功能

..
<driver name='qemu' type='qcow2' discard='unmap' />
..
Run Code Online (Sandbox Code Playgroud)

而且看起来效果很好。

现在我即将将我的存储从 转换virtio-scsivirtio-blk因为它现在支持丢弃,我遇到了该选项detect_zeroes=off|on|unmap(或 QEMU 等效项detect-zeroes

我也应该使用这个选项吗?为什么?我假设除了这些区域将被丢弃标记为“可用”之外,它们也被写入零,但它有什么值,特别是在 SSD 支持的存储上?

使用 qcow2 图像我看到写入零来标记稀疏的空白空间的意义,但如果没有此选项并且仅使用discard='unmap'.

libvirt 文档说:

可选的 detector_zeroes 属性控制是否检测零写入请求。该值可以是“off”、“on”或“unmap”。前两个值分别关闭和打开检测。第三个值(“unmap”)打开检测,并根据上面的丢弃值尝试从图像中丢弃这些区域(如果丢弃设置为“忽略”,它将充当“打开”)。注意,启用检测是一项计算密集型操作,但可以节省慢速媒体上的文件空间和/或时间。从2.0.0开始

不幸的是,这并没有让我更接近使用或不使用的决定detect_zeroes:-/

我的 QEMU 来宾的后备存储是 HDD 和 SSD 上的 qcow2 映像以及 SSD 上的 LVM 块设备。

Mic*_*ton 5

现代操作系统能够向虚拟存储发送 TRIM/UNMAP 命令以释放空间,因此detect_zeroes对于此类操作系统来说不是必需的。

我能想到使用的唯一原因detect_zeroes是获得对不支持 TRIM/UNMAP 的古老操作系统的丢弃支持。detect_zeroes='unmap'在这种情况下,当您设置而不是将零块写入磁盘时,零块将被取消映射。在虚拟客户操作系统中,您将运行一些实用程序,将零写入磁盘上的所有可用空间,并且 KVM 会将这些转换为 TRIM/UNMAP。但这可能是 CPU 密集型的。另外,我想不出有什么充分的理由不使用onunmap


PS 你说:“现在我要把我的存储从 转换virtio-scsivirtio-blk”......你把这些向后了吗?通常您会从 转换virtio-blkvirtio-scsi