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

Невероятно низкая производительность KVM-диска (дисковые файлы qcow2 + virtio)

У меня серьезные проблемы с производительностью диска при настройке гостевой системы KVM. Используя простой dd test, раздел на хосте, на котором находятся образы qcow2 (зеркальный RAID-массив), записывает более 120 МБ / с, а мой гость получает письма от От 0,5 до 3 МБ / с.

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

Обновление 1

И вдруг, когда я вернусь и попробую сейчас, это 26,6 МБ / с; это больше похоже на то, что я ожидал от qcrow2. Я оставлю вопрос на тот случай, если у кого-то есть идеи относительно того, в чем могла быть проблема (и в случае, если она таинственным образом вернется снова).

Обновление 2

Я перестал беспокоиться о производительности qcow2 и просто переключился на LVM поверх RAID1 с необработанными образами, все еще используя virtio, но установив cache = 'none' и io = 'native' на диске. Производительность записи теперь прибл. 135 МБ / с используя тот же базовый тест, что и выше, поэтому, похоже, нет особого смысла выяснять, в чем была проблема, когда ее можно так легко решить полностью.

Ну да, файлы qcow2 не предназначены для невероятно высокой производительности. Вам больше повезет с необработанными разделами (или, желательно, с LV).

Как добиться максимальная производительность с QCOW2:

qemu-img create -f qcow2 -o preallocation=metadata,compat=1.1,lazy_refcounts=on imageXYZ

Самым важным из них является предварительное выделение ресурсов, которое, по словам разработчиков qcow2, дает хороший импульс. Это почти наравне с LVM сейчас! Обратите внимание, что это обычно включено в современных (Fedora 25+) дистрибутивах Linux.

Также вы можете предоставить небезопасный кеш, если это не производственный экземпляр (это опасно и не рекомендуется, полезно только для тестирования):

<driver name='qemu' cache='unsafe' />

Некоторые пользователи сообщают, что в некоторых тестах эта конфигурация превосходит LVM / небезопасную конфигурацию.

По всем этим параметрам последняя версия QEMU 1.5+ необходимо! Опять же, они есть в большинстве современных дистрибутивов.

Я добился отличных результатов для изображения qcow2 с этой настройкой:

<driver name='qemu' type='raw' cache='none' io='native'/>

который отключает гостевые кеши и включает AIO (асинхронный ввод-вывод). Запуск вашего dd команда дала мне 177 МБ / с на хосте и 155 МБ / с на гостевом компьютере. Образ размещается на том же томе LVM, на котором проводился тест хоста.

Мой qemu-kvm версия 1.0+noroms-0ubuntu14.8 и ядро 3.2.0-41-generic из запаса Ubuntu 12.04.2 LTS.

В старых версиях Qemu / KVM бэкэнд Qcow2 работал очень медленно, когда не был предварительно выделен, тем более, если он использовался без включенного кеша обратной записи. Смотрите здесь для получения дополнительной информации.

В более поздних версиях Qemu файлы Qcow2 работают намного быстрее, даже если не используется предварительное выделение (или предварительное выделение только метаданных). Тем не менее, объемы LVM остаются быстрее.

Замечание о режимах кеширования: обратная запись cache является предпочтительным режимом, если только не используется гость без или отключенной поддержки сброса / барьеров дискового кеша. На практике гостевые системы Win2000 + и любые варианты монтирования Linux EXT4, XFS или EXT3 + через барьер - это штраф. С другой стороны, cache = unsafe должно никогда использоваться на производственных машинах, так как очистка кеша не распространяется на хост-систему. Неожиданное завершение работы хоста может буквально разрушить файловую систему гостя.

У меня возникла точно такая же проблема. В виртуальной машине RHEL7 у меня есть целевое программное обеспечение LIO iSCSI, к которому подключаются другие машины. В качестве базового хранилища (backstore) для моих iSCSI LUN я сначала использовал LVM, но затем переключился на образы на основе файлов.

Короче говоря: когда резервное хранилище подключено к контроллеру хранилища virtio_blk (vda, vdb и т. Д.) - производительность от клиента iSCSI, подключенного к цели iSCSI, была в моей среде ~ 20 IOPS, с пропускной способностью (в зависимости от размера IO) ~ 2- 3 МБ / с. Я изменил контроллер виртуального диска на виртуальной машине на SCSI, и теперь я могу получить более 1000 операций ввода-вывода в секунду и пропускную способность 100+ МБ / с от моих клиентов iSCSI.

<disk type='file' device='disk'>
   <driver name='qemu' type='qcow2' cache='none' io='native'/>
   <source file='/var/lib/libvirt/images/station1/station1-iscsi1-lun.img'/>
   <target dev='sda' bus='scsi'/>
   <address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>

Если вы запускаете виртуальную машину с помощью одной команды, в качестве аргументов вы можете использовать

kvm -drive file = / path_to.qcow2, if = virtio, cache = off <...>

У меня получилось с 3 МБ / с до 70 МБ / с.