Post

Apache – Performance Tuning

In apache on novembre 27, 2009 by poyblog Messo il tag: ,

Apache si identifica come un webserver multi-uso, in grado di fornire flessibilità, portabilità e performance; con la versione 2.2 apache è in grado di fornire delle ottime performance in molte delle situazioni reali.

La maggior parte delle ottimizzazioni che rendono possibile un maggior throughput e scalabilità sono disponibili senza personalizzazioni, dato che si identificano come le scelte di default.

E’ necessario che un webmaster colga anche altre possibilità per apportare significativi miglioramenti eseguendo delle scelte sia durante la fase di installazione che in quella di configurazione.

Hardware e Sitema Operativo

Il primo indicatore delle performance di un server-web è la RAM. Affinché le prestazioni siano ottimali è necessario che il sistema operativo non utilizzi mai la memoria SWAP perché rallenterebbe di parecchi ordini di grandezza il processo apache.

Far si che il server non utilizzi mai la swap è semplice, utilizzando un comando come top è facile individuare la percentuale di memoria che viene utilizzata in media da un processo apache.

E’ quindi bene indicare il valore della direttiva MaxClient mai superiore alle possibilità del pc, per esempio:

Se abbiamo uno scenario in cui un processo apache occupa lo 0,5 % di memoria la direttiva MaxClients non dovrà superare mai il valore 200, anzi sarebbe bene impostarlo a 150 per lasciare sempre libera almeno il 15% della ram per gli altri processi residenti sul sistema

Per quanto riguarda il sistema operativo sono consigliabili due atteggiamenti:

  • mantenere aggiornato il sistema, dato che molto spesso le patch applicate portano anche a dei sensibili miglioramenti in termini di performance
  • Abilitare il supporto per la system call sendfile(2) che permette di trasportare contenuti statici più velocemente e con meno carico di CPU. Tutti i sistemi linux con kernel 2.4 o superiore utilizzano questa system call.

Configurazioni a Run-Time

Ecco alcune raccomandazioni su come aumentare le performance del nostro server utilizzando delle direttive di base:

  • Impostare la voce HostnameLookups su Off (in apache 1.3 questa direttiva viene impostata ad On, mentre nelle versione successive il comportamento è inverso). La procedure di DNS lookup rallenta di molto l’esecuzione del processo apache dato che deve risolvere l’indirizzo Ip in hostname.
  • Non utilizzare se possibile la direttiva SymlinksIfOwnerMatch dato che prima di eseguire una pagina deve essere gestito una system call lstat(2) su tutte le dir principali del sito.
    • Ecco un esempio chiarificatore
      DocumentRoot /www/htdocs
      <Directory />
      Options SymLinksIfOwnerMatch
      </Directory
    • la system call lstat(2) verrà applicata alle dir /www, /www/htdocs e /www/htdocs/index.html
  • Lo stesso discorso vale per la direttiva AllowOverride, è quindi bene applicarla solo in relazione alla directory di interesse e non a tutto il server web
  • Ecco alcune direttive da tenere in considerazione per la gestione di un web server, ed in particolare il modo di creare processi nuovi:
    • MinSpareServer: il numero minimo di processi figli idle che vengono generati
    • MaxSpareServer : il numero massimo di processi figli che possono essere generati
    • StartServer: il numero di processi figli che vengono generati all’avvio di apache
    • MaxClients: Il numero massimo di connessioni contemporanee accettate
    • MaxRequestPerChild: il numero di richieste che possono essere gestite da un processo figlio (di default il valore è a 0 cioè infinito)
    • KeepAliveTimeout: il tempo entro il quale una richiesta viene mantenuta in vita senza passaggio di dati

Configurazioni a Tempo di compilazione

Apache supporta il cosiddetto modello MPM (Multi Processing Modules), in cui viene gestita la contemporaneità. Quando si installa apache si deve installare uno degli MPM generati per le specifiche piattaformE su cui è allocato apache. Per sistemi UNIX la scelta può ricadere su:

  • MPM Worker ? vengono generati più processi figli i quali a loro volta gestiscono più thread. Ogni thread può gestire una connessione per volta. MPM Worker è una buona scelta per server ad alto traffico perché utilizza meno memoria rispetto al suo dirimpettaio prefork.
  • MPM Prefork ? vengono generati più figli con un thread per ognuno Ogni processo gestisce una connessione per volta. La velocità di questo modulo è comparabile con quello concorrente, ma utilizza più risorse in termini di memoria. I vantaggi di questo modulo è che permettono ad apache di adattarsi con modulo non thread-safe e fornisce una migliore facilità di debugging

Moduli

E’ bene installare ed utilizzare solo i moduli indispensabili, dato che tutti occupano spazio in memoria, e questa come abbiamo visto all’inizio di questo articolo è particolarmente importante per garantire efficienza.

4 Risposte a “Apache – Performance Tuning”

  1. Ho montato un server 64 bit 8 core 16 Gb ram
    Ho compilato apache2 con mpm worker.
    Settandolo in questo modo:

    ThreadLimit 100
    StartServers 5
    MaxClients 1000
    MinSpareThreads 100
    MaxSpareThreads 1000
    ThreadsPerChild 100
    MaxRequestsPerChild 0

    Contemporaneamente sulla stessa macchina gira Tomcat con 6Gb di Ram dedicata.

    Secondo te questi valori sono corretti?
    in locale non ho problemi chiaramente, ma prima di passare in produzione, vorrei capire se secondo te va bene, oppure faresti qualche modifica…

    Saluti
    Bart

    • Ciao,
      il valore MaxClients è molto alto, se una connessione ti occupa anche solo lo 0,1% di ram con mille connessioni possibili contemporanee la macchina crollerebbe. Io partirei in modo molto più soft limitando le capacità e poi se la situazione rimane buona (carico medio di CPU e di RAM) allora comincerei ad aumentare i valori.
      Comunque, ecco cosa io metterei nella configurazione di apache:
      ThreadLimit 25
      StartServers 5
      MaxClients 300
      MinSpareThreads 25
      MaxSpareThreads 300
      ThreadsPerChild 25
      MaxRequestsPerChild 0

  2. Ciao,
    oggi era lentissimo… dopo un po’ di ricerche ho scoperto nell’error_log questo:

    [Thu Sep 16 16:16:34 2010] [error] server reached MaxClients setting, consider raising the MaxClients setting
    Ho così aumentato il valore MaxClients e ora va meglio.
    Trattasi di un server dedicato con queste caratteristiche:
    Dell R210 Intel Xeon QuadCore a 2.4 GHz e 4Gb Ram

    La mia attuale configurazione è questa:

    StartServers 5
    MinSpareServers 5
    MaxSpareServers 10
    MaxClients 256
    MaxRequestsPerChild 0

    Dici che può andare?
    Inoltre ti chiedo: sarebbe preferibile il Worker piuttosto che il Prefork?

    • Diciamo che la configurazione Worker (Multi thread) ha il vantaggio di scalare maggiormente. E’ in grado di reggere con più probabilità ad un picco di richieste. Lo svandaggio sta nel fatto che non tutti i moduli aggiuntivi che vanno per la maggiore hanno il supporto pieno per il multi-trheading.

Lascia un Commento

Fill in your details below or click an icon to log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Log Out / Modifica )

Foto Twitter

You are commenting using your Twitter account. Log Out / Modifica )

Foto di Facebook

You are commenting using your Facebook account. Log Out / Modifica )

Connecting to %s

Iscriviti

Get every new post delivered to your Inbox.