2009-03-18 14 views
23

Mi è stato detto che ASP.NET è multithreaded per impostazione predefinita in IIS. Come si ottiene questa discussione?Come è multithreaded ASP.NET?

La server farm invia richieste diverse a core diversi?

Una singola richiesta utilizza più core?

Ancora più importante, ci sono dei vantaggi nell'aggiungere thread al codice ASP.NET se il threading è fatto più in alto in IIS?

+3

Qualsiasi sito web design è multi-threaded, ogni richiesta viene servita in gran parte in parallelo con tutte le altre richieste –

risposta

5

IIS utilizza automaticamente più core (alt hough puoi spegnerlo se lo desideri).

Il vantaggio dell'aggiunta di thread al codice ASP.NET è tale da poter controllare il funzionamento interno della propria applicazione e non essere costretti a fare affidamento su IIS per prendere tutte le decisioni al posto tuo.

+0

Questo è un vago vantaggio –

+0

Fai una domanda vaga, ottieni una risposta vaga. L'unica risposta precisa possibile per l'ultima delle quattro domande originali è "dipende". –

3

Un thread separato viene in genere generato per ogni nuova richiesta, quindi il sistema operativo esegue la pianificazione del processore. A meno che non sia necessario elaborare solo alcune richieste alla volta, non è necessario alcun thread aggiuntivo.

+0

La risposta suggerisce che una richiesta rimarrà sullo stesso thread per tutta la sua durata, il che non è vero (e tale ipotesi può causare problemi se si utilizza la statistica del thread). –

+0

Beh, non abbiamo mai sviluppato programmi consapevoli dell'agilità del thread, quindi non ne avevo idea in precedenza. – sharptooth

+0

IIS non utilizza anche un pool di thread? Afaik genera thread all'avvio, quindi li riutilizza tra le richieste. – Mendelt

23

Il server non solo invia richieste diverse a thread diversi, ma una singola richiesta può modificare il thread durante il ciclo di vita. Si chiama agilità thread. Sto cercando un buon articolo che lo spieghi ...

EDIT: Non ci sono ancora articoli definitivi, ma one blog post spiega alcune delle difficoltà.

EDIT: Altri collegamenti da commenti:

+1

Ma una richiesta non viene eseguita su più thread in un dato momento, quindi alla fine della giornata è possibile visualizzare l'intera gestione delle richieste come single-threaded. (Oppure no?) – Tomalak

+1

@Tomalak: No, non può essere considerato come single-threaded, perché può cambiare thread. Ciò significa che se si inseriscono elementi in una variabile [ThreadStatic] all'inizio della richiesta, potrebbe non esserci al termine della richiesta. –

+0

@Jon Immagino che questo complichi l'idea di generare altri thread all'interno di una richiesta anche oltre, non è vero? – sharptooth

8

ASP.net utilizza il threadpool .Net (che è configurabile) Ogni richiesta viene ricevuta da uno dei thread nel threadpool, fino a quando ciascun thread è già occupato. Quindi le richieste vengono accodate nello stack di IIS, fino a quando non si rovesciano. Da lì nuove richieste incontrano il brutto messaggio 'Server non disponibile'.

Questa è la solita storia "multi-threading" per un sito Web ASP.net.

Esistono molti modi per garantire la scalabilità. Il più ovvio è il test delle prestazioni e la rimozione dei colli di bottiglia dal codice.

ASP.net può davvero trarre vantaggio da più core utilizzando i thread di I/O per qualsiasi richiesta di I/O. Fa brutto codice ma veloce non è mai stato carino.

Ecco l'MSDN MAG posta definitivo su come fare questo

UPDATE

Beh, io probabilmente tentare di rispondere alla tua domanda completa:

"Ancora più importante è ci vantaggio aggiungere thread al codice ASP.Net se il threading è terminato su su IIS? "

La risposta breve è: dipende! Se si è in attesa di un processo di lunga durata, si consiglia di implementare un'esperienza migliore per il client richiedente (ad esempio chiamate AJAX fuori banda)

se si dispone di più attività indipendenti che devono essere completate per il cliente richiedente: quindi potrebbe essere meglio generare un nuovo processo per eseguire le attività in parallelo.

Se il vostro sito riceve un sacco di traffico, allora si ha realmente bisogno di prendere in considerazione l'attuazione modelli asincroni di utilizzare al meglio il vostro CPU

Problemi correlati