
Ich erstelle ein neues Setup für meine virtuellen Maschinen und teste, welche Speichermethode am schnellsten ist. Meine Testumgebung besteht aus einem HDD-Laufwerk mit LVM auf LUKS. Ich habe ein einzelnes LV für das Laufwerk der virtuellen Maschine erstellt und es für beide Tests wiederverwendet, um denselben Platz auf dem HDD-Laufwerk beizubehalten und eine gleichbleibende Leistung aufrechtzuerhalten (die Lese-/Schreibgeschwindigkeit der HDD hängt von der physischen Position ab).
- Host: Arch Linux, Kernel 4.12.8
- Gast: Ubuntu Desktop 17.04
Leistung getestet mit Befehl:
dd if=/dev/zero of=test bs=16M count=100 conv=sync
Erster Test: LV direkt als Laufwerk der virtuellen Maschine verwenden
Befehl:
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
Ergebnisse (jeder Wert stellt einen einzelnen Lauf dar):
- Erstellen einer neuen Datei: 98,4 MB/s; 112 MB/s
- Schreiben in vorhandene Datei: 62,5 MB/s; 68,7 MB/s; 64,8 MB/s
Zweiter Test: Erstellen von ext4 auf LV und Ablegen der Rohbilddatei darauf
Befehl:
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
Ergebnisse (jeder Wert stellt einen einzelnen Lauf dar):
- Erstellen einer neuen Datei: 254 MB/s; 242 MB/s
- Schreiben in vorhandene Datei: 187 MB/s; 189 MB/s; 190 MB/s
Dritter Test: LV direkt als Laufwerk der virtuellen Maschine verwenden, verschiedene Einstellungen
Befehl:
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
Ergebnisse (jeder Wert stellt einen einzelnen Lauf dar):
- Erstellen einer neuen Datei: 129 MB/s; 125 MB/s
- Schreiben in vorhandene Datei: 103 MB/s; 97 MB/s; 81,9 MB/s
Frage
Es gibt eindeutig einen Unterschied zwischen diesen beiden Lösungen, ich habe jedoch erwartet, dass ein Raw-Block-Gerät mindestens so schnell ist wie eine Image-Datei, da es keinen Overhead des Dateisystems des Hosts geben sollte. Ich nehme an, dass zwischendurch etwas Caching für das Datei-Image stattfindet oder die Optionen für ein Raw-Block-Gerät nicht optimal sind. Warum ist Raw-LV in diesem Fall langsamer? Was kann ich tun, um seine Leistung zu verbessern? Oder wenn es einfach langsamer sein sollte, warum dann?
BEARBEITEN: Ich habe einen dritten Testfall hinzugefügt mit den Einstellungen von:http://www.linux-kvm.org/page/Tuning_KVM. Es stellt sich heraus, dass es etwas schneller ist, aber immer noch langsamer als das Datei-Image. Mir ist auch aufgefallen, dass es mit jedem Durchlauf für vorhandene Dateien langsamer wird – allerdings sollte beim Überschreiben von Dateien keine Fragmentierung auftreten, daher bin ich mir nicht sicher, warum das passiert.
Antwort1
Das Problem könnte in einer Nichtübereinstimmung der Blockgrößen liegen.
Idealerweise möchten Sie Ihr Dateisystem an die zugrunde liegende Blockgröße des Mediums anpassen. Obwohl Sie nicht mitgeteilt haben, welche Blockgrößen Sie ausgewählt haben, haben Sie, glaube ich, 4 Kilobyte für den Ext4-Versuch und 512 Byte für das LV. Wenn die natürliche Blockgröße Ihres zugrunde liegenden Mediums 4 Kilobyte beträgt, erklärt dies meiner Meinung nach sowohl Ihr Geschwindigkeitsproblem als auch Ihre abnehmende Geschwindigkeit. Da Sie möglicherweise nur 512 in einen 4k-Block schreiben, haben Sie 75 % des Blocks verschwendet und nachfolgende Schreibvorgänge werden mehr Blöcke verwenden, was zu mehr Overhead und Verschwendung führt.
Wiederholen Sie Ihren Test mit einer gut passenden Dateisystemblockgröße, die mit der zugrunde liegenden Medienblockgröße übereinstimmt. Probieren Sie in diesem Fall Ihr LV mit einer Blockgröße von 4 KB aus.
LVM fügt etwas mehr Overhead hinzu als Ext4. Stack Overflow-Antwort Ich denke, das würde erklären, warum es nur ein bisschen langsamer ist. :)