Il Problema...
Tutto ebbe inizio il pomeriggio 29 di settembre 2005, giorno nel quale il servizio assistenza della società di hosting che ospita il Motoclub-Tingavert.it ci sospese per diversi minuti l'account in quanto utilizzavamo troppe risorse del server e ne provocavamo il blocco (notare che da qualche giorno ero soddisfatto perché finalmente avevo terminato alcuni lavori lunghi, impegnativi e importanti di programmazione e organizzazione del sito e mi stavo preparando psicologicamente a fare altri lavoretti in sospeso da diverse settimane...). Avevamo quindi iniziato a discutere del problema in questo topic.
Il nostro sito è stato realizzato inizialmente con un programma di CMS (Content Management System = Sistema di Gestione dei Contenuti) che si chiama PHP-Nuke, sistema molto bello e personalizzabile che però ha il difetto di effettuare molte chiamate al database (in gergo tecnico query), cioè in definitiva di utilizzare molte risorse del server. Questo problema si riscontra quando il numero di utenti diventa elevato ed è quindi il nostro caso.
Inoltre, con la creazione dei subforums, il codice per la visualizzazione di alcune pagine era diventato leggermente più oneroso per il server.
In aggiunta, sul server che ospita il nostro dominio era presente un altro sito che quando raggiungeva circa i 22 utenti online effettuava talmente tante chiamate al database che ne provocava il crash e conseguente blocco del server (come è avvenuto l'ultima volta mercoledì di questa settimana)
Infine, in quel pomeriggio era anche in corso un'operazione di backup del nostro database (il database è il contenitore di tutti i dati aggiornabili del sito, cioè i messaggi del forum, gli articoli del sito, i dati degli utenti eccetera) e questo sommato a quanto descritto in precedenza ci elencava come possibili responsabili o corresponsabili del blocco del server. Il backup del database fu tolto immediatamente e ora viene effettuato soltanto di notte, a orari programmati, e non più al pomeriggio.
Personalmente credo che il blocco vero e proprio del server non fosse dovuto a noi ma comunque l'utilizzo che facevamo del database era eccessivo e quindi era necessario correre ai ripari, non tanto per il problema attuale che si sarebbe potuto risolvere prendendo un server dedicato (cioè tutto per noi) o un VPS (server dedicato virtuale) ma perché non saremmo potuti crescere ancora più di tanto perché con un tot di visitatori in più la CPU sarebbe stato il "collo di bottiglia".
...la soluzione...
La soluzione che si prospettava era... di esaminare riga per riga e riprogrammare gran parte del codice del sito in modo che durante l'esecuzione dei programmi le chiamate al database fossero il minor numero possibile, strada che sinceramente prima di pensarci non sapevo nemmeno dove ci avrebbe portato.
Tanto per capire, nel momento in cui un utente richiedeva una pagina del forum (o del sito), il programma PHP-Nuke, oltre alle chiamate indispensabili, eseguiva anche le seguenti chiamate al database per:
- rilevare i dati di configurazione del sito (e-mail amministratore, tema di default ecc.)
- scrivere il titolo della pagina
- calcolare il numero di utenti online
- visualizzare i blocchi di navigazione attivati dall'amministratore del sito
- visualizzare gli ultimi 6 titoli di messaggi del forum, sul box a sinistra
- visualizzare il numero di utenti in chat (quando c'era)
- rilevare i moderatori dei vari forum
- incrementare il contatore delle visualizzazioni del forum
- incrementare il contatore delle pagine
- ... e tante, ma tante, altre chiamate.
L'ottimizzazione è quindi consistita in una prima fase molto semplice di
eliminazione di alcune cose che anche se erano utili non erano indispensabili
(contatore delle pagine - cambio della chat - numero di visualizzazioni delle
letture dei topic ecc.) e in una seconda fase di staticizzazione dei
contenuti. Cioè, dato che la configurazione del forum è sempre la stessa
finché non viene variata dall'amministratore, che bisogno c'è di caricarla ogni
volta dal database? Ora viene quindi generato un file sul quale sono contenuti
tutti i dati statici del sito e, quando li vario, con un pulsante rigenero il
file.
La terza fase riguarda la generazione dei contenuti semistatici, cioè
quei contenuti che variano continuamente ma se vengono salvati ogni tot minuti
in un file e visualizzati "vecchi" di questi tot minuti non succede nulla (ad
esempio, il numero di utenti online, il numero totale di msg del forum).
Perciò, la parte più consistente di modifica del codice del sito ha riguardato l'eliminazione delle query (cioè delle chiamate al database) inutili portando i contenuti generati in un file statico e in un file semistatico, quest'ultimo con aggiornamento che attualmente avviene una volta al minuto.
Cosa è cambiato in sostanza per l'utente?
Tutte le query il cui risultato è stato riportato nel file statico sono assolutamente trasparenti per l'utente che quindi all'esterno non vede nessuna variazione rispetto a prima.
Quello che invece si può notare è che:
- la chat è stata spostata su IRC, il canale è #tingavert
- il numero di consultazioni nei topic è scomparso
- il nome dei moderatori dei forum viene riportato ma è assente il link
- sono state tolte le statistiche delle pagine viste del sito
- quando si scrive un messaggio nel forum, il codice dello smilie viene immediatamente convertito nel codice HTML dell'immagine
- gli utenti bannati possono ora accedere in visualizzazione del forum ma compare il messaggio di ban quando cercano di postare un nuovo messaggio oppure di inviare un MP (prima l'utente bannato non poteva nemmeno visualizzare il forum): credo che questo tipo di funzionamento sia più giusto come è ora e non come era prima.
- il numero di utenti online viene aggiornato una volta al minuto
- il numero di messaggi totali de forum visualizzato in basso, nell'indice del forum, viene aggiornato una volta al minuto
- i titoli degli ultimi 6 messaggi dei forum nel box a sinistra di qualsiasi pagina vengono aggiornati una volta al minuto
Credo che si potrà concordare che le variazioni non sono state stravolgenti per l'utente mentre sono state stravolgenti per la quantità di utilizzo della CPU.
Conclusioni
Oggi 21 ottobre il lavoro è stato ultimato, credo che tutto ciò che si poteva ottimizzare sia stato ottimizzato e se rimane qualcosa non è certo quello che causerà o risolverà un eventuale problema di eccessivo carico del server, almeno dal punto di vista della CPU. Inoltre, l'altro sito che ultimamente ne causava frequentemente il blocco, sta cambiando server quindi i presupposti ci sono tutti per tornare a godere stabilità e velocità di navigazione; questa almeno è la mia speranza.
La velocità di esecuzione dello script (che non coincide con la velocità di visualizzazione della pagina in quanto questa può anche dipendere dalla rete) è consultabile guardando il tempo di "Generazione pagina" che si trova in fondo ad ogni pagina; attualmente, a server scarico, per generare la home page bastano 2 centesimi di secondo, quello dovrebbe essere il tempo che la CPU ci dedica quando richiediamo la home page; le altre pagine impiegano un po' di più e comunque stiamo intorno ai 9 centesimi per la visualizzazione dei topic del forum, sempre in condizioni di server scarico; credo che siano tempi bassi che confermino i buoni risultati.
E' stato un lavoro veramente lungo e altrettanto impegnativo dal punto di
vista cerebrale ;-) , alla fine sono contento di averlo fatto perché mi ha
permesso di esaminare in dettaglio e comprendere bene il funzionamento di quasi
tutto il codice del sito, ciò mi sarà d'aiuto quando ci saranno da fare aggiunte
di nuove funzioni o modifiche.
Un grande ringraziamento agli utenti che ogni volta mi hanno segnalato i vari
bug, cioè gli errori che inevitabilmente si commettono in corso d'opera e che
causano malfunzionamenti nella visualizzazione di qualche pagina o in qualche
funzione; il topic nel quale si possono segnalare le anomalie è il seguente:
Modifica codice del sito - Segnalate eventuali anomalie!
Ora abbiamo un sito veloce e snello... talmente veloce e snello che siamo sicuri che sia adatto a dei motociclisti mangiatori e delle motocicliste mangiatrici del nostro calibro?
Saluti!
Davide