Vue imprimable multi-pages de cette section. .
Benchmarks
- 1: Benchmark de l'utilisation de la mémoire de stockage
- 2: Benchmark de l'utilisation mémoire de la surveillance
- 3: Benchmarking d'etcd v3
- 4: Benchmarking etcd v2.2.0-rc-memory
- 5: Benchmarking etcd v2.2.0-rc
- 6: Benchmarking d'etcd v2.2.0
- 7: Test de performance d'etcd v2.1.0
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
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.
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
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.
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
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
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
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 RSSest 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
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 :
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
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 :
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
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 |