Я запускаю 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 с ошибками, оба должны работать.
Нашел отличную презентацию Вот.
Уроки, извлеченные из презентации:
Для меня, хотя использование 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. И это то, что я могу найти в Интернете, говорит об использовании.