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.