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

Qemu TRIM и сбросить на физическом SSD-устройстве

Я запускаю Windows 7 в Qemu / KVM с пропущенным графическим процессором, который я использую для работы. Недавно мне надоела его беспрецедентная медлительность из-за того, что он работает от механического диска, поэтому я добавил SSD в свой ящик, чтобы «отдать» свой Windows-KVM. Я использую следующие параметры командной строки qemu для «пропущенного» диска: -drive file=/dev/disk/by-id/wwn-0x5002538d4002d61f,if=none,id=drive-scsi0-0-0-0,format=raw,discard=on" \ -device virtio-scsi-pci,id=scsi0" \ -device scsi-hd,bus=scsi0.0,drive=drive-scsi0-0-0-0"

Я надеялся, что команды TRIM гостевой ОС действительно будут переданы на физический диск на хосте, но, похоже, это не так.

«Discard = on» влияет только на диски, поддерживаемые файлами изображений, а не на реальных физических SSD? Если да, то как я смогу выполнить команды TRIM для устройства в гостевой ОС, которые будут переданы на физическое устройство на хосте? Является ли использование файла изображения на хосте единственным решением? Я надеюсь на что-то лучшее, так как наличие файловой системы на этом диске только создаст накладные расходы, а мне она ни для чего другого не нужна.

Исследовательская работа

Кему лечит discard=unmap и discard=on тот же самый:

block.c (строка 773): } else if (!strcmp(mode, "on") || !strcmp(mode, "unmap")) {

Также кажется, что он поддерживает несколько Linux ioctl, как описано Вот для записи или отбрасывания нулей на уровне блока:

block / file-posix.c (строка 581): if (ioctl(s->fd, BLKDISCARDZEROES, &arg) == 0 && arg) {

block / file-posix.c (строка 1374): if (ioctl(aiocb->aio_fildes, BLKZEROOUT, range) == 0) {

block / file-posix.c (строка 1509): if (ioctl(aiocb->aio_fildes, BLKDISCARD, range) == 0) {

Поэтому, исходя из этого, блокируйте сквозную передачу с эмуляцией SCSI, используя параметры discard=unmap,detect-zeroes=unmap, если вы не используете старый тип машины Qemu или версию Qemu с ошибками, оба должны работать.

пример

Нашел отличную презентацию Вот.

Уроки, извлеченные из презентации:

  1. Вы должны запускать Qemu / KVM от имени пользователя root или пользователя с разрешением CAP_SYS_RAWIO, чтобы удаление не игнорировалось Linux.
  2. Если ваше сквозное устройство действительно является диском SCSI, оно должно обращать внимание на настоящие команды SCSI UNMAP и WRITE SAME, и вы можете использовать scsi-block для сквозной передачи.
  3. Если нет, вам придется эмулировать SCSI-диск с помощью scsi-hd, который будет отправлять команды сброса через Qemu на блочный уровень Linux.

Для меня, хотя использование scsi-block для сквозной передачи разрешало доступ к статистике и информации SMART для реального устройства, а обычный ввод-вывод работал нормально, команда discard не поддерживалась.

Поскольку мое резервное устройство на самом деле SATA, поэтому IDE, а не SCSI LUN, я предполагаю, что это причина отказа от поддержки таким образом.

При переключении с scsi-block на scsi-hd вы потеряете статистику и информацию SMART, но получите скидку ... так что компромисс.

Лично я не заметил заметного падения производительности при переходе от «истинного сквозного режима» к «эмуляции с сквозным сквозным подключением» для моих нужд.

Вот пример Virtio SCSI с эмулированным SCSI и устройством поддержки:

    -device virtio-scsi-pci,id=scsi \
    -blockdev driver=raw,node-name=disk.0,cache.direct=on,discard=unmap,file.driver=host_device,file.aio=native,file.filename=/dev/disk/by-id/ata-Samsung_SSD_840_PRO_Series_S12PNEAD233247L \
    -device scsi-hd,drive=disk.0,bus=scsi.0

Единственная часть, которую вы не найдете в документации Qemu, - это file.driver=host_device раздел ... он необходим для работы scsi-block и, похоже, не повредит scsi-hd, когда мы используем реальное блочное устройство, а не файл в файловой системе хоста.

Тест

Инструмент blktrace, который я использовал для тестирования вызовов функций блочного уровня Linux, задокументирован. Вот.

Вы можете запускать программы blktrace и blkparse вместе, чтобы перехватывать вызовы сброса:

blktrace -a discard -d /dev/disk/by-id/ata-Samsung_SSD_840_PRO_Series_S12PNEAD233247L -o - | blkparse -i -

Теперь, когда ты бежишь defrag /L c: или fstrim -v / в вашей виртуальной машине вы увидите, что на хосте печатается множество сбросов .. пример фрагмента вывода:

    8,0    1      493     0.641661863  3118  Q  DS 45458024 + 728 [qemu-system-x86]
    8,0    1      494     0.641664662  3118  G  DS 45458024 + 728 [qemu-system-x86]
    8,0    1      495     0.641665920  3118  I  DS 45458024 + 728 [qemu-system-x86]
    8,0    1      496     0.641669312  3118  D  DS 45458024 + 728 [qemu-system-x86]

Так что для меня это достаточное доказательство того, что discard работает.

Я не знаю discard=on должен работать. у меня есть discard=unmap во всех моих командных строках qemu. И это то, что я могу найти в Интернете, говорит об использовании.