Ottimizzare un CMS Open Source

Ottimizzare un CMS Open Source

Negli ultimi anni il web è stato invaso da siti costruiti grazie a CMS Open Source, come ad esempio WordPress o Drupal, e se da un lato sono profondamente soddisfatto di questo trend, dall'altro lato non posso negare che l'essenza stessa del Free Software e dell'Open Source (che non sono esattamente la stessa cosa) permette anche a chi non è un drago di programmazione a distribuire codice sorgente di bassa qualità. Potrebbe sembrare una debolezza, ma il bello di avere il codice sorgente a disposizione di tutti è che chiunque può trovare i problemi, correggerli, e quindi rendere il software migliore.

Dopo questa doverosa premessa a favore del Free Software (ed in sostanza al software Open Source nell'accezione più vicina ai concetti di software libero), passiamo all'argomento di questo articolo: semplici trucchi e consigli per l'ottimizzazione di un CMS.

Perché è necessario ottimizzare?

Il punto sottolineato nell'introduzione, ovvero che chiunque, anche i meno esperti, può contribuire nello sviluppo del software libero, lo sto riscontrando spesso nei CMS. Me ne accorgo soprattutto per quanto riguarda le prestazioni dei siti web.

La mancanza di basi teoriche solide legate alla complessità del software, alle tecniche di ottimizzazione di programmazione e delle basi di dati, influisce pesantemente nelle performance del prodotto finale. Anche in questi giorni mi sono scontrato con sviluppatori volenterosi che hanno reso disponibile al mondo intero il frutto dei loro sforzi, ma senza avere la benché minima idea dell'importanza di concetti come le chiavi primarie o di come funziona un join.

Spesso si tratta di codice che viene testato in siti di piccole dimensioni e quindi gli autori non si rendono conto dell'impatto negativo nei confronti dell'uso delle risorse macchina. Non appena si passa in un ambiente di dimensioni maggiori la mancanza di basi solide si fa sentire... eccome se si fa sentire!

In particolare sto scoprendo diversi moduli per Drupal che soffrono questo problema e rallentano paurosamente i siti web dove sono installati.

Come ottimizzare un CMS?

Come si può fare quindi a migliorare le prestazioni di un sito web basato su un CMS di cui possiamo modificare il codice sorgente?

Non essendo gli autori originali del codice, non possiamo conoscere con precisione tutto il funzionamento del sistema, si rende quindi necessario un approccio empirico per identificare i colli di bottiglia, analizzarli e quindi si rende necessario cercare delle soluzioni.

Nella mia esperienza ho riscontrato che la maggior parte dei problemi di performance sono legati a query scritte male o ad una progettazione non ottimale della struttura del database. Cominciamo quindi proprio dal database con un semplice metodo per rendere più veloce il sito.

Ottimizzare le query ed il database

Prendiamo come esempio MySQL, la prima operazione è quella di attivare il log delle query lente (Slow Query Log). Per farlo bisogna aggiungere nel file my.cnf le seguenti direttive nella sezione [mysqld]:

log-slow-queries
long_query_time = 1

Al posto di "1" inserire il numero di secondi per cui si reputa una query "lenta", questo valore dipende dalle dimensioni della base di dati e dalle elaborazioni che vengono effettuate. MySQL imposta 10 secondi come valore di default. Si può anche cominciare con 10 secondi e poi procedere progressivamente con valori inferiori. Riavviamo MySQL ed aspettiamo un giorno o due, il tempo necessario per raccogliere un po' di dati. I log delle query lente di MySQL sono salvati tipicamente in /var/lib/mysql/.

A questo punto si può procedere con analisi del log per scoprire quali sono le query che più rallentano il sistema. Quindi, grazie allo statement EXPLAIN, possiamo analizzare più in dettaglio ogni interrogazione e determinare se è possibile apportare un miglioramento. Ad esempio ritoccando la struttura degli indici o migliorando l'uso di JOIN, COUNT o sub query.

Come isolare ed ottimizzare le query in PostgreSQL

Anche con il database PostgreSQL la metodologia è la medesima. Per prima cosa si abilita il log delle query modificando il file postgresql.conf con i seguenti parametri:

logging_collector = on
log_directory = 'pg_log'
log_min_duration_statement = 500

Attenzione: in PostgreSQL l'unità di misura del tempo per isolare le query lente è in millisecondi.

Il log verrà salvato nella directory 'pg_log' che si trova all'interno della directory dei dati di PostgreSQL. Anche in questo caso è necessario riavviare il server ed attendere un po' di tempo per raccogliere dei dati significativi.

Come in MySQL, anche con PostgreSQL è possibile procedere all'analisi delle query così da poter trovare delle soluzioni meno pesanti.

Poche query veloci ma eseguite troppe volte?

Un altro collo di bottiglia potrebbe essere dovuto all'esecuzione della stessa query troppe volte ingiustificatamente. È un po' più difficile trovarle, ma dopo averle identificate si potranno applicare tecniche di caching ed in generale di ottimizzazione dell'algoritmo che le richiama.

Altri trucchi per l'ottimizzazione...

Questi consigli non sono ovviamente gli unici trucchi per l'ottimizzazione. In questo articolo mi sono concentrato esclusivamente sul CMS ed in particolare nel database, ma chi è interessato a migliorare le prestazioni di un sito web dovrebbe procedere anche con l'ottimizzazione dei parametri di configurazione del web server e del database server stesso.