In diesem Artikel beschreibe ich eine Situation, die kĂŒrzlich mit einem unserer VPS-Cloud-Server aufgetreten ist und mich mehrere Stunden lang vor ein RĂ€tsel gestellt hat. Ich konfiguriere und behebe seit etwa 15 Jahren Serverprobleme. LinuxDieser Fall passt jedoch ĂŒberhaupt nicht in meine ĂŒbliche Vorgehensweise â ich habe mehrere falsche Annahmen getroffen und war etwas verzweifelt, bevor ich die Ursache des Problems richtig identifizieren und es lösen konnte.
PrÀambel
Wir betreiben eine mittelgroĂe Cloud, die wir auf Standardservern mit folgender Konfiguration aufbauen: 32 Kerne, 256 GB RAM und ein 4500 TB PCI-E Intel P4 NVMe-Laufwerk. Diese Konfiguration gefĂ€llt uns sehr gut, da sie die Sorge um den E/A-Overhead ĂŒberflĂŒssig macht, indem sie die korrekte EinschrĂ€nkung auf der Ebene des VM-Instanztyps bereitstellt. Weil NVMe Intel Dank der beeindruckenden Leistung können wir gleichzeitig sowohl die vollstĂ€ndige IOPS-Bereitstellung fĂŒr Maschinen als auch den Backup-Speicher auf einem Backup-Server ohne IOWAIT bereitstellen.
Wir gehören zu den AltglĂ€ubigen, die kein hyperkonvergentes SDN und andere stilvolle, modische, jugendliche Dinge zum Speichern von VM-Volumes verwenden, und glauben, dass es umso einfacher ist, Fehler zu beheben, je einfacher das System ist, wenn âder Haupt-Guru weg istâ. ins Gebirge." Daher speichern wir VM-Volumes im QCOW2-Format in XFS oder EXT4, das auf LVM2 bereitgestellt wird.
Wir werden auch durch das Produkt, das wir fĂŒr die Orchestrierung verwenden â Apache CloudStack â zur Verwendung von QCOW2 gezwungen.
Um ein Backup durchzufĂŒhren, erstellen wir ein vollstĂ€ndiges Image des Volumes als LVM2-Snapshot (ja, wir wissen, dass LVM2-Snapshots langsam sind, aber auch hier hilft uns der Intel P4500). Wir machen lvmcreate -s .. und mit der Hilfe dd Wir senden die Sicherungskopie an einen Remote-Server mit ZFS-Speicher. Hier sind wir noch etwas fortschrittlich â schlieĂlich kann ZFS Daten in komprimierter Form speichern und wir können sie mit schnell wiederherstellen DD oder einzelne VM-Volumes nutzen mount -o loop ....
Sie können natĂŒrlich nicht das vollstĂ€ndige Image des LVM2-Volumes entfernen, sondern das Dateisystem darin mounten
ROund die QCOW2-Images selbst zu kopieren, mussten wir jedoch feststellen, dass XFS dadurch schlecht wurde, und zwar nicht sofort, sondern auf unvorhersehbare Weise. Wir mögen es wirklich nicht, wenn Hypervisor-Hosts an Wochenenden, in der Nacht oder an Feiertagen aufgrund von Fehlern, von denen nicht klar ist, wann sie auftreten, plötzlich âhĂ€ngen bleibenâ. Daher verwenden wir fĂŒr XFS kein Snapshot-MountingROUm Volumes zu extrahieren, kopieren wir einfach das gesamte LVM2-Volume.
Die Geschwindigkeit der Sicherung auf den Backup-Server wird in unserem Fall durch die Leistung des Backup-Servers bestimmt, die bei inkompressiblen Daten bei etwa 600-800 MB/s liegt; ein weiterer Limiter ist der 10Gbit/s-Kanal, mit dem der Backup-Server verbunden ist zum Cluster.
Gleichzeitig werden 8 Sicherungskopien auf einen Sicherungsserver hochgeladen. Server Hypervisoren. Die Festplatten- und Netzwerksubsysteme des Backup-Servers sind zwar langsamer, verhindern aber eine Ăberlastung der Festplattensubsysteme der Hypervisor-Hosts, da diese beispielsweise nicht in der Lage sind, 8 GB/s zu verarbeiten, was die Hypervisor-Hosts problemlos bewĂ€ltigen können.
Der obige Kopiervorgang ist fĂŒr die weitere Geschichte sehr wichtig, einschlieĂlich der Details â Verwendung eines schnellen Intel P4500-Laufwerks, Verwendung von NFS und wahrscheinlich auch der Verwendung von ZFS.
Backup-Geschichte
Auf jedem Hypervisor-Knoten haben wir eine kleine SWAP-Partition mit einer GröĂe von 8 GB, und wir ârollenâ den Hypervisor-Knoten selbst aus DD vom Referenzbild. FĂŒr das Systemvolumen auf Servern verwenden wir 2xSATA SSD RAID1 oder 2xSAS HDD RAID1 auf einem LSI- oder HP-Hardware-Controller. Im Allgemeinen ist es uns völlig egal, was sich darin befindet, da unser Systemvolume mit Ausnahme von SWAP im âfast schreibgeschĂŒtztenâ Modus arbeitet. Und da wir viel RAM auf dem Server haben und dieser zu 30-40 % frei ist, denken wir nicht ĂŒber SWAP nach.
Backup-Prozess. Diese Aufgabe sieht in etwa 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-snapBeachten Sie die ionice -c3TatsĂ€chlich ist dieses Ding fĂŒr NVMe-GerĂ€te völlig nutzlos, da der E/A-Planer fĂŒr sie wie folgt eingestellt ist:
cat /sys/block/nvme0n1/queue/scheduler
[none] Wir haben jedoch eine Reihe von Legacy-Knoten mit herkömmlichen SSD-RAIDs, fĂŒr die dies relevant ist und die daher umziehen WIE ES IST. Insgesamt ist dies nur ein interessanter Code, der die Sinnlosigkeit erklĂ€rt ionice im Falle einer solchen Konfiguration.
Achten Sie auf die Flagge iflag=direct fĂŒr DD. Wir verwenden direkte E/A unter Umgehung des Puffercaches, um einen unnötigen Austausch von E/A-Puffer beim Lesen zu vermeiden. Jedoch, oflag=direct Wir tun dies nicht, da wir bei der Verwendung von ZFS auf Leistungsprobleme gestoĂen sind.
Wir nutzen dieses Schema seit mehreren Jahren erfolgreich und ohne Probleme.
Und dann fing es an... Wir haben festgestellt, dass einer der Knoten nicht mehr gesichert war und der vorherige mit einem monströsen IOWAIT von 50 % lief. Beim Versuch zu verstehen, warum das Kopieren nicht erfolgt, sind wir auf das folgende PhĂ€nomen gestoĂen:
Volume group "images" not foundWir dachten darĂŒber nach: âDas Ende des Intel P4500 ist gekommenâ, doch bevor der Server ausgeschaltet wurde, um das Laufwerk auszutauschen, musste noch ein Backup durchgefĂŒhrt werden. Wir haben LVM2 behoben, indem wir Metadaten aus einem LVM2-Backup wiederhergestellt haben:
vgcfgrestore imagesWir haben ein Backup gestartet und dieses ĂlgemĂ€lde gesehen:

Wieder waren wir sehr traurig â es war klar, dass wir so nicht leben könnten, da alle VPS leiden wĂŒrden, was bedeutet, dass auch wir leiden wĂŒrden. Was passiert ist, ist völlig unklar - iostat zeigte erbĂ€rmliche IOPS und den höchsten IOWAIT. Es gab keine anderen Ideen als âLasst uns NVMe ersetzenâ, aber die Erkenntnis kam gerade noch rechtzeitig.
Analyse der Situation Schritt fĂŒr Schritt
Historisches Magazin. Einige Tage zuvor war es notwendig, auf diesem Server einen groĂen VPS mit 128 GB RAM zu erstellen. Es schien genĂŒgend Speicher vorhanden zu sein, aber um auf der sicheren Seite zu sein, haben wir der Swap-Partition weitere 32 GB zugewiesen. Der VPS wurde erstellt, hat seine Aufgabe erfolgreich abgeschlossen und der Vorfall wurde vergessen, aber die SWAP-Partition blieb bestehen.
Konfigurationsfunktionen. FĂŒr alle Cloud-Server der Parameter vm.swappiness wurde auf Standard gesetzt 60. Und SWAP wurde auf SAS HDD RAID1 erstellt.
Was ist passiert (laut Redaktion). Beim Sichern DD erzeugte viele Schreibdaten, die vor dem Schreiben in NFS in RAM-Puffer abgelegt wurden. Systemkern, richtliniengesteuert swappiness, verschob viele Seiten des VPS-Speichers in den Swap-Bereich, der sich auf einem langsamen HDD-RAID1-Volume befand. Dies fĂŒhrte dazu, dass IOWAIT sehr stark wuchs, allerdings nicht aufgrund von IO NVMe, sondern aufgrund von IO HDD RAID1.
Wie das Problem gelöst wurde. Die 32-GB-Swap-Partition wurde deaktiviert. Dies hat 16 Stunden gedauert; Sie können separat nachlesen, wie und warum sich SWAP so langsam abschaltet. Einstellungen wurden geĂ€ndert swappiness auf einen Wert gleich 5 ĂŒberall in der Wolke.
Wie konnte das nicht passieren?. Erstens, wenn SWAP auf einem SSD-RAID- oder NVMe-GerĂ€t wĂ€re, und zweitens, wenn es kein NVMe-GerĂ€t gĂ€be, sondern ein langsameres GerĂ€t, das kein solches Datenvolumen erzeugen wĂŒrde â ironischerweise trat das Problem auf, weil dieses NVMe zu schnell ist.
Danach begann alles wie zuvor zu funktionieren â ohne IOWAIT.
Source: habr.com
