2 Febbraio 2025

Migliorare le performance di MySQL e MariaDB con allocatori della memoria come Jemalloc e TCMalloc

Scopri come migliorare le prestazioni di MySQL e MariaDB ottimizzando l’allocazione della memoria con Jemalloc e TCMalloc, riducendo latenza e frammentazione per massimizzare l’efficienza.

Jemalloc-TCMalloc-MySQL-MariaDB-Performance-Malloc

Introduzione

Quando si gestiscono database ad alte prestazioni come MySQL e MariaDB, l’allocazione della memoria gioca un ruolo fondamentale nell’efficienza delle operazioni di lettura e scrittura. Gli allocatori di memoria standard, come il malloc di glibc, possono avere dei limiti in scenari di alto carico. Alternative come Jemalloc e TCMalloc offrono miglioramenti significativi nella gestione della memoria, riducendo la frammentazione e migliorando l’efficienza generale del database.

In questo articolo analizzeremo i vantaggi di Jemalloc e TCMalloc rispetto al malloc standard, come integrarli in MySQL e MariaDB, e come monitorarne le prestazioni.

Perché sostituire malloc di glibc?

L’allocatore di memoria fornito di default dalla libreria GNU C (malloc) è progettato per soddisfare un’ampia gamma di applicazioni, ma non è ottimizzato per ambienti ad alte prestazioni come database relazionali, in cui la gestione efficiente della memoria è fondamentale. Quando MySQL o MariaDB operano con grandi quantità di dati e richieste simultanee, malloc può diventare un collo di bottiglia, incidendo negativamente sulle prestazioni generali del sistema.

Ecco alcuni dei problemi principali che possono emergere con l’utilizzo di malloc in scenari di database ad alto carico:

1. Frammentazione della memoria

Uno dei principali problemi di malloc è la frammentazione della memoria, che si verifica quando la memoria viene allocata e liberata in modo non uniforme. Con il tempo, questo può portare a un aumento dello spazio inutilizzato, riducendo l’efficienza della memoria e causando un eccessivo consumo di RAM. In ambienti con carichi di lavoro intensivi, come i database, questa frammentazione può tradursi in un aumento dei costi operativi e in una minore stabilità del sistema.

2. Scalabilità limitata nei sistemi multi-threaded

Le moderne installazioni di MySQL e MariaDB utilizzano un’architettura altamente concorrente, con più thread che accedono simultaneamente alla memoria. malloc di glibc utilizza un sistema di lock globale che può limitare l’efficienza del database in presenza di molte connessioni simultanee. Questo può causare un effetto di contention, in cui i thread competono per l’accesso alle risorse di memoria, rallentando il tempo di risposta delle query e riducendo il throughput complessivo.

3. Prestazioni imprevedibili nel tempo

Poiché malloc non è specificamente progettato per carichi di lavoro costanti e intensivi, la sua efficienza può degradare con il tempo. A causa della gestione inefficiente delle allocazioni e delle deallocazioni, possono verificarsi problemi come il memory bloat, ovvero l’accumulo di memoria inutilizzata che non viene immediatamente restituita al sistema operativo. Questo può portare a un progressivo peggioramento delle prestazioni del database, con latenze più elevate nelle operazioni di lettura e scrittura.

4. Rilascio inefficiente della memoria

Un’altra limitazione di malloc è che non sempre restituisce al sistema operativo la memoria inutilizzata in modo tempestivo. Nei database ad alta intensità di operazioni, ciò può portare a un accumulo eccessivo di memoria residente (RSS), aumentando il rischio di swap e degradando le prestazioni generali del server.

Jemalloc

Cos’è Jemalloc?

Jemalloc è un allocatore di memoria sviluppato originariamente da Jason Evans per FreeBSD ed è utilizzato in molte applicazioni ad alte prestazioni come Redis e Facebook.

Vantaggi di Jemalloc:

  • Minore frammentazione della memoria
  • Migliore gestione della memoria nei workload multi-threaded
  • Maggiore efficienza nell’allocazione e deallocazione
  • Possibilità di debugging avanzato con strumenti di profiling

Installazione di Jemalloc

Su distribuzioni basate su AlmaLinux e RHEL, puoi installare Jemalloc con:

sudo dnf install jemalloc -y

Su Debian/Ubuntu:

sudo apt install libjemalloc-dev -y

Configurazione di MySQL/MariaDB con Jemalloc

Per far sì che MySQL o MariaDB utilizzi Jemalloc, puoi avviare il server con la libreria pre-caricata. Ad esempio:

LD_PRELOAD=/usr/lib64/libjemalloc.so.2 mysqld

Per rendere permanente la configurazione, modifica il file di servizio systemd:

sudo systemctl edit mariadb

Aggiungi le seguenti righe:

[Service]Environment="LD_PRELOAD=/usr/lib64/libjemalloc.so.2"

Poi ricarica il servizio:

sudo systemctl daemon-reexec

 

sudo systemctl restart mariadb

TCMalloc

Cos’è TCMalloc?

TCMalloc (Thread-Caching Malloc) è un altro allocatore ottimizzato, sviluppato da Google, ed è particolarmente utile per ridurre la latenza nei workload multi-threaded.

Vantaggi di TCMalloc:

  • Gestione avanzata del caching della memoria per ogni thread
  • Minore latenza nelle operazioni di allocazione e deallocazione
  • Prestazioni elevate in scenari di alto carico

Installazione di TCMalloc

Per installare TCMalloc su AlmaLinux/RHEL:

sudo dnf install gperftools-libs -y

Su Debian/Ubuntu:

sudo apt install libtcmalloc-minimal4 -y

Configurazione di MySQL/MariaDB con TCMalloc

Per pre-caricare TCMalloc all’avvio di MySQL o MariaDB, usa:

LD_PRELOAD=/usr/lib64/libtcmalloc_minimal.so.4 mysqld

Per rendere la configurazione permanente:

sudo systemctl edit mariadb

Aggiungi:

[Service]
Environment="LD_PRELOAD=/usr/lib64/libtcmalloc_minimal.so.4"

Poi riavvia il servizio:

sudo systemctl daemon-reexec

 

sudo systemctl restart mariadb

Confronto tra Jemalloc e TCMalloc

Caratteristica Jemalloc TCMalloc
Efficienza multi-threaded Alta Altissima
Frammentazione della memoria Bassa Media
Velocità di allocazione Ottima Ottima
Consumo di memoria Leggermente più alto Più basso
Debugging avanzato No

Se il tuo database ha problemi di frammentazione della memoria, Jemalloc è la scelta migliore. Se invece hai bisogno di ridurre la latenza nei workload multi-threaded, TCMalloc può offrire vantaggi superiori.

Benchmark JeMalloc TCMalloc Transazioni per secondo TPS

I test di benchmark hanno evidenziato significative differenze di prestazioni tra Jemalloc, TCMalloc e l’allocatore standard glibc malloc in diversi scenari di carico e configurazioni hardware.

malloc_test2_oltp_ro1

  • 4 vCPU: Con un numero limitato di core, le prestazioni sono risultate quasi identiche per tutti gli allocatori, con un throughput medio di circa 2500 TPS (transactions per second).
  • 8 vCPU: Il throughput di Jemalloc e TCMalloc è raddoppiato, raggiungendo 5000 TPS, mentre con glibc malloc si è osservato un calo significativo a 3500 TPS quando il numero di thread ha raggiunto 64-128.
  • 16 vCPU: Jemalloc e TCMalloc hanno mantenuto un incremento stabile del throughput fino a 6300 TPS fino a 4096 thread. Al contrario, con glibc malloc, il throughput è calato drasticamente dopo i 16 thread, stabilizzandosi intorno ai 4000 TPS.
  • 32 vCPU: Jemalloc e TCMalloc hanno mostrato un notevole miglioramento, raggiungendo un picco di 12500 TPS e mantenendo prestazioni elevate fino a 1024 thread, con una leggera diminuzione oltre questa soglia. Glibc malloc, invece, ha mostrato un drastico calo delle prestazioni, con TPS che sono scesi sotto i livelli registrati nei test a 8 e 16 vCPU, attestandosi intorno a 3100 TPS.

In sintesi, nei test OLTP_RO (Online Transaction Processing Read-Only) su un server con 32 vCPU, la differenza di performance tra glibc malloc e Jemalloc/TCMalloc è risultata essere di circa 4 volte superiore a favore degli allocatori avanzati. Questo evidenzia come, con un numero crescente di core e thread concorrenti, Jemalloc e TCMalloc garantiscano prestazioni più stabili e scalabili, riducendo drasticamente i colli di bottiglia causati dall’allocazione inefficiente della memoria con glibc malloc.

Considerazioni finali

  • Se il server ha 8 core o meno, non si osservano differenze significative tra glibc malloc e gli allocatori alternativi.
  • Se il server ha più di 8 core, è consigliabile provare ed effettuare benchmark con Jemalloc o TCMalloc, poiché possono migliorare significativamente le prestazioni di MySQL senza costi aggiuntivi.
  • Se si eseguono test di benchmark su server multi-core, è essenziale abilitare un allocatore di memoria alternativo, altrimenti le prestazioni saranno limitate da glibc malloc piuttosto che dal motore MySQL stesso.

Conclusioni

L’uso di un allocatore di memoria ottimizzato come Jemalloc o TCMalloc può migliorare significativamente le prestazioni di MySQL e MariaDB in ambienti di produzione, specialmente in presenza di carichi di lavoro elevati. Jemalloc si distingue per la sua capacità di ridurre la frammentazione della memoria, garantendo una gestione più efficiente e offrendo strumenti avanzati per il debugging. D’altra parte, TCMalloc è progettato per ridurre la latenza delle operazioni di allocazione e deallocazione, migliorando le prestazioni nei sistemi multi-threaded ad alto parallelismo.

I benchmark dimostrano che l’adozione di uno di questi allocatori può ridurre il consumo di RAM, migliorare il throughput delle query e garantire maggiore stabilità operativa nel tempo. Tuttavia, la scelta dell’allocatore ideale dipende dal tipo di workload del database: Jemalloc è spesso la scelta migliore per ambienti in cui la gestione della memoria deve essere più prevedibile e ottimizzata, mentre TCMalloc è preferibile nei contesti in cui la riduzione della latenza e la velocità di allocazione sono prioritarie.

Se il tuo obiettivo è massimizzare l’efficienza della memoria e migliorare la scalabilità del database, considera la migrazione a Jemalloc o TCMalloc. Dopo l’implementazione, monitora attentamente le prestazioni del database con strumenti di benchmarking e analisi della memoria per garantire il massimo beneficio e per adattare la configurazione alle specifiche esigenze della tua infrastruttura.

Hai dei dubbi? Non sai da dove iniziare? Contattaci !

Abbiamo tutte le risposte alle tue domande per aiutarti nella giusta scelta.

Chatta con noi

Chatta direttamente con il nostro supporto prevendita.

0256569681

Contattaci telefonicamente negli orari d’ufficio 9:30 – 19:30

Contattaci online

Apri una richiesta direttamente nell’area dei contatti.

INFORMAZIONI

Managed Server S.r.l. è un player italiano di riferimento nel fornire soluzioni avanzate di sistemistica GNU/Linux orientate all’alta performance. Con un modello di sottoscrizione dai costi contenuti e prevedibili, ci assicuriamo che i nostri clienti abbiano accesso a tecnologie avanzate nel campo dell’hosting, server dedicati e servizi cloud. Oltre a questo, offriamo consulenza sistemistica su sistemi Linux e manutenzione specializzata in DBMS, IT Security, Cloud e molto altro. Ci distinguiamo per l’expertise in hosting di primari CMS Open Source come WordPress, WooCommerce, Drupal, Prestashop, Joomla, OpenCart e Magento, affiancato da un servizio di supporto e consulenza di alto livello adatto per la Pubblica Amministrazione, PMI, ed aziende di qualsiasi dimensione.

Red Hat, Inc. detiene i diritti su Red Hat®, RHEL®, RedHat Linux®, e CentOS®; AlmaLinux™ è un marchio di AlmaLinux OS Foundation; Rocky Linux® è un marchio registrato di Rocky Linux Foundation; SUSE® è un marchio registrato di SUSE LLC; Canonical Ltd. detiene i diritti su Ubuntu®; Software in the Public Interest, Inc. detiene i diritti su Debian®; Linus Torvalds detiene i diritti su Linux®; FreeBSD® è un marchio registrato di The FreeBSD Foundation; NetBSD® è un marchio registrato di The NetBSD Foundation; OpenBSD® è un marchio registrato di Theo de Raadt. Oracle Corporation detiene i diritti su Oracle®, MySQL®, e MyRocks®; Percona® è un marchio registrato di Percona LLC; MariaDB® è un marchio registrato di MariaDB Corporation Ab; REDIS® è un marchio registrato di Redis Labs Ltd. F5 Networks, Inc. detiene i diritti su NGINX® e NGINX Plus®; Varnish® è un marchio registrato di Varnish Software AB. Adobe Inc. detiene i diritti su Magento®; PrestaShop® è un marchio registrato di PrestaShop SA; OpenCart® è un marchio registrato di OpenCart Limited. Automattic Inc. detiene i diritti su WordPress®, WooCommerce®, e JetPack®; Open Source Matters, Inc. detiene i diritti su Joomla®; Dries Buytaert detiene i diritti su Drupal®. Amazon Web Services, Inc. detiene i diritti su AWS®; Google LLC detiene i diritti su Google Cloud™ e Chrome™; Microsoft Corporation detiene i diritti su Microsoft®, Azure®, e Internet Explorer®; Mozilla Foundation detiene i diritti su Firefox®. Apache® è un marchio registrato di The Apache Software Foundation; PHP® è un marchio registrato del PHP Group. CloudFlare® è un marchio registrato di Cloudflare, Inc.; NETSCOUT® è un marchio registrato di NETSCOUT Systems Inc.; ElasticSearch®, LogStash®, e Kibana® sono marchi registrati di Elastic N.V. Hetzner Online GmbH detiene i diritti su Hetzner®; OVHcloud è un marchio registrato di OVH Groupe SAS; cPanel®, L.L.C. detiene i diritti su cPanel®; Plesk® è un marchio registrato di Plesk International GmbH; Facebook, Inc. detiene i diritti su Facebook®. Questo sito non è affiliato, sponsorizzato o altrimenti associato a nessuna delle entità sopra menzionate e non rappresenta nessuna di queste entità in alcun modo. Tutti i diritti sui marchi e sui nomi di prodotto menzionati sono di proprietà dei rispettivi detentori di copyright. Ogni altro marchio citato appartiene ai propri registranti. MANAGED SERVER® è un marchio registrato a livello europeo da MANAGED SERVER SRL, Via Enzo Ferrari, 9, 62012 Civitanova Marche (MC), Italia.

Torna in alto