Table des matières de l'article :
Introduction
Lors de la gestion de bases de données hautes performances telles que MySQL et MariaDB, l'allocation de mémoire est cruciale pour l'efficacité des opérations de lecture et d'écriture. Les allocateurs de mémoire standard, comme `malloc` de glibc, peuvent s'avérer insuffisants en cas de forte charge. Des alternatives telles que Jemalloc et TCMalloc offrent des améliorations significatives en matière de gestion de la mémoire, réduisant la fragmentation et optimisant ainsi l'efficacité globale de la base de données.
Dans cet article, nous examinerons les avantages de Jemalloc et TCMalloc par rapport au malloc standard, comment les intégrer dans MySQL et MariaDB et comment surveiller leurs performances.
Pourquoi remplacer malloc par glibc ?
L'allocateur de mémoire fourni par défaut par la bibliothèque GNU C (malloc) est conçu pour répondre à une large gamme d'applications, mais n'est pas optimisé pour les environnements hautes performances tels que les bases de données relationnelles, où une gestion efficace de la mémoire est essentielle. Lorsque MySQL ou MariaDB fonctionnent avec de grandes quantités de données et des requêtes simultanées, malloc peut devenir un goulot d’étranglement, impactant négativement les performances globales du système.
Voici quelques-uns des principaux problèmes qui peuvent survenir avec l'utilisation de malloc dans les scénarios de bases de données à charge élevée :
1. Fragmentation de la mémoire
L’un des principaux problèmes de malloc Il s’agit d’une fragmentation de la mémoire, qui se produit lorsque la mémoire est allouée et libérée de manière inégale. Au fil du temps, cela peut entraîner une augmentation de l’espace inutilisé, réduisant l’efficacité de la mémoire et provoquant une consommation excessive de RAM. Dans les environnements à forte charge de travail, tels que les bases de données, cette fragmentation peut entraîner une augmentation des coûts d’exploitation et une diminution de la stabilité du système.
2. Évolutivité limitée dans les systèmes multithread
Les installations MySQL et MariaDB modernes utilisent une architecture hautement simultanée, avec plusieurs threads accédant simultanément à la mémoire. malloc glibc utilise un système de verrouillage global qui peut limiter l'efficacité de la base de données s'il existe de nombreuses connexions simultanées. Cela peut provoquer un effet secondaire contention, où les threads se disputent l'accès aux ressources mémoire, ce qui ralentit le temps de réponse des requêtes et réduit le débit global.
3. Des performances imprévisibles au fil du temps
parce que malloc Il n'est pas spécifiquement conçu pour des charges de travail constantes et intensives, son efficacité peut se dégrader avec le temps. En raison d’une gestion inefficace des allocations et des désallocations, des problèmes tels que ballonnement de la mémoire, ou l’accumulation de mémoire inutilisée qui n’est pas immédiatement restituée au système d’exploitation. Cela peut conduire à une dégradation progressive des performances de la base de données, avec des latences plus élevées dans les opérations de lecture et d'écriture.
4. Libération de mémoire inefficace
Une autre limitation de malloc c'est qu'il ne restitue pas toujours la mémoire inutilisée au système d'exploitation en temps voulu. Dans les bases de données très intensives, cela peut conduire à une accumulation excessive de mémoire résidente (RSS), augmentant le risque d'échange et dégradant les performances globales du serveur.
Jemalloc
Qu'est-ce que Jemalloc ?
Jemalloc est un allocateur de mémoire développé à l'origine par Jason Evans pour FreeBSD et utilisé dans de nombreuses applications hautes performances telles que Redis et Facebook.
Avantages de Jemalloc :
- Moins de fragmentation de la mémoire
- Meilleure gestion de la mémoire dans les charges de travail multithread
- Une plus grande efficacité dans l'allocation et la désallocation
- Capacités de débogage avancées avec outils de profilage
Installation de Jemalloc
Sur les distributions basées sur AlmaLinux et RHEL , vous pouvez installer Jemalloc avec :
sudo dnf install jemalloc -y
Sur Debian/Ubuntu :
sudo apt install libjemalloc-dev -y
Configuration de MySQL/MariaDB avec Jemalloc
Pour que MySQL ou MariaDB utilise Jemalloc, vous pouvez démarrer le serveur avec la bibliothèque préchargée. Par exemple:
LD_PRELOAD=/usr/lib64/libjemalloc.so.2 mysqld
Pour rendre la configuration permanente, modifiez le fichier de service systemd :
sudo systemctl edit mariadb
Ajoutez les lignes suivantes :
[Service]Environment="LD_PRELOAD=/usr/lib64/libjemalloc.so.2"
Rechargez ensuite le service :
sudo systemctl daemon-reexec
sudo systemctl restart mariadb
TCMalloc
Qu'est-ce que TCMalloc ?
TCMalloc (Thread-Caching Malloc) est un autre allocateur optimisé, développé par Google, et est particulièrement utile pour réduire la latence dans les charges de travail multithread.
Avantages de TCMalloc :
- Gestion avancée de la mise en cache de la mémoire pour chaque thread
- Latence réduite dans les opérations d'allocation et de désallocation
- Hautes performances dans des scénarios de charge élevée
Installation de TCMalloc
Pour installer TCMalloc sur AlmaLinux/RHEL :
sudo dnf install gperftools-libs -y
Sur Debian/Ubuntu :
sudo apt install libtcmalloc-minimal4 -y
Configuration de MySQL/MariaDB avec TCMalloc
Pour précharger TCMalloc au démarrage de MySQL ou MariaDB, utilisez :
LD_PRELOAD=/usr/lib64/libtcmalloc_minimal.so.4 mysqld
Pour rendre la configuration permanente :
sudo systemctl edit mariadb
Ajouter:
[Service] Environment="LD_PRELOAD=/usr/lib64/libtcmalloc_minimal.so.4"
Redémarrez ensuite le service :
sudo systemctl daemon-reexec
sudo systemctl restart mariadb
Comparaison entre Jemalloc et TCMalloc
| caratteristica | Jemalloc | TCMalloc |
|---|---|---|
| Efficacité multithread | Élevée | Très haut |
| Fragmentation de la mémoire | Bassa | médias |
| Vitesse d'allocation | Excellent | Excellent |
| Consommation de mémoire | Légèrement plus haut | Plus bas |
| Débogage avancé | Oui | Non |
Si votre base de données rencontre des problèmes de fragmentation de la mémoire, Jemalloc est la meilleure solution. Toutefois, si vous devez réduire la latence dans les charges de travail multithread, TCMalloc peut s'avérer plus avantageux.
Benchmark JeMalloc TCMalloc Transactions par seconde TPS
Les tests de référence ont montré des différences de performances significatives entre Jemalloc , TCMalloc et l' allocateur standard glibc malloc dans divers scénarios de charge et configurations matérielles.
- 4 vCPU:Avec un nombre limité de cœurs, les performances étaient presque identiques pour tous les allocateurs, avec un débit moyen d'environ 2500 TPS (transactions par seconde).
- 8 vCPU:Le débit de Jemalloc e TCMalloc a doublé, atteignant 5000 TPS, alors qu'avec glibc malloc une diminution significative a été observée dans 3500 TPS lorsque le nombre de fils a atteint 64-128.
- 16 vCPU: Jemalloc e TCMalloc ont maintenu une augmentation stable du débit jusqu'à 6300 TPS jusqu'à 4096 threads. Au contraire, avec glibc malloc, le débit a chuté de façon spectaculaire après la fil 16, se stabilisant autour de la 4000 TPS.
- 32 vCPU: Jemalloc e TCMalloc ont montré une amélioration significative, atteignant un pic de 12500 TPS et maintenir des performances élevées jusqu'à fil 1024, avec une légère diminution au-dessus de ce seuil. Glybc malloc, au lieu de cela, a montré une baisse drastique des performances, avec un TPS tombant en dessous des niveaux enregistrés dans les tests à 8 et 16 vCPU, s'installant autour 3100 TPS.
En résumé, lors des tests OLTP_RO (traitement transactionnel en lecture seule) sur un serveur à 32 vCPU , l'écart de performance entre glibc malloc et Jemalloc/TCMalloc était d'environ quatre fois, en faveur des allocateurs avancés. Ceci souligne comment, avec un nombre croissant de cœurs et de threads simultanés, Jemalloc et TCMalloc offrent des performances plus stables et évolutives , réduisant considérablement les goulots d'étranglement causés par l'allocation mémoire inefficace de glibc malloc.
pensées finales
- Si le serveur a 8 cœurs ou moins, aucune différence significative n'est observée entre glibc malloc et des répartiteurs alternatifs.
- Si le serveur a plus de 8 cœurs, il est conseillé d'essayer de comparer avec Jemalloc ou TCMalloc, car ils peuvent améliorer considérablement les performances de MySQL sans frais supplémentaires.
- Si vous exécutez des tests d'évaluation sur des serveurs multicœurs, il est essentiel d'activer un allocateur de mémoire alternatif, sinon les performances seront limitées par glibc malloc plutôt que le moteur MySQL lui-même.
Conclusions
L'utilisation d'un allocateur de mémoire optimisé comme Jemalloc ou TCMalloc peut améliorer considérablement les performances de MySQL et MariaDB en production, notamment en cas de charges de travail importantes. Jemalloc se distingue par sa capacité à réduire la fragmentation de la mémoire, garantissant une gestion plus efficace et offrant des outils de débogage avancés. TCMalloc, quant à lui, est conçu pour réduire la latence des opérations d'allocation et de libération, améliorant ainsi les performances dans les systèmes multithreadés hautement parallèles.
Les tests comparatifs montrent que l'adoption de l'un de ces allocateurs peut réduire la consommation de RAM, améliorer le débit des requêtes et garantir une meilleure stabilité opérationnelle dans le temps. Cependant, l'allocateur idéal dépend du type de charge de travail de la base de données : Jemalloc est souvent le meilleur choix pour les environnements où la gestion de la mémoire doit être plus prévisible et optimisée, tandis que TCMalloc est préférable lorsque la réduction de la latence et la vitesse d'allocation sont prioritaires.
Si votre objectif est d'optimiser l'utilisation de la mémoire et d'améliorer la scalabilité de votre base de données, envisagez une migration vers Jemalloc ou TCMalloc . Après la mise en œuvre, surveillez attentivement les performances de votre base de données à l'aide d'outils d'analyse comparative et d'analyse de la mémoire afin d'en maximiser les bénéfices et d'adapter la configuration aux besoins spécifiques de votre infrastructure.

