2010-01-27 16 views
52

Qual è la procedura migliore per decidere quanti processi di lavoro consentire un'applicazione Web ASP.NET?ASP.NET Web Garden - Quanti processi di lavoro ho bisogno?

Su un server che gestisco, creando un nuovo valore predefinito di AppPool su 10 (massimo) processi di lavoro. Altre persone suggeriscono che l'impostazione normale sia una.

Che problema risolvono più processi di lavoro e quali sono le tecniche per decidere su quante?

+1

Non sapevo se sarebbe stato più appropriato qui o su ServerFault, fammi sapere se ho fatto la scelta sbagliata e la sposterò. –

+4

Vai avanti e chiedi in entrambi i posti. Penso che la tua domanda sia pertinente qui. Le specifiche della distribuzione di ASP.Net ricadono spesso nell'area di competenza dello sviluppatore, in particolare per quanto riguarda l'ottimizzazione delle app. – DOK

+6

Sono d'accordo con DOK. Entrambi i posti sono appropriati. Gli sviluppatori sono spesso quelli che devono dire ai ragazzi della rete come configurare il server. Per questo motivo, hanno bisogno di avere queste informazioni. – NotMe

risposta

47

I processi di lavoro sono un modo per segmentare l'esecuzione del tuo sito web su più exe. Lo fai per un paio di motivi, uno se uno dei lavoratori viene sbalordito da problemi di runtime che non abbatte gli altri. Ad esempio, se arriva una richiesta html che fa sì che il processo scada nel nulla, vengono uccise solo le altre richieste gestite da quel processore. Un altro esempio è che una richiesta potrebbe causare il blocco contro gli altri thread gestiti dallo stesso worker.

Per quanto ne hai bisogno, esegui dei test di carico. Colpisci l'app con forza e vedi cosa succede con una sola. Quindi aggiungine altro e colpiscilo di nuovo. Ad un certo punto raggiungerai un punto di saturazione della rete, del disco, della CPU e della ram. Questo è quando sai di avere il giusto equilibrio.

Per inciso, è possibile controllare il numero di thread utilizzati per processo di lavoro tramite il file machine.config. Credo che la chiave sia maxWorkerThreads.

Ora, attenzione, se si utilizza la sessione, lo stato della sessione non viene condiviso tra i processi di lavoro. In genere consiglio di evitare comunque la sessione, ma è qualcosa da considerare.

A tutti gli effetti è possibile considerare ogni processo di lavoro come se fosse un proprio server web separato. Tranne che stanno correndo sulla stessa scatola.

+1

In effetti, si è verificato un problema con lo stato sessione che ha provocato questa domanda (consultare http://stackoverflow.com/questions/2147578/asp-net-session-state-and -processi -Multiple-lavoratore). Grazie per una risposta utile (+1) –

+2

L'impostazione predefinita è normalmente una. Il tuo server che ha un valore predefinito di 10 deve essere stato modificato per cambiarne i valori predefiniti. – NotMe

+1

@ChrisLively, lo stato della sessione viene condiviso tra i processi di lavoro, infatti lo stato della sessione viene anche condiviso tra più siti Web con lo stesso nome di cookie. –

4

perdite di memoria

L'altro grande vantaggio sta gestendo le perdite di memoria. A volte quanto si tenta di ottimizzare il codice, ma ci sono perdite di memoria nel framework stesso e in altre librerie di terze parti. Abbiamo notato che alla fine la nostra applicazione raggiunge una memoria molto alta e inizia a non dare eccezioni alla memoria.

Quindi abbiamo dovuto impostare un limite di memoria virtuale massimo sul processo di lavoro a 1 GB e consentire l'esecuzione di più processi. È possibile impostare il limite virtuale massimo anche per un singolo processo di lavoro, ma ciò porta a picchi di rallentamento, poiché quando il processo di lavoro viene riciclato, tutte le richieste sono lente fino al momento in cui il processo di lavoro del tempo ottiene una buona velocità. Poiché la nostra applicazione ha una cache interna (Entity Framework Query Cache, alcuni pool di oggetti), ognuna di queste cose rallenta l'avvio dell'applicazione. È qui che il singolo processo lavorativo fa più male.

Se sono presenti più processi di lavoro, solo uno dei processi in modalità di riciclo è lento, mentre altri mantengono una buona velocità.

1

Un altro caso in cui ha senso avere molti processi di lavoro è se l'applicazione contiene blocchi che ne impediscono la parallelizzazione. L'elaborazione dell'immagine basata su GDI + è uno degli esempi.

L'ho trovato quando ho provato a trovare la soluzione per my problem.