Ottimizzare Mysql per Magento

Esistono migliaia di articoli online che parlano di Magento e come configurare Mysql, Apache, Php e Application. Ma ogni articolo parla della singola esperienza di chi l’ha scritto senza mai dare delle semplici regole da seguire per realizzare la propria configurazione ed ottimizzare quindi le prestazione relativamente alle risorse a disposizione.

Prendiamo la configurazione di Mysql. Come fare ad ottimizzare le prestazione del DataBase??

Magento utilizza InnoDb. Esistono DataBase molto piu’ perferrmanti per InnoDB (ne tratterermo in un altro approfondimento). Avendo a disposizione, oppure perchè semplicemente lo conosciamo e già lo utilizziamo, un MySql, cerchiamo di farlo funzionare al meglio.

Intanto accertiamoci di usare sempre l’ultima versione disponibile. E’ banale, certo. Ma quante consulenze mi son trovato a fare trovandomi versioni di anni fa che non avevano le migliorie prestazionali di oggi!

Poi accertiamoci di quanta RAM abbiamo a disposizione. Se stiamo parlando di un ecommerce con alto traffico pensiamo di mettere un server ad hoc per MySql che abbia tanta memoria senza dar molto conto alla potenza di calcolo.

Trovato quanta ram possiamo dedicare al DB, andiamo ad ottimizzare le prestazioni di Mysql: di default la configurazione di Mysql è molto conservativa….deve andare bene per tutti…per chi ha 128GB di ram ma anche per chi ne ha solo 1GB e insieme fa girare apache2 o ngix.

Aumentare la memoria a disposizione per mysql (e innodb in particolare), come dicono gli americani, aumenta in modo drammatico le prestazioni. Pensiamo di darel’80% della memoria a disposizione al dbserver se lo abbiamo dedicato! E almeno la metà della memoria a disposizione se sulla macchina girano anche altri servizi!

Il parametro più importante da modificare immediatamente è innodb_buffer_pool_size ed è quello che indica quanta memoria può essere usata per memorizzare in RAM i dati (e quindi evitare accessi al disco continui).

Che dato dare dunque al buffer?

Mettiamo che abbiamo un server su cui risiede sia il webserver che Mysql, con 8 giga di ram: dedichiamo a innodb_buffer_pool_size 4GB 

Per essere più chiaro e meno ripetitivo faccio una tabella

TIPOLOGIA DI SERVERRAM A DISPOSIZIONERAM DA DEDICARE
Webserver+mysql8GB RAM4GB RAM
Webserver+mysql16GB RAM10GB RAM
DBserver dedicato6GB RAM5GB RAM
DBserver dedicato12GB RAM10GB RAM
DBserver dedicato24GB RAM20GB RAM

 

Ho messo i tagli su server dedicato di 6, 12 e 24 GB di RAM perchè sono i tipici dei server IBM G7 che normalmente ed attualmente uso insieme ad RDS di Amazon. Ma credo sia chiaro quanto dedicare anche con altre configurazioni.

A questo punto andiamo sugli altri parametri essenziali al miglioramento delle prestazioni

innodb_thread_concurrency

Qui è semplice, basta mettere

2 * [numerodicpuadisposizione] + 2

thread_concurrency

Anche qua si usa la formula

3 * [numerodicpuadisposizione]

Altro parametro importante è innodb_flush_log_at_trx_commit

I valori che si possono dare sono 0 velocità, 1 sicurezza, 2 mixed. Il valore migliore per Magento è 2

Inserire poi

innodb_autoextend_increment = 512

A questo punto il più è fatto. Non serve spingere tanto il resto….quello che serve veramente è stato messo e il resto sarà consigliato da MySQLTuner , un utilissimo script in perl per la verifica dei parametri di Mysql rispetto all’ambiente dove viene usato.

Consigli, esperienze e trucchi sono ben accetti nei commenti!!

 

Tags: