
Eine kurze Geschichte ĂŒber fio und etcd.
Die Leistung des Clusters hĂ€ngt stark von der Leistung seines Speichers ab. etcd exportiert einige Metriken in , um die erforderlichen Informationen ĂŒber die Speicherleistung bereitzustellen. Zum Beispiel die Metrik wal_fsync_duration_seconds. : Damit der Speicher als schnell genug gilt, muss der 99. Perzentil dieser Metrik unter 10 ms liegen. Wenn Sie planen, einen etcd-Cluster auf Linux-Maschinen auszufĂŒhren und einschĂ€tzen möchten, ob Ihr Speicher schnell genug ist (z.B. SSD), können Sie verwenden â ein beliebtes Tool zum Testen von Ein-/Ausgabe-Operationen. FĂŒhren Sie den folgenden Befehl aus, wobei test-data das Verzeichnis am Speicheranschlusspunkt ist:
fio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=22m --bs=2300 --name=mytestSie mĂŒssen nur die Ergebnisse ansehen und ĂŒberprĂŒfen, ob der 99. Perzentil der Dauer unter 10 ms liegt. Wenn ja, haben Sie einen ausreichend schnellen Speicher. Hier ist ein Beispiel fĂŒr die Ergebnisse:
sync (usec): min=534, max=15766, avg=1273.08, stdev=1084.70
sync Perzentile (usec):
| 1.00th=[ 553], 5.00th=[ 578], 10.00th=[ 594], 20.00th=[ 627],
| 30.00th=[ 709], 40.00th=[ 750], 50.00th=[ 783], 60.00th=[ 1549],
| 70.00th=[ 1729], 80.00th=[ 1991], 90.00th=[ 2180], 95.00th=[ 2278],
| 99.00th=[ 2376], 99.50th=[ 9634], 99.90th=[15795], 99.95th=[15795],
| 99.99th=[15795]Anmerkungen
- Wir haben die Parameterwerte âsize und âbs fĂŒr unser spezifisches Szenario angepasst. Um von fio nĂŒtzliche Ergebnisse zu erhalten, geben Sie Ihre Werte an. Woher bekommen Sie diese? Lesen Sie, .
- WÀhrend des Tests kommt die gesamte Ein-/Auslastung von fio. In einem realen Szenario werden wahrscheinlich auch andere Schreibanfragen an den Speicher gerichtet, die nichts mit der wal_fsync_duration_seconds zu tun haben. ZusÀtzliche Last wird den Wert von wal_fsync_duration_seconds erhöhen. Wenn der 99. Perzentil also fast 10 ms erreicht, ist Ihr Speicher nicht schnell genug.
- Verwenden Sie die Version nicht unter 3.5 (frĂŒhere Versionen zeigen keine Perzentile fĂŒr die Dauer von fdatasync an).
- Oben wurde nur ein Ausschnitt der Ergebnisse von fio gezeigt.
Eine lange Geschichte ĂŒber fio und etcd.
Was ist WAL in etcd?
Normalerweise verwenden Datenbanken ; etcd verwendet es ebenfalls. Hier werden wir das Write-Ahead-Log (WAL) nicht im Detail besprechen. Es genĂŒgt zu wissen, dass jedes Mitglied des etcd-Clusters es in einem persistenten Speicher fĂŒhrt. etcd protokolliert jede Operation mit SchlĂŒssel-Wert-Paaren (zum Beispiel Aktualisierungen) im WAL, bevor diese im Speicher angewendet werden. Wenn ein Mitglied des Speichers zwischen den Snapshots abstĂŒrzt und neu startet, kann es die Transaktionen lokal anhand des Inhalts des WAL seit dem letzten Snapshot wiederherstellen.
Wenn ein Client einen SchlĂŒssel im Speicher der SchlĂŒssel-Wert-Paare hinzufĂŒgt oder den Wert eines bestehenden SchlĂŒssels aktualisiert, wird diese Operation im WAL protokolliert, das eine normale Datei im persistenten Speicher darstellt. Bevor das Verfahren fortgesetzt wird, muss etcd davon vollstĂ€ndig ĂŒberzeugt sein, dass der Eintrag im WAL tatsĂ€chlich erfolgt ist. Unter Linux reicht dazu ein einziger Systemaufruf nicht aus , da die physische Speicherung tatsĂ€chlich verzögert werden kann. Beispielsweise kann Linux eine Weile den WAL-Eintrag im Kernel-Speichercache (wie im Seiten-Cache) halten. Um sicherzustellen, dass die Daten tatsĂ€chlich im persistenten Speicher gespeichert sind, ist ein Systemaufruf fdatasync nach dem Schreiben erforderlich, und genau das nutzt etcd (wie in den Ergebnissen zu sehen ist , wobei 8 der Dateideskriptor des WAL ist):
21:23:09.894875 lseek(8, 0, SEEK_CUR) = 12808
21:23:09.894911 write(8, ". 20210220361223255266632$10 20103026"34"rn3fo"..., 2296) = 2296
21:23:09.895041 fdatasync(8) = 0Leider erfolgt die Speicherung im persistenten Speicher nicht sofort. Wenn der Aufruf von fdatasync langsam ist, sinkt die Leistung des etcd-Systems. , dass der Speicher als ausreichend schnell gilt, wenn in 99 Prozent der FĂ€lle die Aufrufe von fdatasync zur Speicherung in der WAL-Datei weniger als 10 ms dauern. Es gibt weitere nĂŒtzliche Metriken fĂŒr den Speicher, aber in diesem Beitrag sprechen wir nur ĂŒber diese Metrik.
Bewertung des Speichers mit fio
Wenn Sie bewerten möchten, ob Ihr Speicher fĂŒr etcd geeignet ist, verwenden Sie fio â ein sehr beliebtes Werkzeug fĂŒr Lasttests bei Ein- und Ausgabe. Es ist zu beachten, dass Festplattenoperationen sehr unterschiedlich sein können: synchron und asynchron, viele Klassen von Systemaufrufen usw. Folglich ist fio relativ kompliziert zu verwenden. Es verfĂŒgt ĂŒber viele Parameter, und verschiedene Kombinationen ihrer Werte ergeben ganz unterschiedliche Ein- und Auslastungen. Um angemessene Zahlen fĂŒr etcd zu erhalten, sollte sichergestellt werden, dass die Testlast von fio in der Schreibweise so nah wie möglich an der realen Last von etcd beim Schreiben von WAL-Dateien ist.
Daher sollte fio mindestens eine Last in Form einer Serie von sequenziellen Schreiboperationen in eine Datei erzeugen, wobei jeder Schreibvorgang aus einem Systemaufruf bestehen wird , gefolgt von dem Systemaufruf fdatasync. FĂŒr sequenzielle SchreibvorgĂ€nge benötigt fio den Parameter ârw=write. Damit fio beim Schreiben den Systemaufruf write und nicht , sollte der Parameter âioengine=sync angegeben werden. SchlieĂlich muss der Parameter âfdatasync=1 hinzugefĂŒgt werden, um nach jedem Schreiben fdatasync aufzurufen. Die beiden anderen Parameter in diesem Beispiel (âsize und âbs) hĂ€ngen vom spezifischen Szenario ab. Im nĂ€chsten Abschnitt erklĂ€ren wir, wie man sie anpasst.
Warum fio und wie wir gelernt haben, es zu konfigurieren
In diesem Beitrag beschreiben wir einen echten Fall. Wir hatten einen Cluster v1.13, den wir mit Prometheus ĂŒberwacht haben. etcd v3.2.24 lief auf SSD. Die Metriken fĂŒr etcd zeigten zu hohe Latenzen fĂŒr fdatasync, selbst wenn der Cluster nichts tat. Die Metriken waren seltsam, und wir wussten nicht genau, was sie bedeuteten. Der Cluster bestand aus virtuellen Maschinen, und wir mussten herausfinden, wo das Problem lag: bei den physischen SSDs oder im Virtualisierungsschicht. AuĂerdem haben wir hĂ€ufig Ănderungen an der Hardware- und Softwarekonfiguration vorgenommen, und wir benötigten eine Möglichkeit, deren Auswirkungen zu bewerten. Wir konnten etcd in jeder Konfiguration starten und die Metriken von Prometheus beobachten, aber das war zu umstĂ€ndlich. Wir suchten nach einer relativ einfachen Möglichkeit, eine bestimmte Konfiguration zu bewerten. Wir wollten ĂŒberprĂŒfen, ob wir die Metriken von Prometheus von etcd richtig verstanden.
Aber dafĂŒr mussten zwei Probleme gelöst werden. Erstens, wie sieht die Eingabe-/Ausgabebelastung aus, die etcd beim Schreiben in das WAL erzeugt? Welche Systemaufrufe werden verwendet? Wie groĂ sind die EintrĂ€ge? Zweitens, wenn wir diese Fragen beantworten, wie können wir eine Ă€hnliche Arbeitslast mit fio reproduzieren? Vergessen Sie nicht, dass fio ein sehr flexibles Tool mit vielen Parametern ist. Wir haben beide Probleme mit einem Ansatz gelöst â durch Befehle. und . lsof zeigt alle von einem Prozess verwendeten Dateideskriptoren und die zugehörigen Dateien an. Mit strace kann man entweder einen bereits laufenden Prozess untersuchen oder einen Prozess starten und ihn analysieren. strace gibt alle Systemaufrufe des untersuchten Prozesses (und seiner Kindprozesse) aus. Letzteres ist sehr wichtig, da etcd genau diesen Ansatz anwendet.
ZunĂ€chst haben wir strace verwendet, um den etcd-Server fĂŒr Kubernetes zu untersuchen, als keine Last auf dem Cluster war. Wir sahen, dass fast alle WAL-EintrĂ€ge ungefĂ€hr gleich groĂ waren: 2200â2400 Bytes. Deshalb haben wir in der Befehlszeile zu Beginn diesen Parameter angegeben âbs=2300 (bs steht fĂŒr die GröĂe in Bytes fĂŒr jeden fio-Eintrag). Beachten Sie, dass die GröĂe des etcd-Eintrags von der Version des etcd, der Bereitstellung, den Parameterwerten usw. abhĂ€ngt und die Dauer von fdatasync beeinflusst. Wenn Sie ein Ă€hnliches Szenario haben, untersuchen Sie Ihre etcd-Prozesse mit strace, um die genauen Zahlen zu erfahren.
Um einen guten Eindruck von den Aktionen im Dateisystem von etcd zu bekommen, haben wir es mit strace und den Parametern -ffttT gestartet. So versuchten wir, die Kindprozesse zu untersuchen und die Ausgaben jedes einzelnen in einer separaten Datei zu speichern, und auĂerdem detaillierte Berichte ĂŒber den Beginn und die Dauer jedes Systemaufrufs zu erhalten. Wir verwendeten lsof, um unsere Analyse der strace-Ausgaben zu bestĂ€tigen und zu sehen, welcher Dateideskriptor fĂŒr welche Zwecke verwendet wurde. So erhielten wir mit strace die oben gezeigten Ergebnisse. Die Statistiken zur Synchronisationszeit bestĂ€tigten, dass der Indikator wal_fsync_duration_seconds von etcd den Aufrufen von fdatasync mit den WAL-Dateideskriptoren entspricht.
Wir haben die Dokumentation zu fio studiert und Parameter fĂŒr unser Szenario ausgewĂ€hlt, damit fio eine Last generiert, die mit der von etcd vergleichbar ist. AuĂerdem haben wir die Systemaufrufe und ihre Dauer ĂŒberprĂŒft, indem wir fio ĂŒber strace gestartet haben, Ă€hnlich wie bei etcd.
Wir haben sorgfĂ€ltig den Parameter âsize ausgewĂ€hlt, der die gesamte Ein- und Auslastung von fio darstellt. In unserem Fall ist dies die Gesamtzahl der Bytes, die im Speicher geschrieben werden. Es stellte sich heraus, dass es proportional zur Anzahl der Systemaufrufe von write (und fdatasync) war. FĂŒr einen bestimmten Wert von bs betrĂ€gt die Anzahl der Aufrufe von fdatasync = size/bs. Da uns das Perzentil interessierte, mussten wir genĂŒgend Proben fĂŒr die ZuverlĂ€ssigkeit haben, und wir haben berechnet, dass uns 10^4 (also 22 Mebibyte) ausreichen wĂŒrden. Wenn âsize kleiner ist, können AusreiĂer auftreten (zum Beispiel dauern einige Aufrufe von fdatasync lĂ€nger als gewöhnlich und beeinflussen das 99. Perzentil).
Versuchen Sie es selbst
Wir haben gezeigt, wie man fio verwendet und herausfindet, ob der Speicher ausreichend Geschwindigkeit fĂŒr eine hohe Leistung von etcd hat. Jetzt können Sie dies selbst praktisch ausprobieren, beispielsweise mit virtuellen Maschinen, die ĂŒber SSD-Speicher verfĂŒgen. .
Quelle: habr.com
