Magento, uno dei software per l’ecommerce più utilizzati al mondo, se non opportunamente configurato è molto ingordo di risorse e il rischio di schiantare la macchina che lo ospita è tutt’altro che remoto.
Vi racconto una storia.
C’era una volta un sito dove girava Magento CE (community edition). Con grande soddisfazione dei proprietari dopo un paio d’anni dalla pubblicazione del sito gli affari andavano molto bene e girava abbastanza traffico da giustificare un hosting serio, praticamente risorse illimitate.
Il database girava su una macchina dedicata, utilizzando l’ultima release di Percona Server, il fork di MySQL.
Le performance inizialmente buone, a mano a mano, che il database aumentava di “volume”, diventavano sempre più problematiche: query lentissime, un sacco di deadlock, ore (ore!!!) di waiting for table level lock
, rendendo di fatto la situazione insostenibile.
Armato di santa pazienza, come si fa in questi casi, cerco su Stack Overflow e nella documentazione Percona ovviamente, una possibile soluzione.
I consigli che ne ho ricavato sono abbastanza ovvi ma inefficaci: aumentare il lock wait timeout
di InnoDb, settare la transaction isolation
a READ-COMMITTED. Ma il database si schiantava ancora ogni tre per due.
Fino a che non trovo un post che consiglia di utilizzare https://github.com/major/MySQLTuner-perl.
MySQLTuner è uno script scritto in Perl che ti permette di rivedere rapidamente le configurazioni di un’installazione di MySQL e ti suggerisce le modifiche da apportare per aumentare le prestazioni e la stabilità.
Facilissimo da utilizzare, anche da remoto. Non apporta modifiche direttamente al database, questo è molto importante, ma dopo aver analizzato i log e le configurazioni correnti ti fornisce una serie di suggerimenti.
Nel caso citato sopra, MySQLTuner si è rivelata la provvidenziale manna: dopo aver apportato alcune delle modifiche suggerite il database è tornato a livelli di perfomance davvero ottime. Dopo questo intervento non ha più avuto problemi e down.