Zum Inhalt springen

Dies ist die mehrseitige Druckansicht dieses Abschnitts. .

Zur normalen Ansicht dieser Seite zurückkehren.

Benchmarks

Leistungsmessungen für etcd

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

Leistungsmessungen für die etcd-Speicherschicht (Index im Arbeitsspeicher und Seitencache)

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.



                                In mem index

                               +------------+
                               | key || ... |
  +--------------+             |     ||     |
  |              |             +------------+
  |              |             | v1  || ... |
  |   disk    <----------------|     ||     | Tree Node
  |              |             +------------+
  |              |             | v2  || ... |
  |           <----------------+     ||     |
  |              |             +------------+
  +--------------+       +-----+    |   |   |
                         |     |    |   |   |
                         |     +------------+
                         |
                         |
                         ^
                      ------+
                      | ... |
                      |     |
                      +-----+
                      | ... | Tree Node
                      |     |
                      +-----+
                      | ... |
                      |     |
                      ------+

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

Leistungsmessungen für etcd-Watcher
Hinweis

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.

                                          +-------+
                                          | watch |
                              +---------> | foo   |
                              |           +-------+
                       +------+-----+
                       |   stream   |
      +--------------> |            |
      |                +------+-----+     +-------+
      |                       |           | watch |
      |                       +---------> | bar   |
+-----+------+                            +-------+
|            |         +------------+
|   conn     +-------> |   stream   |
|            |         |            |
+-----+------+         +------------+
      |
      |
      |
      |                +------------+
      +--------------> |   stream   |
                       |            |
                       +------------+

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

Leistungsmessungen 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

Leistungsmessungen 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

etcd Version: 2.2.0-rc.0+git
Git SHA: 103cb5c
Go Version: go1.5
Go OS/Arch: linux/amd64

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 RSS ist 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

Leistungsmessungen 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:

etcd Version: 2.2.0-alpha.1+git
Git SHA: 59a5a7e
Go Version: go1.4.2
Go OS/Arch: linux/amd64

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

Leistungsmessungen 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:

etcd Version: 2.2.0
Git SHA: e4561dd
Go Version: go1.5
Go OS/Arch: linux/amd64

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

Leistungsmessungen 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