Я создаю новую настройку для своих виртуальных машин и проверяю, какой метод хранения самый быстрый. Моя тестовая среда состоит из жесткого диска с LVM на LUKS. Я создал один LV для диска виртуальной машины и повторно использовал его для обоих тестов, чтобы поддерживать одинаковое место на жестком диске для обеспечения постоянной производительности (скорость чтения / записи жесткого диска зависит от физического положения).
- Ведущий: Arch Linux, ядро 4.12.8
- Гость: Ubuntu Desktop 17.04
Производительность проверена командой:
dd if=/dev/zero of=test bs=16M count=100 conv=sync
Первый тест: использование LV непосредственно в качестве диска виртуальной машины
Команда:
qemu-system-x86_64 \
-drive format=raw,file=/dev/mapper/vg_vm-lv_vm_test,if=virtio,aio=native,cache.direct=on \
-net nic,model=virtio \
-net user \
-vga virtio \
-display gtk,gl=on \
-smp 3 \
-cpu host \
-machine type=pc,accel=kvm \
-m 3G
Результаты (каждое значение представляет один прогон):
- Создание нового файла: 98,4 МБ / с; 112 МБ / с
- Запись в существующий файл: 62,5 МБ / с; 68,7 МБ / с; 64,8 МБ / с
Второй тест: создание ext4 на LV и помещение файла с необработанным изображением
Команда:
qemu-system-x86_64 \
-drive format=raw,file=./ubuntu_17,if=virtio,aio=native,cache.direct=on \
-net nic,model=virtio \
-net user \
-vga virtio \
-display gtk,gl=on \
-smp 3 \
-cpu host \
-machine type=pc,accel=kvm \
-m 3G
Результаты (каждое значение представляет один прогон):
- Создание нового файла: 254 МБ / с; 242 МБ / с
- Запись в существующий файл: 187 МБ / с; 189 МБ / с; 190 МБ / с
Третий тест: использование LV непосредственно в качестве диска виртуальной машины, различные настройки
Команда:
qemu-system-x86_64 \
-drive format=raw,file=/dev/mapper/vg_vm-lv_vm_test,if=virtio,cache=none \
-net nic,model=virtio \
-net user \
-vga virtio \
-display gtk,gl=on \
-smp 3 \
-cpu host \
-machine type=pc,accel=kvm \
-m 3G
Результаты (каждое значение представляет один прогон):
- Создание нового файла: 129 МБ / с; 125 МБ / с
- Запись в существующий файл: 103 МБ / с; 97 МБ / с; 81,9 МБ / с
Вопрос
Ясно, что между этими двумя решениями есть разница, однако я ожидал, что необработанное блочное устройство будет, по крайней мере, так же быстро, как файл образа, потому что не должно быть никаких накладных расходов на файловую систему хоста. Я полагаю, что некоторое промежуточное кэширование происходит для образа файла или параметры для необработанного блочного устройства не оптимальны. Почему сырой ЛЖ медленнее в этом случае? Что я могу сделать, чтобы улучшить его производительность? Или если это должно быть медленнее, то почему?
РЕДАКТИРОВАТЬ: я добавил третий тестовый пример, используя настройки: http://www.linux-kvm.org/page/Tuning_KVM. Оказывается немного быстрее, но все же медленнее, чем изображение файла. Я также заметил, что с каждым запуском для существующего файла он становится медленнее - однако фрагментации не должно происходить при перезаписи файла, поэтому я не уверен, почему это происходит.