Disk Performance Probleme bei KVM Server mit ZFS

Feb 24, 2022
8
0
6
23
Hallo Liebe Community,

ich brauche mal eure Hilfe. Wir werden bei einem Server-System ZFS, hierbei haben wir bemerkt, dass die VMs (KVM) fast keinen Speed bei den Disks erhalten. Average ist hierbei 156.7MB/s und das bei Datacenter SSDs.

Bei einem LXC Container ist die Speed komplett anders und das auf dem selben ZFS Pool. Hierbei beträgt die Speed 1242.9 MB/s - nun zu meiner Frage, in wie weit beeinflusst eine KVM das ganze?
Wie kann man hier die Speed rausholen bei dieser Virtualisierung. Auf dem ZFS Pool haben wir dementsprechend auch einen test gemacht mit dem Script von bench.sh und hierbei ist, was verständlich ist, die Speed auch um den dreh bei 1.1GB/s

Kann mir hierbei jemand erklären was der Unterschied ist bei LXC und KVM und wie ich das Problem beheben kann, dass ich bei einer KVM Virtualisierung mehr Disk Speed bekomme?

Ich danke euch.
 
Bei ZFS nutzen VMs Block Devices (Zvols) mit einer festen Blockgröße (standardmäßig 8K) und LXCs nutzen Dateisysteme (Datasets) mit einer variablen Blockgröße (standardmäßig 128K, was heißt LXCs können variable Blöcke von 4K-128K in Dateien schreiben).
Schreibt man also eine 1MB Datei in einer VM und einem LXC, würde das bei der VM 128x 8KB schreiben und bei einem LXC 8x 128K.
Und dann fällt bei LXCs natürlich noch der Virtualisierungs-Overhead weg. Standardmäßig schreibt virtio SCSI z.B. mit 512B Blöcken auf das Zvol mit einer standardmäßigen 8K Blockgröße.
 
Last edited:
Hallo @Dunuin ,

danke erstmal für die Information über den Unterschied, jedoch hättest du auch eine Idee, wie man dann dementsprechend die Performance verbessern kann auf den KVM Servern? Gibt es da überhaupt eine Möglichkeit?
 
Eine Sache die man tun kann ist z.B. die volblocksize für seine Workload anzupassen. Gerade wenn man ein Raidz1/2/3 benutzt sollte man das immer tun, da man sonst massiv Padding-Overhead hat. Siehe hier für raidz1/2/3: https://www.delphix.com/blog/delphi...or-how-i-learned-stop-worrying-and-love-raidz

Läuft in der VM primär eine MySQL DB die mit 16K Blöcken schreibt, dann hätte man mit einer volblocksize von 16K wohl die beste Performance, da dann je 16K Block der in der VM geschrieben wird auch nur ein 16K Block auf das Zvol geschrieben werden muss anstatt zwei 8K Blöcken.
Was PVE bei ZFS als volblocksize benutzt kann man leider nicht individuell für die VM festlegen. PVE nutzt immer die selbe volblocksize für den kompletten ZFS Pool (auch wenn theoretisch jedes Zvol seine eigene Volblocksize haben könnte). Was als volblocksize für den Pool benutzt wird gibt man im "Block Size" Feld unter "Datacenter -> Storage -> DeinZFSPool -> Edit" an.
Die volblocksize kann aber nur bei Erstellung des Zvols einmalig definiert werden. Man muss die Zvols also erst zerstören und neu erstellen, damit die neue volblocksize verwendet wird. So ein Neuerstellen geht am einfachsten über Migrieren zwischen Nodes oder über ein Backup+Restore.
 
Alles klar, wir haben auf diesem System aktuell 12 VMs laufen - heißt also nun, alle VMs mal auf ein anderes System migrieren, danach die ZFS Pools anpassen von den volblocksize auf 16k und ich komme dann ggf. auf die Performance wie auf den LXC Container hin?
 
Mal so nebenbei, bei den VMs mal WriteBack deaktivieren und testen.
Hallo,

habe ich gemacht. Habe hier mal Default (no cache) genommen. Speed jedoch auch immer noch schlecht und nicht mal annähernd bei dem LXC Container, welcher 1.2GB/s zusammen bekommt auf dem selben Host.

I/O Speed(1st run) : 87.1 MB/s
I/O Speed(2nd run) : 172 MB/s
I/O Speed(3rd run) : 162 MB/s
I/O Speed(average) : 140.4 MB/s

Andere Idee hierbei?
 
Mit was misst du den Diskspeed?
Edit:
Eventuell mehr Infos über Hardware wäre schön..
Die LXC-Performance kommt mir etwas "schnell" vor, aber gut.
 
Last edited:
Alles klar, wir haben auf diesem System aktuell 12 VMs laufen - heißt also nun, alle VMs mal auf ein anderes System migrieren, danach die ZFS Pools anpassen von den volblocksize auf 16k und ich komme dann ggf. auf die Performance wie auf den LXC Container hin?
Da müsstest du erst gucken was denn deine Workload genau ist. Je größer du die Volblocksize wählst, desto schneller sollten große Writes sein, aber auch desto langsamer kleiner Writes. Bei Zvols muss man immer einen Kompromiss irgendwo in der Mitte finden, da sonst immer das eine oder andere langsamer wird.
LXCs haben da den Vorteil der variablen Blockgröße den man mit einem Zvol nicht haben kann.

Beispiel:
Du schreibst 1x 1MB sowie 1000x 4K in einer VM auf einem Zvol mit volblocksize=8K und in einem LXC auf einem Dataset mit recordsize=128K (beides auf Pool mit ashift=12).

Die VM wird 1x 1MB Datei als 128x 8K Blöcke schreiben und die 1000x 4k Dateien als 1000x 8K Blöcke. Bei der 1MB Datei ist es langsam weil so viele Blöcke für eine Datei geschrieben werden müssen wo jeder Block ein IO erzeugt und für jeden einzelnen Block dann auch noch zusätzliche Metadaten-Blöcke geschrieben werden müssen.
Auf der anderen Seite verliest du Throughput und Platz bei den 1000x 4K Dateien, da ein Zvols, dass mit 8K Blöcken arbeitet, nichts speichern kann was kleiner als 8K ist. Du musst also die doppelte Datenmenge schreiben also nur halber Throughput.

Bei dem LXC mit Dataset sieht es besser aus, weil beim Dataset die Blockgröße (durch Recordsize definiert) variabel ist. Die 1x 1MB Datei kann als 8x 128K Blöcke gespeichert werden, also viel weniger IO und Metadaten-Overhead weil die Datei aus viel weniger Blöcken besteht. Gleichzeitig kann das selbe Dataset aber die 1000x 4K Dateien auch als 1000x 4K Blöcke speichern. Verschwendet man also weniger Throughput und Platz, da 4K in 4K und nicht 4K in 8K gespeichert werden müssen.

Besser weiss ich nicht, aber das "offizielle" halt:
HowTo Benchmark Proxmox

Einfach die Blocksize anpassen nach Geschmack.
Und das "--filename=/dev/sda" rausnehmen und durch ein "--directory=/pfad/zu/dem/gemounteten/zvol/oder/dataset" ersetzen, sonst zerstört dir das gleich alle Daten auf der ganzen SSD.
 
Last edited:
Was den Diskspeed einer VM auch extrem bremst, wenn die CPU auf KVM statt auf host steht. Hatte bei meinen Tests den Faktor 3 ausgemacht.
Bei 8vCPUs und type Host hatte ich in einer Ubuntu VM 1,2 Mio write I/O auf Enterprise NVME (ZFS Mirror) geschafft.
 

About

The Proxmox community has been around for many years and offers help and support for Proxmox VE, Proxmox Backup Server, and Proxmox Mail Gateway.
We think our community is one of the best thanks to people like you!

Get your subscription!

The Proxmox team works very hard to make sure you are running the best software and getting stable updates and security enhancements, as well as quick enterprise support. Tens of thousands of happy customers have a Proxmox subscription. Get yours easily in our online shop.

Buy now!