Apache – Configurare MPM prefork

Apache mette a disposizione due Multi Processing Module, MPM Worker e MPM Prefork.
I multi Processing Module si occupano di gestire l’avvio dei processi di apache e specificano il modo in cui devono essere gestile le connessioni.

I due MPM disponibili in Apache funzionano in modo differente.

Utilizzando MPM Worker vengono creati diversi processi figli di Apache e ognuno di questi processi può contenere più thread, e gestire quindi più connessioni.
Anche utilizzando MPM Prefork vengono creati diversi processi figli di Apache ma oguno di questi può contenere un solo thread e gestire una sola connessione.

La conseguenza del diverso funzionamento è che MPM Worker permette un minore consumo di risorse, i thread consumano meno meno memoria dei processi,  ma può comportare alcuni problemi di compatibilità con altre applicazioni.
In particolare se si vuole eseguire PHP risulta necessario utilizza FastCGI.

In questo articolo analizziamo la configurazione di prefork e vediamo come ottimizzare Apache.

Nel file di configurazione httpd.conf i parametri relativi a prefork sono definiti in questa sezione.

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000
</IfModule>

Vediamo quindi il significato dei vari parametri.
StartServers specifica il numero di processi figli che devono essere creati all’avvio di Apache.
La creazione di un processo richiede un certo quantitativo di risorse, se questo valore è troppo basso e il server riceve un numero elevato di richieste, si possono avere rallentamenti quando si riavvia Apache.
MinSpareServers specifica il numero minimo di processi figli che devono essere creati e essere in attessa di connessioni. Risulta consigliabile non impostare un valore troppo basso per evitare di avere problemi nel caso si verifichi un aumento improvviso del traffico.
MaxSpareServers specifica il numero massimo di processi figli che devono essere creati e essere in attesa di connessioni. Se il valore è troppo basso c’è il rischio che per alcuni utenti il sito risulti irraggiungibile.
MaxClients specifica il numero massimo di richieste simultanee che il server è in grado di servire, tutte le connessioni oltre il limite definito da questo parametro vengono messe in coda.
Risulta importante notare che il parametro indica il numero massimo di richieste http che possono essere servite contemporaneamente e non il numero massimo di connessioni, una volta che una richiesta è stata servita, e la connessione al sito stabilita, la richiesta è considerata idle e può esserne servita un’altra.

Come trovare il valore da assegnare a MaxClients?
Assegnare il valore corretto a MaxClients è importante, un valore troppo basso può avere come conseguenza l’irraggiungibilità del sito da parte degli utenti durante momenti in cui il traffico è elevato, un valore troppo elevato può invece portare al consumo di tutta la memoria del sistema e al blocco del server.

Per calcolare il valore da assegnare a MaxClients, e anche a ServerLimit, è possibile analizzare la memoria disponibile sul server e il consumo di un singolo processo httpd.
Come prima cosa verifichiamo quanta memoria libera è presente sul server quando apache non è in esecuzione.
free -m
total       used       free     shared    buffers     cached
Mem:          2048        753       1294          0         48        499

A questo punto avviamo apache e controlliamo il consumo medio di memoria di un processore httpd.
top -b -c -n 1 | grep httpd | awk ‘{print $6}’
18m
18m
18m
18m
21m
18m
19m
18m
18m

In questo caso vediamo come  ogni processo consumi circa 18 mb di memoria.
A questo punto possiamo calcolare il valore da assegnare a MaxClients dividendo 1270, teniamo conto di volere almeno 20 mb liberi quando Apache è utilizzato al massimo, per 18.