In diesem Artikel werde ich ĂŒber eine Situation berichten, die kĂŒrzlich mit einem unserer VPS-Cloud-Server passiert ist und mich fĂŒr mehrere Stunden vor ein RĂ€tsel stellte. Ich beschĂ€ftige mich seit etwa 15 Jahren mit der Konfiguration und Fehlersuche von Linux-Servern, aber dieser Fall passt ĂŒberhaupt nicht in meine Praxis â ich habe einige falsche Annahmen getroffen und war ein wenig verzweifelt, bevor ich in der Lage war, die Ursache des Problems richtig zu bestimmen und es zu lösen.
PrÀambel
Wir betreiben eine mittelgroĂe Cloud, die wir auf Standardservern mit der folgenden Konfiguration aufbauen â 32 Kerne, 256 GB RAM und ein NVMe-PCI-E-Intel-P4500-Speicher mit einer GröĂe von 4 TB. Wir sind sehr mit dieser Konfiguration zufrieden, da sie es uns ermöglicht, uns keine Sorgen ĂŒber IO-Mangel zu machen und ein korrektes Limit auf VM-Instanzebene zu gewĂ€hrleisten. Da das NVMe-Intel beeindruckende Leistung bietet, können wir sowohl vollstĂ€ndige IOPS-Anforderungen fĂŒr Maschinen als auch die Sicherung des Speichers auf einen Backup-Server mit null IOWAIT gleichzeitig bereitstellen.
Wir gehören zu den traditionellen Betreibern, die keine hyperkonvergenten SDN und andere schicke, trendige, jugendliche Dinge zum Speichern von VM-Volumes verwenden, da wir der Meinung sind, dass je einfacher das System ist, desto einfacher ist es, es unter Bedingungen wie "der Hauptguru ist in die Berge gegangen" zu beheben. Daher speichern wir VM-Volumes im QCOW2-Format in XFS oder EXT4, das auf LVM2 bereitgestellt wird.
Die Notwendigkeit, QCOW2 zu verwenden, ergibt sich auch aus dem Produkt, das wir fĂŒr die Orchestrierung verwenden â Apache CloudStack.
FĂŒr die DurchfĂŒhrung von Backups erstellen wir ein vollstĂ€ndiges Abbild des Volumes als LVM2-Snapshot (ja, wir wissen, dass LVM2-Snapshots langsam sind, aber der Intel P4500 hilft uns auch hier). Wir machen lvmcreate -s .. und senden das Backup mit dd auf einen entfernten Server mit ZFS-Speicher. Hier sind wir doch ein wenig fortschrittlich â ZFS kann schlieĂlich Daten in komprimierter Form speichern, und wir können sie schnell wiederherstellen mit DD oder einzelne VM-Volumes mit mount -o loop ....
Es ist natĂŒrlich auch möglich, kein vollstĂ€ndiges Abbild des LVM2-Volumes zu erstellen, sondern das Dateisystem im
RO-Modus zu mounten.und die QCOW2-Images selbst zu kopieren, allerdings hatten wir festgestellt, dass XFS darunter leidet, und zwar nicht sofort, sondern unvorhersehbar. Wir mögen es ĂŒberhaupt nicht, wenn die Hypervisor-Hosts an Wochenenden, nachts oder an Feiertagen plötzlich "einfrieren" aufgrund von Fehlern, die unklar sind, wann sie auftreten werden. Daher nutzen wir fĂŒr XFS keine Snapshot-Montierung im ModusRO-Modus zu mounten.zur Extraktion von Volumes, sondern kopieren einfach das gesamte LVM2-Volume.
Die Geschwindigkeit der Datensicherung auf dem Backup-Server hĂ€ngt in unserem Fall von der Leistung des Backup-Servers ab, die etwa 600-800 MB/s fĂŒr nicht komprimierte Daten betrĂ€gt, und der weitere Begrenzungsfaktor ist die 10Gbit/s-Leitung, ĂŒber die der Backup-Server mit dem Cluster verbunden ist.
Insgesamt laden 8 Server Hypervisoren gleichzeitig auf einen Backup-Server die Backups hoch. Somit verhindern die langsameren Speicher- und Netzwerksubsysteme des Backup-Servers, dass die Speichersubsysteme der Hypervisor-Hosts ĂŒberlastet werden, da sie einfach nicht in der Lage sind, sagen wir, 8 GB/s zu verarbeiten, die die Hypervisor-Hosts problemlos bereitstellen können.
Der oben beschriebene Kopiervorgang ist sehr wichtig fĂŒr die weitere ErzĂ€hlung, einschlieĂlich der Details â die Verwendung des schnellen Intel P4500-Speichers, die Nutzung von NFS und wahrscheinlich die Verwendung von ZFS.
Geschichte der Datensicherung
An jedem Hypervisor-Knoten haben wir eine kleine SWAP-Partition mit einer GröĂe von 8 GB, und den Hypervisor-Knoten "rollen" wir mit Hilfe von DD aus einem Referenz-Image aus. FĂŒr das Systemvolume auf den Servern verwenden wir 2xSATA SSD RAID1 oder 2xSAS HDD RAID1 mit einem Hardware-Controller von LSI oder HP. Im Allgemeinen ist es uns völlig egal, was da drin ist, da unser Systemvolume im "fast readonly"-Modus funktioniert, mit Ausnahme des SWAPs. Da wir sehr viel RAM auf dem Server haben und dieser zu 30-40% frei ist, denken wir nicht an SWAP.
Der Prozess der Datensicherung. Diese Aufgabe sieht ungefÀhr so aus:
#!/bin/bash
mkdir -p /mnt/backups/volumes
DIR=/mnt/images-snap
VOL=images/volume
DATE=$(date "+%d")
HOSTNAME=$(hostname)
lvcreate -s -n $VOL-snap -l100%FREE $VOL
ionice -c3 dd iflag=direct if=/dev/$VOL-snap bs=1M of=/mnt/backups/volumes/$HOSTNAME-$DATE.raw
lvremove -f $VOL-snapAchten Sie darauf, dass ionice -c3, tatsĂ€chlich ist dieses Tool fĂŒr NVMe-GerĂ€te völlig nutzlos, da der IO-Scheduler fĂŒr sie wie folgt eingestellt ist:
cat /sys/block/nvme0n1/queue/scheduler
[none] Aber wir haben eine Reihe von Legacy-Knoten mit normalen SSD-RAIDs, fĂŒr sie ist das relevant, und so migriert es AS IS. Im Allgemeinen ist dies einfach ein interessanter Codeausschnitt, der die Sinnlosigkeit erklĂ€rt ionice bei einer solchen Konfiguration.
Achten Sie auf das Flag iflag=direct fĂŒr DD. Wir verwenden Direct IO, um den Puffer Cache zu umgehen, um keine unnötigen IO-Pufferwechsel beim Lesen vorzunehmen. Allerdings, oflag=direct tun wir das nicht, da wir auf Leistungsprobleme mit ZFS gestoĂen sind, als wir es verwendet haben.
Dieses Schema setzen wir seit mehreren Jahren erfolgreich ohne Probleme ein.
Und dann begann es⊠Wir stellten fest, dass fĂŒr einen der Knoten die Sicherung nicht mehr funktionierte und die vorherige mit einem schrecklichen IOWAIT von fast 50% durchgefĂŒhrt wurde. Als wir versuchten zu verstehen, warum die Sicherung nicht stattfand, stieĂen wir auf das PhĂ€nomen:
Volume group "images" nicht gefundenWir dachten ĂŒber "das Ende von Intel P4500" nach, allerdings musste vor dem Abschalten des Servers zum Austausch des Laufwerks unbedingt noch eine Sicherung durchgefĂŒhrt werden. Wir reparierten LVM2 mithilfe der Wiederherstellung von Metadaten aus dem LVM2-Backup:
vgcfgrestore imagesWir starteten die Sicherung und sahen folgendes Bild:

Wir waren wieder sehr traurig â es war klar, dass so ein Zustand nicht tragbar war, da alle VPS leiden wĂŒrden, und damit auch wir. Was passiert war, war völlig unklar â iostat zeigte mickrige IOPS und extrem hohes IOWAIT. Es gab keine Ideen, auĂer "lasst uns das NVMe ersetzen", aber rechtzeitig kam die Erleuchtung.
Situation Schritt fĂŒr Schritt analysieren
Historisches Protokoll. Einige Tage zuvor war es auf diesem Server erforderlich, eine groĂe VPS mit 128 GB RAM zu erstellen. Der Speicher schien ausreichen, aber zur Sicherheit wurden 32 GB fĂŒr die Swap-Partition bereitgestellt. Die VPS wurde erstellt, erledigte erfolgreich ihre Aufgabe und der Vorfall wurde vergessen, wĂ€hrend die SWAP-Partition bestehen blieb.
Konfigurationsmerkmale. FĂŒr alle Cloud-Server war der Parameter vm.swappiness auf den Standardwert 60gesetzt.
Und die SWAP-Partition wurde auf einem SAS HDD RAID1 erstellt.Was passierte (nach Meinung der Redaktion) DD . Bei der Sicherung wurden viele Daten zum Schreiben ausgegeben, die vor dem Schreiben in NFS in RAM-Puffer gelangten. Der Kernel des Systems verschob, gestĂŒtzt auf die Politik derswappiness
, viele Seiten des VPS-Speichers in den Swap-Bereich, der sich auf dem langsamen HDD RAID1-Volumen befand. Dies fĂŒhrte dazu, dass IOWAIT stark anstieg, allerdings nicht wegen IO NVMe, sondern wegen IO HDD RAID1.Wie das Problem gelöst wurde wurden viele Daten zum Schreiben ausgegeben, die vor dem Schreiben in NFS in RAM-Puffer gelangten. Der Kernel des Systems verschob, gestĂŒtzt auf die Politik der . Die 32-GB-Swap-Partition wurde deaktiviert. Dies dauerte 16 Stunden; darĂŒber, wie und warum SWAP so langsam deaktiviert wird, kann man separat lesen. Die Parameter wurden geĂ€ndert 5 auf einen Wert von
im gesamten Cloud-Netzwerk geĂ€ndert. Wie es dazu kommen konnte.. Erstens, wenn SWAP auf einem SSD-RAID oder NVMe-GerĂ€t wĂ€re, und zweitens, wenn kein NVMe-GerĂ€t vorhanden wĂ€re, sondern ein langsameres GerĂ€t, das nicht so viel Daten ausgeben kann â ironischerweise trat das Problem auf, weil NVMe zu schnell ist.
Nach diesem stellte sich alles wieder so ein wie zuvor â mit null IOWAIT.
Quelle: habr.com
