La risposta di Womble è fantastica, anche se un po 'difficile da capire e applicare per gli inesperti. Vorrei fornire alcuni numeri empirici e un confronto tra applicazioni "contenuto semplice" e "e-commerce".
Non c'è molto materiale sull'impostazione di diversi casi d'uso in relazione alla loro configurazione appropriata di mod_wsgi, quindi spero che sia giusto usare un po 'di prosa qui.
A) Siti CMS e micrositi
Gestiamo diversi siti Web di clienti, molti dei quali principalmente siti di contenuti o micro siti che ospitano django CMS, alcuni moduli personalizzati e talvolta sedano per attività in background pianificate. Questi siti non hanno fame di risorse, molti di essi funzionano felicemente in parallelo su un singolo Intel Xeon a 4 core con 32 GB di RAM. Ecco la configurazione che utilizziamo per ciascuno di questi tipi di siti:
WSGIDaemonProcess example.com user=www-data processes=2 maximum-requests=100
Sto parlando di circa 40 siti su un singolo server, molti dei quali con il loro sito di gestione temporanea in esecuzione in standby. Con 2 processi (con 15 thread ciascuno, per impostazione predefinita) i siti sono benestanti, sebbene limitati nella loro capacità di allocare le risorse del server. Il motivo per cui questa configurazione è sufficiente può essere giustificato dalla semplice natura dell'applicazione (CMS): per completare una richiesta non è mai necessario attendere più di un paio di millisecondi. Apache rimarrà sempre rilassato, così come il carico della CPU.
B) Siti di e-commerce
I siti più complessi che realizziamo sono caratterizzati da operazioni locali ancora poco costose dal punto di vista computazionale ma da dipendenze esterne (ad es. Servizi Web che forniscono dati di prenotazione) che sono costose in termini di tempo di transazione. Le operazioni con richieste esterne occupano thread per un tempo molto più lungo, quindi sono necessari più thread per soddisfare lo stesso numero di utenti (rispetto a un semplice sito CMS dall'alto). Ancora peggio, i thread vengono occasionalmente bloccati quando un servizio esterno non può rispondere immediatamente a una richiesta, a volte per un paio di secondi. Questo può portare allo sgradevole effetto collaterale che i thread che inseriscono le richieste nella stessa coda di servizio, fino a quando tutti i thread mod_wsgi disponibili vengono esauriti e bloccano l'attesa.
Per quegli scenari abbiamo cercato di utilizzare i 6
processi senza vedere molte differenze e abbiamo finito per 12
vedere un aumento incomparabile delle prestazioni e della stabilità operativa:
WSGIDaemonProcess example.com user=www-data processes=12 maximum-requests=100
Alcuni semplici test di carico con 150 e 250 utenti paralleli sono gestiti facilmente dal sito rimanendo ben reattivi (mentre con i 2
processi il sito è inutilizzabile per soddisfare 50 utenti in parallelo). Il 2 CPU 6 Core Intel Xeon con 32 GB di RAM funziona ben al di sotto del 25% di utilizzo della CPU con quel carico, l'utilizzo della RAM rimane quasi costante anche a meno del 25%. Tieni presente che qui utilizziamo una macchina dedicata solo per un singolo sito, quindi non ruberemo risorse di cui altri siti potrebbero aver bisogno.
Conclusione
L'uso di un numero più elevato di processi è un compromesso tra consentire ad Apache di utilizzare o meno le risorse di sistema disponibili. Se si desidera mantenere un sistema server stabile (non un sito Web!) In condizioni di "attacco", mantenere basso il numero. Se vuoi che Apache ti aiuti usando le risorse di sistema (CPU, RAM) quando necessario, scegli un numero più alto. Quanto in alto puoi calcolare in qualche modo come indicato nella risposta accettata sopra, ed è in definitiva limitato dalla potenza della CPU e dalla RAM disponibili.
(PS: tengo la sezione ConfigurationDirectives del wiki del progetto modwsgi sotto il mio cuscino per la lettura in background simile ad Apache. Assicurati anche di capire e monitorare le connessioni aperte del tuo server Apache .)