Dies ist die mehrseitige Druckansicht dieses Abschnitts. .
Benchmarks
- 1: Benchmark zum Speicherverbrauch der Speicherschicht
- 2: Benchmark zum Speicherverbrauch von Watches
- 3: Benchmarks für etcd v3
- 4: Benchmarks für etcd v2.2.0-rc-memory
- 5: Benchmarks für etcd v2.2.0-rc
- 6: Benchmarks für etcd v2.2.0
- 7: Benchmarks für etcd v2.1.0
Benchmarks
etcd-Benchmarks werden regelmäßig veröffentlicht und im Folgenden für jede Version dokumentiert:
Benchmarks zum Speicherverbrauch
Hier wird der erwartete Speicherverbrauch in verschiedenen Szenarien erfasst.
1 - Benchmark zum Speicherverbrauch der Speicherschicht
Zwei Komponenten der etcd-Speicherschicht beanspruchen physischen Speicher. Der etcd-Prozess legt einen Index im Arbeitsspeicher an, um Schlüssel schneller nachzuschlagen. Der vom Betriebssystem verwaltete Seitencache des Prozesses hält kürzlich vom Datenträger gelesene Daten zur schnellen Wiederverwendung vor.
Der Index im Arbeitsspeicher enthält alle Schlüssel in einer B-Baum -Datenstruktur, zusammen mit Zeigern auf die Daten (die Werte) auf dem Datenträger. Jeder Schlüssel im B-Baum kann mehrere Zeiger enthalten, die auf verschiedene Versionen seiner Werte verweisen. Der theoretische Speicherverbrauch des Index lässt sich daher mit folgender Formel näherungsweise berechnen:
N * (c1 + avg_key_size) + N * (avg_versions_of_key) * (c2 + size_of_pointer)
Dabei ist c1 der Zusatzaufwand für Schlüsselmetadaten und c2 der Zusatzaufwand für Versionsmetadaten.
Die Grafik zeigt den detaillierten Aufbau des B-Baum-Index im Arbeitsspeicher.
Der Seitencache wird vom Betriebssystem verwaltet und in diesem Dokument nicht näher behandelt.
Testumgebung
etcd-Version
GCE-Rechnertyp n1-standard-2
- 7.5 GB Arbeitsspeicher
- 2x CPUs
Speicherverbrauch des Index im Arbeitsspeicher
Dieser Test misst ausschließlich den Speicherverbrauch des Index im Arbeitsspeicher. Ziel ist, die oben genannten Werte c1 und c2 zu bestimmen und die feste Grenze des Speicherverbrauchs der Speicherschicht zu verstehen.
Wir berechnen den Speicherverbrauch mit der Go-Funktion runtime.ReadMemStats. Dazu ermitteln wir die Differenz der insgesamt zugewiesenen Bytes vor und nach dem Erstellen des Index. Dies bildet den Speicherverbrauch des Index selbst nicht exakt ab, zeigt aber das ungefähre Verbrauchsmuster.
| N | Versionen | Schlüsselgröße | Speicherverbrauch |
|---|---|---|---|
| 100K | 1 | 64bytes | 22MB |
| 100K | 5 | 64bytes | 39MB |
| 1M | 1 | 64bytes | 218MB |
| 1M | 5 | 64bytes | 432MB |
| 100K | 1 | 256bytes | 41MB |
| 100K | 5 | 256bytes | 65MB |
| 1M | 1 | 256bytes | 409MB |
| 1M | 5 | 256bytes | 506MB |
Aus den Ergebnissen lassen sich c1=120bytes und c2=30bytes berechnen. Da c1 und c2 die einzigen Unbekannten in der Formel sind, reichen zwei Datensätze zu ihrer Berechnung aus. Die Werte c1=120bytes und c2=30bytes sind die Mittelwerte der 4 berechneten Wertepaarungen für c1 und c2. Bei kleinen Schlüssel-Wert-Paaren ist der Zusatzaufwand für Schlüsselmetadaten mit 50% weiterhin beträchtlich. Gegenüber dem alten Speicher mit mindestens 1000% Zusatzaufwand ist dies jedoch eine erhebliche Verbesserung.
Gesamter Speicherverbrauch
Der gesamte Speicherverbrauch erfasst, wie viel RSS etcd mit der Speicherschicht beansprucht. Die Größe der Werte sollte den gesamten Speicherverbrauch von etcd nur wenig beeinflussen, da die Werte auf dem Datenträger liegen und nur häufig verwendete Werte im Arbeitsspeicher verbleiben, verwaltet vom Seitencache des Betriebssystems.
| N | Versionen | Schlüsselgröße | Wertgröße | Speicherverbrauch |
|---|---|---|---|---|
| 100K | 1 | 64bytes | 256bytes | 40MB |
| 100K | 5 | 64bytes | 256bytes | 89MB |
| 1M | 1 | 64bytes | 256bytes | 470MB |
| 1M | 5 | 64bytes | 256bytes | 880MB |
| 100K | 1 | 64bytes | 1KB | 102MB |
| 100K | 5 | 64bytes | 1KB | 164MB |
| 1M | 1 | 64bytes | 1KB | 587MB |
| 1M | 5 | 64bytes | 1KB | 836MB |
Die Ergebnisse zeigen, dass die Größe der Werte den Speicherverbrauch nicht wesentlich beeinflusst. Er steigt geringfügig, weil der Seitencache des Betriebssystems mehr Daten vorhält.
2 - Benchmark zum Speicherverbrauch von Watches
Die Watch-Funktionen werden aktiv weiterentwickelt; ihr Speicherverbrauch kann sich dabei ändern. Wir erwarten nicht, dass er die unten angegebenen Werte wesentlich übersteigt.
Ein wesentliches Ziel von etcd ist die Unterstützung sehr vieler Watcher mit einer außerordentlich großen Zahl von Watch-Registrierungen. Angestrebt werden O(10k) Clients, O(100K) Watch-Streams (O(10) Streams pro Client) und insgesamt O(10M) Watch-Registrierungen (O(100) pro Stream). Der Speicherverbrauch der einzelnen Watch-Registrierungen macht den größten Teil des gesamten Speicherverbrauchs von etcd aus und steht deshalb im Mittelpunkt der aktuellen und künftigen Optimierungen.
Drei zusammengehörige Komponenten der Watch-Funktion von etcd beanspruchen physischen Speicher: jede grpc.Conn, jeder Watch-Stream und jede einzelne Watch-Registrierung. grpc.Conn verwaltet die tatsächliche TCP-Verbindung und weitere gRPC-Verbindungszustände. Jede grpc.Conn beansprucht O(10kb) Speicher und kann mehrere Watch-Streams haben.
Jeder Watch-Stream ist eine eigenständige HTTP2-Verbindung, die weitere O(10kb) Speicher beansprucht. Mehrere Watch-Registrierungen können sich einen Watch-Stream teilen.
Eine Watch-Registrierung ist die eigentliche Struktur, die Änderungen im Schlüssel-Wert-Speicher verfolgt. Jede Registrierung sollte nur < O(1kb) beanspruchen.
Der theoretische Speicherverbrauch von Watch lässt sich mit folgender Formel näherungsweise berechnen:
memory = c1 * number_of_conn + c2 * avg_number_of_stream_per_conn + c3 * avg_number_of_watch_stream
Testumgebung
etcd-Version
GCE-Rechnertyp n1-standard-2
- 7.5 GB Arbeitsspeicher
- 2x CPUs
Gesamter Speicherverbrauch
Der gesamte Speicherverbrauch erfasst, wie viel RSS etcd mit den Client-Watchern beansprucht. Obwohl das Ergebnis um bis zu 10% schwanken kann, ist es aussagekräftig: Ziel ist, den ungefähren Speicherverbrauch und das Muster der Speicherzuweisungen zu verstehen.
Aus dem Benchmark-Ergebnis lassen sich näherungsweise c1 = 17kb, c2 = 18kb und c3 = 350bytes berechnen. Jede zusätzliche Clientverbindung beansprucht also 17kb Speicher, jeder zusätzliche Stream 18kb und jede weitere Watch-Registrierung nur 350bytes. Ein einzelner etcd-Server kann im Normalfall Millionen von Watch-Registrierungen mit wenigen GB Arbeitsspeicher verwalten.
| Clients | Streams pro Client | Watch-Registrierungen pro Stream | Watch-Registrierungen insgesamt | Speicherverbrauch |
|---|---|---|---|---|
| 1k | 1 | 1 | 1k | 50MB |
| 2k | 1 | 1 | 2k | 90MB |
| 5k | 1 | 1 | 5k | 200MB |
| 1k | 10 | 1 | 10k | 217MB |
| 2k | 10 | 1 | 20k | 417MB |
| 5k | 10 | 1 | 50k | 980MB |
| 1k | 50 | 1 | 50k | 1001MB |
| 2k | 50 | 1 | 100k | 1960MB |
| 5k | 50 | 1 | 250k | 4700MB |
| 1k | 50 | 10 | 500k | 1171MB |
| 2k | 50 | 10 | 1M | 2371MB |
| 5k | 50 | 10 | 2.5M | 5710MB |
| 1k | 50 | 100 | 5M | 2380MB |
| 2k | 50 | 100 | 10M | 4672MB |
| 5k | 50 | 100 | 25M | OOM |
3 - Benchmarks für etcd v3
Physische Rechner
GCE-Rechnertyp n1-highcpu-2
- 1x dedizierte lokale SSD, unter /var/lib/etcd eingebunden
- 1x dedizierter langsamer Datenträger für das Betriebssystem
- 1.8 GB Arbeitsspeicher
- 2x CPUs
- etcd-Version 2.2.0
etcd-Cluster
1 etcd-Mitglied im v3-Demomodus
Testverfahren
Das Benchmarkwerkzeug für etcd v3 verwenden.
Leistung
Einen einzelnen Schlüssel lesen
| Schlüsselgröße in Bytes | Anzahl der Clients | Lese-QPS | 90. Latenzperzentil (ms) |
|---|---|---|---|
| 256 | 1 | 2716 | 0.4 |
| 256 | 64 | 16623 | 6.1 |
| 256 | 256 | 16622 | 21.7 |
Die Leistung ist nahezu gleich wie mit einem leeren Server-Handler.
Einen einzelnen Schlüssel nach dem Schreiben lesen
| Schlüsselgröße in Bytes | Anzahl der Clients | Lese-QPS | 90. Latenzperzentil (ms) |
|---|---|---|---|
| 256 | 1 | 2269 | 0.5 |
| 256 | 64 | 13582 | 8.6 |
| 256 | 256 | 13262 | 47.5 |
Mit einem leeren Server-Handler beeinflusst ein einzelner put-Vorgang die Leistung nicht. Der Leistungsrückgang dürfte daher durch das Speicherpaket verursacht werden.
4 - Benchmarks für etcd v2.2.0-rc-memory
Physischer Rechner
GCE-Rechnertyp n1-standard-2
- 1x dedizierte lokale SSD, unter /var/lib/etcd eingebunden
- 1x dedizierter langsamer Datenträger für das Betriebssystem
- 7.5 GB Arbeitsspeicher
- 2x CPUs
etcd
Testverfahren
Einen etcd-Cluster mit 3 Mitgliedern starten, von denen jedes 2 Kerne verwendet.
Schlüsselnamen sind stets 64 Bytes lang, was einer angemessenen durchschnittlichen Schlüssellänge entspricht.
Maximaler Speicherverbrauch
- etcd kann den maximalen Speicherverbrauch erreichen, wenn ein Follower ausgefallen ist und der Leader fortlaufend Snapshots sendet.
max RSSist der höchste in 3 Durchläufen gemessene Speicherverbrauch.
| Wertgröße in Bytes | Schlüsselanzahl | Datenmenge(MB) | max. RSS(MB) | Verhältnis max. RSS/Datenmenge auf dem Leader |
|---|---|---|---|---|
| 128 | 50000 | 6 | 433 | 72x |
| 128 | 100000 | 12 | 659 | 54x |
| 128 | 200000 | 24 | 1466 | 61x |
| 1024 | 50000 | 48 | 1253 | 26x |
| 1024 | 100000 | 96 | 2344 | 24x |
| 1024 | 200000 | 192 | 4361 | 22x |
Schwellenwert für die Datenmenge
- Wenn etcd den Schwellenwert für die Datenmenge erreicht, kann es leicht zu einer Leader-Wahl kommen, und ein Teil der Vorschläge kann verworfen werden.
- In den meisten Fällen sollte der etcd-Cluster reibungslos arbeiten, solange er den Schwellenwert nicht erreicht. Arbeitet er wegen unzureichender Ressourcen nicht zuverlässig, die Datenmenge reduzieren.
| Wertgröße in Bytes | Begrenzung der Schlüsselanzahl | Empfohlener Schwellenwert für die Datenmenge(MB) | Verbrauchter RSS(MB) |
|---|---|---|---|
| 128 | 400K | 48 | 2400 |
| 1024 | 300K | 292 | 6500 |
5 - Benchmarks für etcd v2.2.0-rc
Physischer Rechner
GCE-Rechnertyp n1-highcpu-2
- 1x dedizierte lokale SSD, unter /var/lib/etcd eingebunden
- 1x dedizierter langsamer Datenträger für das Betriebssystem
- 1.8 GB Arbeitsspeicher
- 2x CPUs
etcd-Cluster
3 Mitglieder mit etcd 2.2.0-rc, jeweils auf einem eigenen Rechner.
Versionsdetails:
Außerdem bilden wir aus 3 Mitgliedern mit etcd 2.1.0 im Alpha-Stadium einen Cluster, um die Ausgangsleistung zu ermitteln. Der verwendete etcd-Commit ist c7146bd5 , derselbe wie im etcd-2.1-Benchmark .
Testverfahren
Einen weiteren Rechner einrichten und mit dem HTTP-Benchmarkwerkzeug hey Anfragen an jedes etcd-Mitglied senden. Eine ausführliche Anleitung enthält der Leitfaden zur Benchmark-Entwicklung .
Leistung
Einen einzelnen Schlüssel lesen
| Schlüsselgröße in Bytes | Anzahl der Clients | etcd-Zielserver | Lese-QPS | 90. Latenzperzentil (ms) |
|---|---|---|---|---|
| 64 | 1 | nur Leader | 2804 (-5%) | 0.4 (+0%) |
| 64 | 64 | nur Leader | 17816 (+0%) | 5.7 (-6%) |
| 64 | 256 | nur Leader | 18667 (-6%) | 20.4 (+2%) |
| 256 | 1 | nur Leader | 2181 (-15%) | 0.5 (+25%) |
| 256 | 64 | nur Leader | 17435 (-7%) | 6.0 (+9%) |
| 256 | 256 | nur Leader | 18180 (-8%) | 21.3 (+3%) |
| 64 | 64 | alle Server | 46965 (-4%) | 2.1 (+0%) |
| 64 | 256 | alle Server | 55286 (-6%) | 7.4 (+6%) |
| 256 | 64 | alle Server | 46603 (-6%) | 2.1 (+5%) |
| 256 | 256 | alle Server | 55291 (-6%) | 7.3 (+4%) |
Einen einzelnen Schlüssel schreiben
| Schlüsselgröße in Bytes | Anzahl der Clients | etcd-Zielserver | Schreib-QPS | 90. Latenzperzentil (ms) |
|---|---|---|---|---|
| 64 | 1 | nur Leader | 76 (+22%) | 19.4 (-15%) |
| 64 | 64 | nur Leader | 2461 (+45%) | 31.8 (-32%) |
| 64 | 256 | nur Leader | 4275 (+1%) | 69.6 (-10%) |
| 256 | 1 | nur Leader | 64 (+20%) | 16.7 (-30%) |
| 256 | 64 | nur Leader | 2385 (+30%) | 31.5 (-19%) |
| 256 | 256 | nur Leader | 4353 (-3%) | 74.0 (+9%) |
| 64 | 64 | alle Server | 2005 (+81%) | 49.8 (-55%) |
| 64 | 256 | alle Server | 4868 (+35%) | 81.5 (-40%) |
| 256 | 64 | alle Server | 1925 (+72%) | 47.7 (-59%) |
| 256 | 256 | alle Server | 4975 (+36%) | 70.3 (-36%) |
Erklärung der Leistungsänderungen
-
Die Lese-QPS sinken in den meisten Szenarien um 5~8%. Der Grund ist, dass etcd für jede Speicheroperation Speichermetriken erfasst. Diese sind für Überwachung und Fehlersuche wichtig, weshalb der Rückgang vertretbar ist.
-
Die Schreib-QPS an den Leader steigen um 20~30%. Dies liegt daran, dass wir die Raft-Hauptschleife von der Schleife zum Anwenden der Einträge entkoppeln, sodass sie sich nicht gegenseitig blockieren.
-
Die Schreib-QPS an alle Server steigen um 30~80%, weil Follower den neuesten Commit-Index früher erhalten und Vorschläge schneller festschreiben können.
6 - Benchmarks für etcd v2.2.0
Physische Rechner
GCE-Rechnertyp n1-highcpu-2
- 1x dedizierte lokale SSD, als etcd-Datenverzeichnis eingebunden
- 1x dedizierter langsamer Datenträger für das Betriebssystem
- 1.8 GB Arbeitsspeicher
- 2x CPUs
etcd-Cluster
3 etcd-2.2.0-Mitglieder, jeweils auf einem eigenen Rechner.
Versionsdetails:
Testverfahren
Einen weiteren Rechner außerhalb des etcd-Clusters einrichten und das HTTP-Benchmarkwerkzeug hey
mit einem Patch zur Wiederverwendung von Verbindungen ausführen, um Anfragen an jedes Clustermitglied zu senden. Die Benchmark-Anleitung
enthält den Patch und die Schritte zum Reproduzieren unserer Vorgehensweise.
Die Leistung wird aus den Ergebnissen von 100 Benchmark-Durchläufen berechnet.
Leistung
Leseleistung für einen einzelnen Schlüssel
| Schlüsselgröße in Bytes | Anzahl der Clients | etcd-Zielserver | Durchschnitt der Lese-QPS | Standardabweichung der Lese-QPS | Durchschnitt des 90. Latenzperzentils (ms) | Standardabweichung der Latenz |
|---|---|---|---|---|---|---|
| 64 | 1 | nur Leader | 2303 | 200 | 0.49 | 0.06 |
| 64 | 64 | nur Leader | 15048 | 685 | 7.60 | 0.46 |
| 64 | 256 | nur Leader | 14508 | 434 | 29.76 | 1.05 |
| 256 | 1 | nur Leader | 2162 | 214 | 0.52 | 0.06 |
| 256 | 64 | nur Leader | 14789 | 792 | 7.69 | 0.48 |
| 256 | 256 | nur Leader | 14424 | 512 | 29.92 | 1.42 |
| 64 | 64 | alle Server | 45752 | 2048 | 2.47 | 0.14 |
| 64 | 256 | alle Server | 46592 | 1273 | 10.14 | 0.59 |
| 256 | 64 | alle Server | 45332 | 1847 | 2.48 | 0.12 |
| 256 | 256 | alle Server | 46485 | 1340 | 10.18 | 0.74 |
Schreibleistung für einen einzelnen Schlüssel
| Schlüsselgröße in Bytes | Anzahl der Clients | etcd-Zielserver | Durchschnitt der Schreib-QPS | Standardabweichung der Schreib-QPS | Durchschnitt des 90. Latenzperzentils (ms) | Standardabweichung der Latenz |
|---|---|---|---|---|---|---|
| 64 | 1 | nur Leader | 55 | 4 | 24.51 | 13.26 |
| 64 | 64 | nur Leader | 2139 | 125 | 35.23 | 3.40 |
| 64 | 256 | nur Leader | 4581 | 581 | 70.53 | 10.22 |
| 256 | 1 | nur Leader | 56 | 4 | 22.37 | 4.33 |
| 256 | 64 | nur Leader | 2052 | 151 | 36.83 | 4.20 |
| 256 | 256 | nur Leader | 4442 | 560 | 71.59 | 10.03 |
| 64 | 64 | alle Server | 1625 | 85 | 58.51 | 5.14 |
| 64 | 256 | alle Server | 4461 | 298 | 89.47 | 36.48 |
| 256 | 64 | alle Server | 1599 | 94 | 60.11 | 6.43 |
| 256 | 256 | alle Server | 4315 | 193 | 88.98 | 7.01 |
Leistungsänderungen
-
Da etcd jetzt für jeden API-Aufruf Metriken erfasst, scheinen die Lese-QPS in den meisten Szenarien geringfügig zu sinken. Angesichts der umfangreichen Informationen für Überwachung und Fehlersuche wurde dieser minimale Leistungsverlust als vertretbar eingeschätzt.
-
Die Schreib-QPS an Cluster-Leader scheinen leicht gestiegen zu sein. Ursache ist die Entkopplung der Hauptschleife von den Schleifen zum Anwenden der Einträge in der Raft-Logik von etcd. Dadurch entfallen mehrere gegenseitige Blockierungen.
-
Die Schreib-QPS an alle Mitglieder scheinen erheblich gestiegen zu sein, weil Follower den neuesten Commit-Index jetzt früher erhalten und Vorschläge schneller festschreiben.
7 - Benchmarks für etcd v2.1.0
Physische Rechner
GCE-Rechnertyp n1-highcpu-2
- 1x dedizierte lokale SSD, unter /var/lib/etcd eingebunden
- 1x dedizierter langsamer Datenträger für das Betriebssystem
- 1.8 GB Arbeitsspeicher
- 2x CPUs
- etcd-Version 2.1.0 alpha
etcd-Cluster
3 etcd-Mitglieder, jeweils auf einem eigenen Rechner
Testverfahren
Einen weiteren Rechner einrichten und mit dem HTTP-Benchmarkwerkzeug hey Anfragen an jedes etcd-Mitglied senden. Eine ausführliche Anleitung enthält der Leitfaden zur Benchmark-Entwicklung .
Leistung
Einen einzelnen Schlüssel lesen
| Schlüsselgröße in Bytes | Anzahl der Clients | etcd-Zielserver | Lese-QPS | 90. Latenzperzentil (ms) |
|---|---|---|---|---|
| 64 | 1 | nur Leader | 1534 | 0.7 |
| 64 | 64 | nur Leader | 10125 | 9.1 |
| 64 | 256 | nur Leader | 13892 | 27.1 |
| 256 | 1 | nur Leader | 1530 | 0.8 |
| 256 | 64 | nur Leader | 10106 | 10.1 |
| 256 | 256 | nur Leader | 14667 | 27.0 |
| 64 | 64 | alle Server | 24200 | 3.9 |
| 64 | 256 | alle Server | 33300 | 11.8 |
| 256 | 64 | alle Server | 24800 | 3.9 |
| 256 | 256 | alle Server | 33000 | 11.5 |
Einen einzelnen Schlüssel schreiben
| Schlüsselgröße in Bytes | Anzahl der Clients | etcd-Zielserver | Schreib-QPS | 90. Latenzperzentil (ms) |
|---|---|---|---|---|
| 64 | 1 | nur Leader | 60 | 21.4 |
| 64 | 64 | nur Leader | 1742 | 46.8 |
| 64 | 256 | nur Leader | 3982 | 90.5 |
| 256 | 1 | nur Leader | 58 | 20.3 |
| 256 | 64 | nur Leader | 1770 | 47.8 |
| 256 | 256 | nur Leader | 4157 | 105.3 |
| 64 | 64 | alle Server | 1028 | 123.4 |
| 64 | 256 | alle Server | 3260 | 123.8 |
| 256 | 64 | alle Server | 1033 | 121.5 |
| 256 | 256 | alle Server | 3061 | 119.3 |