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

Чрезвычайно медленный дисковый ввод-вывод в qemu-kvm VM

У меня есть виртуальная машина под управлением Debian Woody (ядро 2.4.18). Qemu-2.1.2, 2 ядра процессора, 512 МБ ОЗУ, образ qcow2, подключенный как IDE, ext3. Проблема в том, что дисковый ввод-вывод выполняется медленно. Вот результат dd "бенчмарка" сразу после перезагрузки ВМ:

(none):~# time dd if=/dev/zero of=test1 bs=102400 count=100
100+0 records in
100+0 records out

real    0m0.035s
user    0m0.000s
sys 0m0.020s
(none):~# time dd if=/dev/zero of=test1 bs=102400 count=100
100+0 records in
100+0 records out

real    0m0.022s
user    0m0.000s
sys 0m0.020s
(none):~# time dd if=/dev/zero of=test1 bs=102400 count=100
100+0 records in
100+0 records out

real    0m55.589s
user    0m0.020s
sys 0m0.560s

Если я посмотрю, что происходит на хосте, я вижу, что процесс qemu потребляет ~ 90% ЦП (из общего числа 600%), а чтение и запись составляет около 1,2 МБ / с. Сам HDD в порядке, скорость записи около 70МБ / с. Я пробовал различные настройки виртуальной машины (включая «потоки» и «usafe»), преобразовывал изображение в необработанное, перемещал изображение в свежеформатированную файловую систему (пробовал ext4 и btrfs). Никакой видимой разницы.

Я также заметил проблемы со скоростью ввода-вывода для других виртуальных машин с более свежими ядрами, но у меня не было достаточно времени, чтобы хорошо их протестировать, и я использовал монтирование NFS, чтобы обойти проблему.

Что здесь не так?

UPD Четный mount -t nfs ... зависает. strace Говорит, что mount() вызов сам замирает:

mount("192.168.1.1:/mnt/gw/tmp", "/mnt", "nfs", 0xc0ed0000, 0x805a920) = -1 ENOSYS (Function not implemented)
mount("192.168.1.1:/mnt/gw/tmp", "/mnt", "nfs", 0xc0ed0000, 0x805a920) = -1 ENOSYS (Function not implemented)
mount("192.168.1.1:/mnt/gw/tmp", "/mnt", "nfs", 0xc0ed0000, 0x805a920) = -1 ENOSYS (Function not implemented)
mount("192.168.1.1:/mnt/gw/tmp", "/mnt", "nfs", 0xc0ed0000, 0x805a920[here it freezes for a several minutes]) = 0

Я все равно собирался это сделать, поэтому сделал несколько установок.

По умолчанию устройства в стиле IDE в этой настройке, похоже, работают со скоростью режима PIO, хотя haparm заявляет о DMA ... выполнение этого внутри виртуальной машины делает его примерно в 70 раз быстрее на моей машине.

hdparm -d1 /dev/hda
echo hdparm -d1 /dev/hda > /etc/rcS.d/S00hdparm.sh
chmod +x /etc/rcS.d/S00hdparm.sh

Другой вариант - использовать эмуляцию диска SCSI, в командной строке qemu замените это

-hda $DISK

с этим

-drive if=scsi,file=$DISK

дает эмуляцию устройства, совместимого с "sym53c8xx", которую программа установки определяет автоматически. Это дает хороший эффект: устройство будет называться «/ dev / sda», а не «/ dev / hda» в старом стиле.

Но будьте осторожны, переключить это на уже установленную систему непросто.

Примечание: использование ahci не сработает; Debian Woody появился раньше SATA.

PS: Мой дымовой тест на совместимость кажется в основном успешно, всего пара тупых флагов GCC. Удачи с твоей.

Я использую kvm с libvirt, используя небезопасные настройки и потоки для ввода-вывода, которые делают виртуальную машину действительно быстрой, конечно, небезопасно означает использовать НЕ в производстве. Для формата я использую raw без lvm