До сих пор я включал отключение для моих гостей QEMU с помощью команды libvirt XML
..
<driver name='qemu' type='qcow2' discard='unmap' />
..
И вроде нормально работает.
Теперь, когда я собираюсь преобразовать свое хранилище с virtio-scsi
к virtio-blk
поскольку теперь он поддерживает отмену, я столкнулся с опцией detect_zeroes=off|on|unmap
(или эквивалент QEMUs detect-zeroes
)
Стоит ли мне также использовать эту опцию и почему? Я предполагаю, что рядом с областями, которые будут отмечены как "доступные", они также будут записаны нулями, но какие значения у них, особенно в хранилище с поддержкой SSD?
Используя изображения qcow2, я вижу смысл писать нули, чтобы отметить разреженное пустое пространство, но кажется, что файлы изображений qcow2 на самом деле становятся меньше (разрежены) без этой опции и просто используют discard='unmap'
.
В документации libvirt говорится:
Необязательный атрибут detect_zeroes определяет, следует ли обнаруживать нулевые запросы на запись. Значение может быть «выключено», «включено» или «отключено». Первые два значения отключают и включают обнаружение соответственно. Третье значение («unmap») включает обнаружение и дополнительно пытается отбросить такие области из изображения на основе значения discard выше (оно будет действовать как «on», если для discard установлено «ignore»). Обратите внимание: включение обнаружения - это операция с интенсивными вычислениями, но она может сэкономить файловое пространство и / или время на медленных носителях. Начиная с 2.0.0
Что, к сожалению, не приблизило меня к решению использовать detect_zeroes
или не :-/
Резервное хранилище для моих гостей QEMU - это образы qcow2 на жестком диске и SSD, а также блочные устройства LVM, расположенные на SSD.
Современные операционные системы могут отправлять команды TRIM / UNMAP в виртуальное хранилище, чтобы освободить место, поэтому detect_zeroes
для таких ОС не нужен.
Единственная причина, по которой я могу использовать detect_zeroes
заключается в отказе от поддержки устаревшей операционной системы, не поддерживающей TRIM / UNMAP. В этом случае блоки нулей не будут отображены, когда вы установите detect_zeroes='unmap'
вместо записи на диск блоков нулей. В виртуальной гостевой ОС вы должны запустить некоторую утилиту, которая записывает нули во все свободное пространство на диске, и KVM преобразует их в TRIM / UNMAP. Однако это может потребовать больших ресурсов процессора. Кроме того, я не могу придумать веской причины для этого on
без unmap
.
P.S. Вы сказали: "Теперь, когда я собираюсь преобразовать свое хранилище из virtio-scsi
к virtio-blk
"... Вы получили это в обратном порядке? Обычно вы конвертируете из virtio-blk
к virtio-scsi
.