Назад | Перейти на главную страницу

Должен ли я использовать «обнаружение нулей» для поддержки TRIM / discard в гостевых системах QEMU?

До сих пор я включал отключение для моих гостей 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.