Domanda

Attualmente stiamo utilizzando Apache 2.2.3 e Tomcat 5 (integrato in JBoss 4.2.2) utilizzando mod_proxy_jk come connettore.

Qualcuno può far luce sul modo corretto di calcolare / configurare i valori seguenti (così come qualsiasi altra cosa che possa essere rilevante). Sia Apache che Tomcat sono in esecuzione su macchine separate e dispongono di abbondanti quantità di RAM (4 GB ciascuna).

Parti server.xml pertinenti:

<Connector port="8009"
           address="${jboss.bind.address}"
           protocol="AJP/1.3"
           emptySessionPath="true"
           enableLookups="false"
           redirectPort="8443"
           maxThreads="320"
           connectionTimeout="45000"
    />

Parti httpd.conf rilevanti:

<IfModule prefork.c>
  StartServers       8
  MinSpareServers    5
  MaxSpareServers   20
  ServerLimit      256
  MaxClients       256
  MaxRequestsPerChild  0
</IfModule>
È stato utile?

Soluzione

Dovresti considerare il carico di lavoro che i server potrebbero ottenere.

Il fattore più importante potrebbe essere il numero di client connessi contemporaneamente nelle ore di punta. Prova a determinarlo e regola le tue impostazioni in un modo in cui:

  • ci sono abbastanza thread di elaborazione sia in Apache che in Tomcat che non devono generare nuovi thread quando il server è pesantemente caricato
  • non ci sono molti più thread di elaborazione nei server del necessario in quanto sprecherebbero risorse.

Con questo tipo di installazione è possibile ridurre al minimo il sovraccarico di manutenzione interno dei server, il che potrebbe essere di grande aiuto, soprattutto quando il carico è sporadico.

Ad esempio, considera un'applicazione in cui hai ~ 300 nuove richieste / secondo. Ogni richiesta richiede in media 2,5 secondi per servire. Significa che in qualsiasi momento hai ~ 750 richieste che devono essere gestite contemporaneamente. In questa situazione probabilmente vorrai ottimizzare i tuoi server in modo che abbiano ~ 750 thread di elaborazione all'avvio e potresti voler aggiungere qualcosa come ~ 1000 thread di elaborazione al massimo per gestire carichi estremamente elevati.

Considera anche esattamente per cosa ti serve un thread. Nell'esempio precedente ogni richiesta era indipendente dalle altre, non veniva utilizzato il tracciamento della sessione. In più "web-ish" scenario in cui è possibile che gli utenti abbiano effettuato l'accesso al sito Web e, a seconda del software utilizzato, Apache e / o Tomcat potrebbero dover utilizzare lo stesso thread per soddisfare le richieste che arrivano in una sessione. In questo caso, potresti aver bisogno di più thread. Tuttavia, almeno per quanto conosco Tomcat, non è necessario considerare questo aspetto poiché funziona comunque con pool di thread internamente.

Altri suggerimenti

MaxClients

Questo è il limite fondamentale delle connessioni client parallele che Apache deve gestire contemporaneamente.

Con prefork, è possibile gestire una sola richiesta per processo. Pertanto l'intero apache può elaborare al massimo $ MaxClients richieste nel tempo necessario per gestire una singola . Naturalmente, questo massimo ideale può essere raggiunto solo se l'applicazione necessita di risorse inferiori a 1 / $ MaxClients per richiesta.

Se, ad esempio, l'applicazione impiega un secondo del tempo di CPU per rispondere a una singola richiesta, l'impostazione di MaxClients su quattro limiterà il throughput a quattro richieste al secondo: ogni richiesta utilizza una connessione apache e Apache ne gestirà solo quattro Al tempo. Ma se il server ha solo due CPU, nemmeno questo può essere raggiunto, perché ogni secondo dell'orologio da parete ha solo due secondi di CPU, ma le richieste richiederebbero quattro secondi di CPU.

MinSpareServers

Questo dice ad Apache quanti processi inattivi dovrebbero rimanere in giro. Maggiore è questo numero, maggiore è il carico di scoppio che Apache può ingoiare prima di dover generare processi extra, che è costoso e quindi rallenta la richiesta corrente.

L'impostazione corretta di questo dipende dal carico di lavoro. Se hai pagine con molte richieste secondarie (immagini, iframe, javascript, css), colpire una singola pagina potrebbe richiedere molti più processi per un breve periodo.

MaxSpareServers

Avere troppi processi apache inutilizzati in giro solo spreca memoria, quindi apache utilizza il numero MaxSpareServers per limitare la quantità di processi di riserva che è in riserva per raffiche di richieste.

MaxRequestsPerChild

Ciò limita il numero di richieste che un singolo processo gestirà per tutta la sua durata. Se sei molto preoccupato per la stabilità, dovresti mettere qui un limite effettivo per riciclare continuamente i processi apache per evitare che le perdite di risorse influenzino il sistema.

StartServers

Questa è solo la quantità di processi che apache avvia di default. Impostalo sulla solita quantità di processi apache in esecuzione per ridurre i tempi di riscaldamento del tuo sistema. Anche se ignori questa impostazione, apache utilizzerà i valori Min- / MaxSpareServers per generare nuovi processi come richiesto.

Ulteriori informazioni

Vedi anche la documentazione per i moduli multi-processing di apache .

Le impostazioni predefinite sono generalmente punti di partenza decenti per vedere di cosa avranno davvero bisogno le tue applicazioni. Non so quanto traffico ti aspetti, quindi indovinare MaxThreads, MaxClients e MaxServers è un po 'difficile. Posso dirti che la maggior parte dei clienti con cui ho a che fare (lavoro per un host web Linux, che si occupa principalmente di clienti che eseguono app Java in Tomcat) usano le impostazioni predefinite per un bel po 'di tempo senza troppe modifiche necessarie.

Se non ti aspetti molto traffico, queste impostazioni sono "troppo alte" davvero non dovresti influenzarti troppo. Apache non allocerà risorse per tutti i 256 potenziali clienti a meno che non sia necessario. Lo stesso vale anche per Tomcat.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top