Vediamo alcune direttive di Apache che espressamente riguardano le performance e il dimensionamento di un server web.
GESTIONE DEI PROCESSI
Su Unix Apache 1.3 opera come un pre-forking server, dove un processo iniziale provvede a generare dei child che devono effettivamente gestire le richieste dei client.
Alcune direttive permettono di gestire il numero dei processi da aprire all'avvio e il quanti tenermi in standby, in attesa di richieste:
StartServers 5
- Imposta (di default a 5) il numero di processi figli che vengono laciati da Apache. Visto che la fase di forking di un nuovo figlio è onerosa in termini di risorse richieste, su siti ad alto traffico ha senso aumentare considerevolmente questo valore.
MinSpareServers 5
- Imposta (di default a 5) il numero minimo di child che devono essere sempre essere disponibili per gestire nuove richieste. Anche in questo caso su siti ad alto traffico e in particolare soggetti a picchi di attività, ha senso aumentare questo valore.
MaxSpareServers 10
- Imposta (di default a 10) il numero massimo di child che possono essere liberi in attesa di nuove richieste. Ovviamente questo valore ha senso se è superiore a MixSpareServers, ma non è il caso di impostarlo troppo alto, per non rischiare di avere un server che dopo un picco di attività, rimane con troppi processi figli inutilizzati.
MaxClients 256
- Imposta (di default a 256) il numero massimo di client che possono accedere contemporaneamente al server. Questo valore è piuttosto importante perchè di fatto limita il numero di utenti e permette di evitare che il server collassi sotto un carico troppo alto (a fronte di un messaggio di errore del tipo "Server Unavailable" ai client in eccesso). Va dimensionato secondo i limiti massimi gestibili dall'hardware: un valore troppo basso rischia di escludere, sotto carico, alcuni client che potrebbero essere serviti, un valore troppo alto rende il server soggetto al totale collasso.
E' IMPORTANTE sottolineare che nei sorgenti e nei binari generalmente distribuibili, 256 è un limite massimo (a prescindere da quanto viene scritto nella configurazione). Per cui se si vuole avere un Apache in grado di gestire più di 256 client contemporaneamente si devono modificare i sorgenti, in particolare il file httpd.h, aumentare il valore associato alla voce HARD_SERVER_LIMIT e ricompilare il Apache.
MaxRequestsPerClient 0
- Imposta (di default a infinito, indicato con 0) il numero di richieste HTTP che ogni singolo processo di Apache deve gestire prima di essere terminato. Ha senso mettere un valore alto ma finito (esempio: 10000) per evitare potenziali memory leaks di un processo. In pratica, nel nostro esempio, dopo 10000 richieste gestite un child di Apache viene volontariamente terminato e sostituito da uno nuovo.
TUNING SU TCP/IP E HTTP
Alcune direttive di Apache influenzano il modo con cui il server utilizza i protocolli di rete su cui si basa.
SendBufferSize 32768
- Imposta, in byte, le dimensioni del buffer da allocare per gestire l'output da parte di ogni singolo child di Apache. Questo rende più efficiente il trasporto dei dati su TCP/IP in caso di latenze alte, ma aumenta l'occupazione di memoria (e può diventare critico sotto alto carico).
KeepAlive on
- Permette al server di gestire più richieste HTTP fra uno specifico client e il child del server con cui comunica, utilizzando la stessa sessione TCP. Questo aumenta considerevolmente la velocità e l'ottimizzazione della gestione delle richieste, in quanto non richiede una nuova fase syn-synack per ogni GET del client. Su browser vecchi, che non supportano HTTP/1.1, questa opzione non funziona e può creare problemi (nella configurazione di default di Apache, con la direttiva BrowserMatch, si corregge il comportamente del server quando ha a che fare con questi client obsoleti).
KeepAliveTimeout 15
- Imposta il numero di secondi che un child di Apache aspetta senza ricevere nuove richieste dal client con cui sta comunicando prima di chiudere la connessione e tornare IDLE.
Su server sotto alto carico, questo valore è meglio che sia basso (intorno ai 15 secondi indicati) per evitare di occupare inutilmente risorse per troppo tempo.
MaxKeepAliveRequests 100
- Imposta il numero massimo di richeste che Apache può servire sulla stessa connessione. E' bene impostare un valore finito e non esageratamente alto. Un valore troppo basso, di fatto, rende inutile il KeepAlive.
TimeOut 300
- Imposta il tempo in secondi (300 il valore di default) di inattività in generale, prima di terminare una connessione HTTP. Un valore troppo basso rischia di impedire il POST di grosse quantità di dati su link lenti, un valore troppo alto aumenta l'esposizione del server a DOS attack e ne sfrutta male le risorse.
ListenBacklog 511
- Imposta il numero di richieste da mettere in code quando Apache è troppo occupato per gestirle tutte. Con questa direttiva Apache imposta la lunghezza della coda e invece di droppare le richieste eccedenti, le processa appena possibile. Il valore di default è 511, non è il caso di aumentarlo troppo perchè è probabile che client messi in coda, dopo un certo tempo di mancata risposta da parte del server, abbiano già dirottato altrove le loro richieste.
Suggerimenti e informazioni per migliorare le performance di Apache.