
Я создаю новую настройку для своих виртуальных машин и тестирую, какой метод хранения самый быстрый. Моя тестовая среда состоит из жесткого диска с 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 и размещение на нем файла образа raw
Команда:
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 МБ/с
Вопрос
Очевидно, что между этими двумя решениями есть разница, однако я ожидал, что устройство raw block будет по крайней мере таким же быстрым, как файл образа, поскольку не должно быть никаких накладных расходов на файловую систему хоста. Я предполагаю, что между файлом image происходит некоторое кэширование или параметры для raw block device не оптимальны. Почему raw LV медленнее в этом случае? Что я могу сделать, чтобы улучшить его производительность? Или если он просто должен быть медленнее, то почему?
EDIT: Я добавил третий тестовый случай, используя настройки из:http://www.linux-kvm.org/page/Настройка_KVM. Оказывается, немного быстрее, но все равно медленнее, чем образ файла. Я также заметил, что с каждым запуском для существующего файла он становится медленнее - однако фрагментация не должна происходить при перезаписи файла, поэтому я не уверен, почему это происходит.
решение1
Проблема может быть в несоответствии размера блока.
В идеале вы хотите, чтобы ваша файловая система соответствовала базовому размеру блока носителя. Хотя вы не поделились тем, что выбрали для размеров блоков, я думаю, у вас есть 4 килобайта для попытки Ext4 и 512 байт для LV. Если естественный размер блока вашего базового носителя составляет 4 килобайта, то я думаю, это объясняет как вашу проблему со скоростью, так и вашу уменьшающуюся скорость. Поскольку вы, возможно, записываете только 512 в блок 4k, вы тратите впустую 75% блока, и последующие записи будут использовать больше блоков, что приведет к большим накладным расходам и потерям.
Повторите тест с точно подобранным размером блока файловой системы, соответствующим размеру базового медиа-блока. В этом случае попробуйте использовать LV с размером блока 4k.
LVM добавляет немного больше накладных расходов, чем Ext4. Ответ на Stack Overflow Думаю, это объясняет, почему он немного медленнее. :)