Skip to content

Version imprimable multipages. .

Retour à la version par défaut.

Benchmarks

Mesures de performance pour etcd

Benchmarks

Les benchmarks etcd seront publiés régulièrement et suivis pour chaque version ci-dessous :

Benchmarks d’utilisation mémoire

Il enregistre l’utilisation mémoire attendue dans différents scénarios.

1 - Benchmark de l'utilisation de la mémoire de stockage

Mesures de performance pour le stockage etcd (index en mémoire et cache de pages)

Deux composants du stockage etcd consomment de la mémoire physique. Le processus etcd alloue un index en mémoire afin d’accélérer la recherche des clés. La mémoire tampon de pages, gérée par le système d’exploitation, stocke les données récemment accessibles sur disque pour une réutilisation rapide.

L’index en mémoire stocke toutes les clés dans une structure de données arbre B , accompagnées de pointeurs vers les données sur disque (les valeurs). Chaque clé dans l’arbre B peut contenir plusieurs pointeurs, chacun faisant référence à une version différente de sa valeur. La consommation mémoire théorique de l’index en mémoire peut donc être approximée par la formule :

N * (c1 + avg_key_size) + N * (avg_versions_of_key) * (c2 + size_of_pointer)

où c1 représente la surcharge liée aux métadonnées de clé et c2 la surcharge liée aux métadonnées de version.

Le graphique montre la structure détaillée de l’arbre B en mémoire.



                                In mem index

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

La mémoire du cache Page cache est gérée par le système d’exploitation et n’est pas traitée en détail dans ce document.

Environnement de test

Version etcd

Type de machine GCE n1-standard-2

  • 7,5 Go de mémoire
  • 2x processeurs

Utilisation mémoire de l’index en mémoire

Dans ce test, nous ne mesurons que la consommation mémoire de l’index en mémoire. L’objectif est de déterminer c1 et c2 mentionnés ci-dessus, afin de comprendre la limite maximale de consommation mémoire du stockage.

Nous calculons la consommation de mémoire à l’aide de Go runtime.ReadMemStats. Nous déterminons la différence entre le nombre total d’octets alloués avant la création de l’index et après sa création. Cette méthode ne reflète pas parfaitement la consommation de mémoire de l’index en mémoire mais permet toutefois d’observer le profil de consommation approximatif.

N versions taille de clé utilisation mémoire
100K 1 64 octets 22 Mo
100K 5 64 octets 39 Mo
1M 1 64 octets 218 Mo
1M 5 64 octets 432 Mo
100K 1 256 octets 41 Mo
100K 5 256 octets 65 Mo
1M 1 256 octets 409 Mo
1M 5 256 octets 506 Mo

En fonction du résultat, nous pouvons calculer c1=120bytes, c2=30bytes. Nous n’avons besoin que de deux jeux de données pour calculer c1 et c2, car ce sont les seules variables inconnues dans la formule. Les valeurs c1=120bytes et c2=30bytes correspondent à la moyenne des 4 jeux de c1 et c2 que nous avons calculés. La surcharge liée aux métadonnées clés reste encore relativement importante (50 %) pour des paires clé-valeur de petite taille. Toutefois, il s’agit d’une amélioration significative par rapport au vieux magasin, qui présentait au moins une surcharge de 1000 %.

Utilisation mémoire globale

La consommation mémoire globale indique la quantité de mémoire RSS utilisée par etcd, y compris le stockage. La taille des valeurs devrait avoir très peu d’impact sur la consommation mémoire globale d’etcd, car les valeurs sont conservées sur disque et seules les valeurs fréquemment utilisées sont conservées en mémoire, gérées par le cache de pages du système d’exploitation.

N versions taille clé taille valeur utilisation mémoire
100K 1 64 octets 256 octets 40 Mo
100K 5 64 octets 256 octets 89 Mo
1M 1 64 octets 256 octets 470 Mo
1M 5 64 octets 256 octets 880 Mo
100K 1 64 octets 1 Ko 102 Mo
100K 5 64 octets 1 Ko 164 Mo
1M 1 64 octets 1 Ko 587 Mo
1M 5 64 octets 1 Ko 836 Mo

En fonction des résultats, nous savons que la taille des valeurs n’a pas d’impact significatif sur la consommation mémoire. Une légère augmentation est observée en raison de données supplémentaires conservées dans le cache de page du système d’exploitation.

2 - Benchmark de l'utilisation mémoire de la surveillance

Mesures de performance pour les observateurs etcd
Note

Les fonctionnalités de surveillance sont en développement actif, et leur utilisation mémoire peut évoluer au cours de ce développement. Nous ne prévoyons pas d’augmentation significative au-delà des valeurs indiquées ci-dessous.

Un objectif principal d’etcd est de prendre en charge un très grand nombre d’observateurs effectuant une surveillance massivement étendue. etcd vise à supporter O(10k) clients, O(100K) flux de surveillance (O(10) flux par client) et O(10M) surveillance totale (O(100) surveillance par flux). La mémoire consommée par chaque surveillance individuelle représente la plus grande partie de l’utilisation globale d’etcd, et constitue donc le point focal des optimisations actuelles et futures.

Trois composants liés de la surveillance etcd consomment de la mémoire physique : chaque grpc.Conn, chaque flux de surveillance et chaque instance d’activité de surveillance. grpc.Conn maintient la connexion TCP réelle et l’état de connexion gRPC associé. Chaque grpc.Conn consomme environ 10 ko de mémoire, et peut avoir plusieurs flux de surveillance attachés.

Chaque flux de surveillance est une connexion HTTP2 indépendante qui consomme une autre quantité de mémoire O(10 ko). Plusieurs surveillance peuvent partager un même flux de surveillance.

La surveillance est la structure réelle qui suit les modifications apportées au magasin clé-valeur. Chaque surveillance ne doit consommer que < 1 Ko.

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

La consommation mémoire théorique de la surveillance peut être approximée par la formule suivante : memory = c1 * number_of_conn + c2 * avg_number_of_stream_per_conn + c3 * avg_number_of_watch_stream

Environnement de test

Version etcd

Type de machine GCE n1-standard-2

  • 7,5 Go de mémoire
  • 2x processeurs

Utilisation mémoire globale

La consommation mémoire globale indique la quantité de RSS consommée par etcd, incluant les observateurs clients. Bien que le résultat puisse varier jusqu’à 10 %, il reste significatif, car l’objectif est de comprendre l’usage mémoire approximatif et le schéma d’allocation.

À partir des résultats du benchmark, nous pouvons estimer approximativement que c1 = 17kb, c2 = 18kb et c3 = 350bytes. Ainsi, chaque connexion cliente supplémentaire consomme 17 ko de mémoire, chaque flux supplémentaire consomme 18 ko de mémoire, et chaque surveillance supplémentaire n’entraîne qu’une augmentation de 350 octets. Un serveur etcd unique peut maintenir des millions de surveillance avec quelques gigaoctets de mémoire dans un cas normal.

clients flux par client surveillance par flux surveillance totale utilisation mémoire
1k 1 1 1k 50Mo
2k 1 1 2k 90Mo
5k 1 1 5k 200Mo
1k 10 1 10k 217Mo
2k 10 1 20k 417Mo
5k 10 1 50k 980Mo
1k 50 1 50k 1001Mo
2k 50 1 100k 1960Mo
5k 50 1 250k 4700Mo
1k 50 10 500k 1171Mo
2k 50 10 1M 2371Mo
5k 50 10 2.5M 5710Mo
1k 50 100 5M 2380Mo
2k 50 100 10M 4672Mo
5k 50 100 25M OOM

3 - Benchmarking d'etcd v3

Mesures de performance pour etcd v3

Machines physiques

Type de machine GCE n1-highcpu-2

  • 1 disque SSD local dédiqué monté sous /var/lib/etcd
  • 1 disque lent dédié pour le système d’exploitation
  • 1,8 Go de mémoire
  • 2 processeurs
  • version etcd 2.2.0

etcd cluster

1 membre etcd en mode démonstration v3

Test

Utilisez l’outil de benchmark etcd v3 .

Performances

lecture d’une seule clé

taille de la clé en octets nombre de clients QPS de lecture latence au 90e percentile (ms)
256 1 2716 0,4
256 64 16623 6,1
256 256 16622 21,7

Les performances sont presque identiques à celles obtenues avec un gestionnaire de serveur vide.

lecture d’une seule clé après mise

taille de la clé en octets nombre de clients QPS de lecture latence au 90e percentile (ms)
256 1 2269 0,5
256 64 13582 8,6
256 256 13262 47,5

La performance avec un gestionnaire de serveur vide n’est pas affectée par une opération put. Le dégradé de performance doit donc être dû au package de stockage.

4 - Benchmarking etcd v2.2.0-rc-memory

Mesures de performance pour etcd v2.2.0-rc-memory

Machine physique

Type de machine GCE n1-standard-2

  • 1 disque SSD local dédié monté sous /var/lib/etcd
  • 1 disque lent dédié pour le système d’exploitation
  • 7,5 Go de mémoire
  • 2 processeurs

etcd

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

Test

Démarrez un cluster etcd composé de 3 membres, chacun utilisant 2 cœurs.

La longueur du nom de clé est toujours de 64 octets, ce qui constitue une longueur raisonnable pour une clé moyenne.

Utilisation maximale mémoire

  • etcd peut utiliser une mémoire maximale si un suiveur est défaillant et que le leader continue d’envoyer des instantanés.
  • max RSS est la consommation mémoire maximale enregistrée sur 3 exécutions.
taille valeur (octets) nombre de clés taille données (Mo) RSS maximal (Mo) débit maximal RSS/data sur le 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

Seuil de taille des données

  • Lorsque etcd atteint le seuil de taille des données, il peut déclencher facilement une élection de leader et rejeter une partie des propositions.
  • Dans la plupart des cas, le cluster etcd fonctionne correctement s’il ne dépasse pas ce seuil. Si le fonctionnement est dégradé en raison d’une ressource insuffisante, réduisez la taille des données.
taille en octets limitation sur le nombre de clés seuil de taille de données suggéré (Mo) mémoire RSS consommée (Mo)
128 400K 48 2400
1024 300K 292 6500

5 - Benchmarking etcd v2.2.0-rc

Mesures de performance pour etcd v2.2.0-rc

Machine physique

Type de machine GCE n1-highcpu-2

  • 1 disque SSD local dédié monté sous /var/lib/etcd
  • 1 disque lent dédié pour le système d’exploitation
  • 1,8 Go de mémoire
  • 2 processeurs

etcd cluster

3 membres etcd 2.2.0-rc, chacun exécuté sur une seule machine.

Versions détaillées :

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

En outre, nous utilisons 3 membres etcd 2.1.0 en phase alpha pour constituer le cluster et obtenir des performances de base. La tête du commit d’etcd est située à c7146bd5 , identique à celle utilisée dans benchmark etcd 2.1 .

Test

Initialisez une autre machine et utilisez l’outil de benchmark HTTP hey pour envoyer des requêtes à chaque membre etcd. Consultez le guide de manipulation du benchmark pour des instructions détaillées.

Performances

lecture d’une seule clé

taille de la clé en octets nombre de clients serveur etcd cible débit de lecture (QPS) latence au 90e percentile (ms)
64 1 seul leader 2804 (-5%) 0,4 (+0 %)
64 64 seul leader 17816 (+0 %) 5,7 (-6%)
64 256 seul leader 18667 (-6%) 20,4 (+2 %)
256 1 seul leader 2181 (-15%) 0,5 (+25 %)
256 64 seul leader 17435 (-7%) 6,0 (+9 %)
256 256 seul leader 18180 (-8%) 21,3 (+3 %)
64 64 tous les serveurs 46965 (-4%) 2,1 (+0 %)
64 256 tous les serveurs 55286 (-6%) 7,4 (+6 %)
256 64 tous les serveurs 46603 (-6%) 2,1 (+5 %)
256 256 tous les serveurs 55291 (-6%) 7,3 (+4 %)

écriture d’une seule clé

taille de la clé en octets nombre de clients serveur etcd cible débit d’écriture QPS latence au 90e percentile (ms)
64 1 seul leader 76 (+22%) 19,4 (-15%)
64 64 seul leader 2461 (+45%) 31,8 (-32%)
64 256 seul leader 4275 (+1%) 69,6 (-10%)
256 1 seul leader 64 (+20%) 16,7 (-30%)
256 64 seul leader 2385 (+30%) 31,5 (-19%)
256 256 seul leader 4353 (-3%) 74,0 (+9%)
64 64 tous les serveurs 2005 (+81%) 49,8 (-55%)
64 256 tous les serveurs 4868 (+35%) 81,5 (-40%)
256 64 tous les serveurs 1925 (+72%) 47,7 (-59%)
256 256 tous les serveurs 4975 (+36%) 70,3 (-36%)

explication des modifications de performance

  • Le QPS de lecture est généralement réduit de 5 à 8 % dans la plupart des scénarios. La raison en est que etcd enregistre des métriques pour chaque opération de stockage. Ces métriques sont importantes pour la surveillance et le débogage, ce qui rend cette réduction acceptable.

  • Le QPS d’écriture vers le leader augmente de 20 à 30 %. Cela est dû à la déconnexion de la boucle principale Raft et de la boucle d’application des entrées, ce qui empêche leurs blocages mutuels.

  • Le débit d’écriture QPS sur tous les serveurs augmente de 30 à 80 % car le suiveur peut recevoir plus tôt l’index de validation le plus récent et valider les propositions plus rapidement.

6 - Benchmarking d'etcd v2.2.0

Mesures de performance pour etcd v2.2.0

Machines physiques

Type de machine GCE n1-highcpu-2

  • 1 disque SSD local dédié monté en répertoire de données etcd
  • 1 disque lent dédié pour le système d’exploitation
  • 1,8 Go de mémoire
  • 2 processeurs

etcd cluster

3 membres etcd 2.2.0, chacun exécuté sur une machine unique.

Versions détaillées :

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

Test

Initialisez une autre machine, en dehors du cluster etcd, puis exécutez l’outil de benchmark HTTP hey avec un correctif de réutilisation de connexion pour envoyer des requêtes à chaque membre du cluster etcd. Consultez les instructions de benchmark pour obtenir le correctif et les étapes permettant de reproduire nos procédures.

Les performances sont calculées à partir des résultats de 100 itérations de benchmark.

Performances

Performance de lecture d’une clé unique

taille de la clé en octets nombre de clients serveur etcd cible débit moyen de lecture (QPS) écart-type du débit de lecture (QPS) latence moyenne au 90e percentile (ms) écart-type de la latence
64 1 seul leader 2303 200 0,49 0,06
64 64 seul leader 15048 685 7,60 0,46
64 256 seul leader 14508 434 29,76 1,05
256 1 seul leader 2162 214 0,52 0,06
256 64 seul leader 14789 792 7,69 0,48
256 256 seul leader 14424 512 29,92 1,42
64 64 tous les serveurs 45752 2048 2,47 0,14
64 256 tous les serveurs 46592 1273 10,14 0,59
256 64 tous les serveurs 45332 1847 2,48 0,12
256 256 tous les serveurs 46485 1340 10,18 0,74

Performance d’écriture pour une clé unique

taille de la clé en octets nombre de clients serveur etcd cible débit moyen d’écriture QPS écart-type du débit d’écriture QPS latence moyenne au 90e percentile (ms) écart-type de la latence
64 1 leader uniquement 55 4 24,51 13,26
64 64 leader uniquement 2139 125 35,23 3,40
64 256 leader uniquement 4581 581 70,53 10,22
256 1 leader uniquement 56 4 22,37 4,33
256 64 leader uniquement 2052 151 36,83 4,20
256 256 leader uniquement 4442 560 71,59 10,03
64 64 tous les serveurs 1625 85 58,51 5,14
64 256 tous les serveurs 4461 298 89,47 36,48
256 64 tous les serveurs 1599 94 60,11 6,43
256 256 tous les serveurs 4315 193 88,98 7,01

Améliorations des performances

  • Comme etcd enregistre désormais des métriques pour chaque appel d’API, la performance en QPS de lecture semble légèrement diminuer dans la plupart des scénarios. Ce léger impact sur les performances a été jugé acceptable en échange de la richesse des informations de surveillance et de débogage fournies.

  • Le taux de requêtes d’écriture QPS vers les leaders du cluster semble avoir légèrement augmenté. Cela est dû au fait que la boucle principale et les boucles d’entrée ont été déconnectées dans la logique Raft d’etcd, éliminant plusieurs blocages entre elles.

  • Le QPS d’écriture vers tous les membres semble avoir augmenté de manière significative, car les suiveurs reçoivent désormais l’index de validation le plus récent plus rapidement, et traitent les propositions de validation plus rapidement.

7 - Test de performance d'etcd v2.1.0

Mesures de performance pour etcd v2.1.0

Machines physiques

Type de machine GCE n1-highcpu-2

  • 1 disque SSD local dédié monté sous /var/lib/etcd
  • 1 disque lent dédié pour le système d’exploitation
  • 1,8 Go de mémoire
  • 2 processeurs
  • version etcd 2.1.0 alpha

etcd cluster

3 membres etcd, chacun exécuté sur une machine unique

Test

Initialisez une autre machine et utilisez l’outil de benchmark HTTP hey pour envoyer des requêtes à chaque membre etcd. Consultez le guide de manipulation du benchmark pour des instructions détaillées.

Performances

lecture d’une seule clé

taille de la clé en octets nombre de clients serveur etcd cible QPS de lecture Latence au 90e percentile (ms)
64 1 seul leader 1534 0,7
64 64 seul leader 10125 9,1
64 256 seul leader 13892 27,1
256 1 seul leader 1530 0,8
256 64 seul leader 10106 10,1
256 256 seul leader 14667 27,0
64 64 tous les serveurs 24200 3,9
64 256 tous les serveurs 33300 11,8
256 64 tous les serveurs 24800 3,9
256 256 tous les serveurs 33000 11,5

écriture d’une seule clé

taille de la clé en octets nombre de clients serveur etcd cible débit d’écriture (QPS) latence au 90e percentile (ms)
64 1 seul leader 60 21,4
64 64 seul leader 1 742 46,8
64 256 seul leader 3 982 90,5
256 1 seul leader 58 20,3
256 64 seul leader 1 770 47,8
256 256 seul leader 4 157 105,3
64 64 tous les serveurs 1 028 123,4
64 256 tous les serveurs 3 260 123,8
256 64 tous les serveurs 1 033 121,5
256 256 tous les serveurs 3 061 119,3