Beschleunigung des Qemu KVM-Festplattensubsystems unter Linux



Manchmal übernehme ich verschiedene Aufgaben zum Einrichten von Servern. Vor einiger Zeit kam der Besitzer eines kleinen Hosting-Unternehmens mit einem interessanten Problem auf mich zu. Er möchte virtuelle Windows-Maschinen unter KVM auf seinen Servern ausführen, auf denen Ubuntu 18.04 bereits installiert war.

Seine Tests zeigten jedoch, dass das KVM-Festplattensystem deutlich hinter den Indikatoren zurückblieb, die er unter Hyper-V hatte. Er wollte qemu auf seinen Ubuntu-Servern einsetzen, um den Kauf teurer Windows-Serverlizenzen zu vermeiden (die kostenlose Version von Microsoft Hyper-V Server funktionierte aufgrund ihrer Einschränkungen nicht).

0. Disposition


Zum Testen haben wir die Samsung 970 Pro 1 TB SSD verwendet. Der Kunde überprüfte die Arbeitsergebnisse in CrystalDiskMark, also weiter im Artikel alle Grafiken daraus.

Windows 10 LTSCHyper-V
2-CPU
KVM
2 CPU
Der erste Schritt bestand darin, die Leistung zufälliger E / A zu verbessern. Diese Art der Auslastung ist typisch für virtuelle Maschinen, insbesondere für solche, die verschiedene Datenbanken verwenden.

Ubuntu (16.04 LTS und 18.04) verwendet weiterhin qemu Version 2.11. Daher werden einige der neuesten Qemu-Brötchen in diesem Artikel nicht berücksichtigt.

Wir haben beschlossen, das Binden von Eisen an eine virtuelle Maschine zu vermeiden, da dies die Portabilität virtueller Maschinen erschwert. Daher wurden Optionen zum Werfen von SSD / physischen Festplatten / Partitionen in virtuelle Maschinen als unerwünscht angesehen.

Informationen zur Größe der Testdatei für CrystalDiskMark
, 100 4. , : , .

, , Windows . 100 4 , 40 .

, , 100-1. 4.

1. Wir verwenden LVM-Volumes, keine Dateien zum Speichern von Festplatten virtueller Maschinen.


Die Logik ist dies. Die Datei mit der virtuellen Festplatte wird im Linux-Dateisystem gespeichert, NTFS befindet sich in der Datei selbst. Jedes Dateisystem verbraucht während des Festplattenbetriebs Ressourcen. Je kleiner die Tiefe der Puppe ist, desto schneller ist die Eingabe / Ausgabe.

Wenn wir über qcow2-Dateien sprechen, steht ihr Name für „Qemu Copy-On-Write“ und sie haben tatsächlich eine eigene Übersetzungstabelle, die dafür verantwortlich ist, welche Blöcke belegt sind, welche nicht und wo sich was befindet.

Die LVM-Schicht verbraucht erheblich weniger Prozessorressourcen als das Dateisystem. Einer der Gründe dafür ist, dass die darin enthaltenen Blöcke viel größer sind als ein typischer Dateisystemblock (4 KB). Je größer der Block (die Ausdehnung) auf dem physischen LVM-Gerät ist, desto schneller tritt E / A auf und desto weniger Fragmentierung.

Aber auch für SSDs ist zufällige E / A viel langsamer als serielle. Daher geben wir beim Erstellen der Volume-Gruppe einen sehr großen Umfang an: 256 MB.

Das Vorauslesen eines logischen Volumes sollte deaktiviert sein, da es E / A ohne Gewinn ausgibt, da jetzt niemand mehr Festplatten in Windows auf SSDs defragmentiert.

LVM ist sehr praktisch für das Hosting virtueller Maschinen. LVM-Volumes können problemlos zwischen physischen Festplatten portiert werden. Es gibt Snapshots und Größenänderungen online. Darüber hinaus kann virt-manager (libvirt) sofort logische Volumes für Festplatten virtueller Maschinen aus der Volume-Gruppe erstellen.

Die Möglichkeit, dünne Volumes zu erstellen, sieht ebenfalls attraktiv aus. Da ein dünnes Volume jedoch eine zusätzliche Abstraktionsebene darstellt, ist es offensichtlich, dass es die E / A-Leistung beeinträchtigt. Darüber hinaus bietet libvirt keine elegante Möglichkeit, Festplatten für virtuelle Maschinen in einem Thin Pool automatisch zu erstellen.

#    SSD    (volume group)
pvcreate /dev/nvme1n1p1

#    win    (extent) 256.
vgcreate -s 256M win_pool /dev/nvme1n1p1

#    vm1.    C
lvcreate -n vm1 -L 100G win_pool

#      (read ahead)
lvchange -r none /dev/win_pool/vm1

1.1. Thin Volume als Festplatte und / oder logische Volume-Einstellungen für Snapshots


Wenn Sie einen Thin Pool verwenden möchten, in dem Sie Thin Volumes erstellen, ist es sinnvoll, die Blockgröße des Pools auf 4 MB festzulegen, was viel größer als die Standardgröße von 64 KB ist.
Dies erfordert eine schnellere Arbeit dieser Abstraktionsebene.

Der Snapshot-Mechanismus in LVM funktioniert fast mit demselben Code wie Thin Volumes, sodass die Einstellungen zur Erhöhung der Snapshot-Geschwindigkeit identisch sind.

lvcreate -c 4m -L 300G -T -Zn win_pool/thin

Die Option -Zndeaktiviert das Überschreiben des Blocks mit Nullen beim Hervorheben, wodurch die Arbeitsgeschwindigkeit erhöht wird.

Einstellungen für lvm.conf oder eine ähnliche Datei (z. B. lvmlocal.conf):

thin_pool_chunk_size = 4096
thin_pool_zero = n

Sie können die optimale Größe des Blocks bestimmen, indem Sie den Test mit dem folgenden Befehl abschließen und den Wert auswählen --blocksize:

fio --name=randwrite --filename=/dev/nvme0n1p9 --size=10G --ioengine=libaio --iodepth=1 --buffered=0 --direct=1 --rw=randwrite --blocksize=4m

Sie können die aktuelle Größe des Blocks mit dem folgenden Befehl anzeigen:

lvs -ao name,chunksize

2. Durch Erhöhen der Anzahl der logischen Prozessoren, die jeder virtuellen KVM-Maschine zugewiesen sind, wird die Festplattenleistung verbessert


10 CPU8 CPU4 CPU

Es ist klar, dass kaum jemand der virtuellen Maschine 10 Prozessoren zuweisen wird, aber es war interessant, den Extremfall zu betrachten.

Dies hängt bereits von der Anzahl der freien Prozessoren ab. Meiner Meinung nach ist es nicht zweckmäßig, mehr als 4 zuzuweisen. Mit einer Anzahl von 8 Threads haben wir die maximale zufällige Lese- und Schreibleistung. Dies ist eine Besonderheit von CrystalDiskMark 6.0.2, in der der zweite Test 8 Threads durchführt.

Daraus können wir schließen, dass es gut ist, einen logischen Prozessor für jede Aufgabe zu haben, die aktiv E / A verwendet.

3. Wir verwenden große Seiten mit Direktzugriffsspeicher (riesige Seiten), um Leistungseinbußen aufgrund der Fragmentierung des Arbeitsspeichers zu vermeiden


Dieses Paket kann nützlich sein, wenn wir während des Betriebs verschiedene Informationen über große Seiten benötigen.

apt install hugepages

Bearbeiten /etc/default/grub:

GRUB_CMDLINE_LINUX="default_hugepagesz=1GB hugepagesz=1G hugepages=64"

In diesem Fall wurden 64 GB Speicher für alle virtuellen Maschinen als riesige Seiten zugewiesen. In Ihrem Fall kann es weniger / mehr geben.

Wir wenden diese Einstellungen auf GRUB an, damit sie beim nächsten Systemstart aktiv werden:

grub-mkconfig -o /boot/grub/grub.cfg

Bearbeiten der Konfiguration der virtuellen Maschine:

virsh edit vm_name

Hinzufügen:

<memoryBacking>
  <hugepages/>
</memoryBacking>

4. Fügen Sie jeder virtuellen Maschine einen dedizierten Stream hinzu, um E / A zu bedienen


Sie müssen hinzufügen, was fett hervorgehoben ist. Wir verwenden virsh, wie im vorherigen Absatz.

<iothreads>1</iothreads>

<disk type='block' device='disk'>
<driver name='qemu' type='raw' cache='none' io='threads' iothread='1'/>
<source dev='/dev/win/terminal'/>
<target dev='vda' bus='virtio'/>
<boot order='2'/>
<address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
</disk>


4.1. writeback


Um das versehentliche Schreiben auf die Festplatte zu beschleunigen, aber das Risiko eines Datenverlusts zu erhöhen, können Sie cache=writebackden vorherigen Absatz verwenden. Es kann nur verwendet werden, wenn großes Vertrauen in die Qualität und Sicherung der Stromversorgung sowie in das Vorhandensein von Sicherungen besteht.

5. Einstellungen des Festplattensubsystems in Virt Manager


Festplattenbus: VirtIO
Speicherformat: Raw
Cache-Modus: Writeback
IO-Modus: Threads

5.1. Konfigurieren eines Festplattensubsystems über eine Konfigurationsdatei


Qemu 2.11 (das derzeit von Ubuntu verwendet wird) unterstützt zwei Arten von virtuellen Festplattengeräten: virtio-blk und virtio-scsi. Wenn in Virt Manager angegeben Disk bus: VirtIO, bedeutet dies, dass das virtio-blk-Gerät verwendet wird.

In allen Fällen ist virtio-blk schneller, obwohl es in der getesteten qemu-Version TRIM im Gegensatz zu virtio-scsi (es unterstützt es bereits seit Version 5.x ) immer noch nicht unterstützt .

Unter dem Gesichtspunkt der Festplatten-E / A-Geschwindigkeit ist virtio-scsi nur in exotischen Fällen sinnvoll, beispielsweise wenn Sie Hunderte von Festplatten an eine virtuelle Maschine anschließen müssen.

6. Installieren Sie während der Installation von Windows den VirtIO-Treiber


Andernfalls ist die Festplatte für das Betriebssystem nicht verfügbar. Verwenden Sie dazu das Treiber-Image, das wir vorab mit der virtuellen Maschine verbinden.

7. Ergebnisse nach Anwendung aller Optimierungen


Tatsächlich wurde der Tweak 4.1 nicht verwendet, da ich mir der Zuverlässigkeit der Stromversorgung durch den Client nicht sicher war.
Hyper-V
2-CPU
KVM
2 CPU
KVM
4 CPU

Sie müssen verstehen, dass diese Ergebnisse eine bestimmte Konvention haben, da die Werte bei jedem Start von CrystalDiskMark geringfügig abweichen.

KVM aus der Box
2 CPU
KVM nach Tweaks
2 CPU

Wir sehen, dass es möglich war, die Arbeit des Festplattensubsystems in qemu (kvm) mit der gleichen Anzahl von Kernen signifikant zu beschleunigen. Das Schreiben wurde um durchschnittlich 58% und das Lesen um 25% beschleunigt.

Wichtige Erfolgselemente : Verwendung von LVM-Volumes anstelle von qcow2-Dateien, separate E / A und große Seiten.

Richten Sie die festgestellten Fehler an die PM. Ich erhöhe das Karma dafür.

PS vhost-user-blk und vhost-user-nvme


Während der Experimente wurden auch Qemu 2.12 und Version 3 kompiliert. Die Option vhost-user-blk für eine Festplatte wurde getestet.

Am Ende funktionierte es schlimmer als virtio-blk.

vhost-user-blk
4 CPU
virtio-blk
4 CPU

Um vhost-user-nvme verwenden zu können, musste qemu gepatcht werden. Diese Option erschwerte die automatische Aktualisierung von Servern in der Produktion und wurde daher nicht getestet.

PPS SPDK


Intel hat dieses Framework entwickelt , um herausragende Leistungsindikatoren für Festplattensysteme in virtuellen Maschinen zu erzielen, die auf seinen Prozessoren ausgeführt werden sollten.

Damit spdk gut funktioniert, gehen sie vielen Tricks nach - sie weisen ihm separate Kernel zu, platzieren den Kernel spdk und die virtuelle Maschine in einem Socket. Laden Sie die virtuelle Maschine in einen zusammenhängenden Speicherblock. Wenn Sie solche Maßnahmen auf reguläres virtio-blk anwenden, funktioniert es auch schneller.

SPDK kann in drei Modi arbeiten: vhost-user-scsi, vhost-user-blk und vhost-user-nvme. Der zweite Modus ist nur in qemu ab 2.12 verfügbar, was in ubuntu noch nicht verfügbar ist. Der vhost-user-nvme-Modus ist im Allgemeinen mega-experimentell - Sie müssen qemu dafür patchen. Derzeit funktioniert nur die SCSI-Emulation und ist langsam.

Es gibt noch eine weitere schwerwiegende Einschränkung für den vhost-user-scsi-Modus: spdk kann nicht bootfähig sein.
Stellen Sie sicher, dass dem Gerät vhost-user-scsi-pci die Option bootindex = 2 Qemu zugewiesen ist.
Datensätze werden festgelegt, wenn sie ihren Treiber verwenden, um SSDs auf mehreren Geräten freizugeben und sie als vhost-user-nvme weiterzuleiten. Der Ansatz des Eisenpiercings passte nicht zu uns.

Der Eindruck war, dass es normal war, SPDK nur mit der Implementierung von logischen Datenträgern zu verwenden (was sich völlig von Standard-lvm unterscheidet). Dies ist so ein selbstgemachtes Fahrrad mit seinen Bildern und Klonen. Die Teams unterscheiden sich alle von LVM.

Die Schwierigkeit bei der Konfiguration von SPDK, die Unterstützung und Portabilität virtueller Maschinen sowie die Anbindung an Intel-Prozessoren haben sich von seiner Verwendung abgewandt.

Danksagung


Danke für das Bild TripletConcept . Es ist besser, es in voller Größe in einem separaten Fenster anzusehen.

Für die Erlaubnis zum Teilen von Arbeitsmaterialien -st_neon




Sie können eine virtuelle Maschine mit SSD bei RUVDS für den unten stehenden Gutschein bestellen . Richten Sie die festgestellten Fehler an die PM. Ich erhöhe das Karma dafür.




All Articles