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 joue un rôle essentiel dans l'efficacité des opérations de lecture et d'écriture. Les allocateurs de mémoire standard, tels que malloc de glibc, peuvent avoir des limitations dans les scénarios de charge élevée. Des alternatives telles que Jemalloc e TCMalloc offrent des améliorations significatives dans la gestion de la mémoire, réduisant la fragmentation et améliorant 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 SoulLinux e 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 présente des problèmes de fragmentation de la mémoire, Jemalloc C'est le meilleur choix. Si vous avez besoin de réduire la latence dans les charges de travail multithread, TCMalloc peut offrir des avantages supérieurs.
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 différents 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 bref, dans les tests OLTP_RO (Traitement des transactions en ligne en lecture seule) sur un serveur avec 32 vCPU, la différence de performance entre glibc malloc e Jemalloc/TCMalloc Il s'est avéré que c'était environ 4 fois plus haut en faveur des allocateurs avancés. Cela montre comment, avec un nombre croissant de cœurs et de threads concurrents, Jemalloc et TCMalloc garantissent des performances plus stables et évolutives, réduisant considérablement les goulots d'étranglement causés par une allocation de mémoire inefficace avec 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
En utilisant un allocateur de mémoire optimisé comme Jemalloc o TCMalloc peut améliorer considérablement les performances de MySQL et MariaDB dans les environnements de production, en particulier sous de lourdes charges de travail. Jemalloc se distingue par sa capacité à réduire la fragmentation de la mémoire, assurant une gestion plus efficace et offrant des outils de débogage avancés. D'autre part, TCMalloc Il est conçu pour réduire la latence des opérations d'allocation et de désallocation, améliorant ainsi les performances dans les systèmes hautement parallèles et multithreads.
Les tests 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 plus grande stabilité opérationnelle au fil du temps. Cependant, le choix de l'allocateur idéal dépend du type de charge de travail de la base de données : Jemalloc C'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 Il est préférable dans les contextes où la réduction de la latence et la vitesse d'allocation sont des priorités.
Si votre objectif est de maximiser l'efficacité de la mémoire et d'améliorer l'évolutivité de la base de données, envisagez de migrer vers Jemalloc o TCMalloc. Après la mise en œuvre, surveillez attentivement les performances de la base de données avec des outils d’analyse comparative et de mémoire pour garantir un bénéfice maximal et adapter la configuration aux besoins spécifiques de votre infrastructure.