2011-01-19 14 views
10

In primo luogo c'è una grande panoramica del ciclo di vita IIS7 richiesta HTTP e le varie impostazioni che influiscono sulle prestazioni qui:IIS7 integrata Pipeline: Interazione tra maxConcurrentRequestsPerCPU e requestsQueueLimit Opzioni

ASP.NET Thread Usage on IIS 7.0 and 6.0

Molto particolare anche se, in dotNet 4 le impostazioni predefinite per maxConcurrentRequestsPerCPU e requestsQueueLimit sono impostati su 5000. Es. equivalente a: (in aspnet.config):

<system.web> 
    <applicationPool 
     maxConcurrentRequestsPerCPU="5000" 
     maxConcurrentThreadsPerCPU="0" 
     requestQueueLimit="5000" /> (** see note below) 
</system.web> 

mi sembra che su un multi-CPU/core server della requestQueueLimit qui sarà sempre richiamato ben berfore limite del 'perCPU'. Quindi, se un massimo di 5000 richieste per CPU è ciò che realmente si desidera, allora mi aspetto che la requestQueueLimit debba essere aumentata a 5000 * CPUCount o semplicemente disabilitata del tutto.

La mia interpretazione è corretta? In tal caso, posso disabilitare requestQueueLimit? (impostarlo su zero?). La documentazione su questa impostazione non sembra rispondere a questa domanda (quindi forse mi manca qualcosa o fraintendere?)

** nota a margine dell'articolo precedente: La requestQueueLimit è mal denominata. Limita effettivamente il numero massimo di richieste che possono essere servite da ASP.NET contemporaneamente. Ciò include sia le richieste in coda che le richieste in esecuzione. Se il contatore di prestazioni "Richieste correnti" supera requestQueueLimit, le nuove richieste in arrivo verranno rifiutate con un codice di stato 503)

+0

Ho chiesto a Thomas (autore del post che punti a) di commentare questo. –

risposta

12

*** La mia interpretazione è corretta?

Sì, se si desidera eseguire più di 5000 richieste contemporaneamente, è necessario aumentare la requestQueueLimit. La requestQueueLimit limita il numero totale di richieste nel sistema. A causa della sua legacy, è in realtà il numero totale di richieste nel sistema, e non il numero di richieste in qualche coda. L'obiettivo è impedire che il server si rovini a causa della mancanza di memoria fisica, memoria virtuale, ecc. Quando viene raggiunto il limite, le richieste in arrivo riceveranno una risposta rapida "Server Too Busy" 503. A proposito, il numero corrente di richieste nel sistema è esposto dal contatore di prestazioni "ASP.NET \ Richieste correnti".

*** posso disabilitare requestQueueLimit? (impostarlo su zero?)

È possibile disabilitarlo in modo efficace impostandolo su un valore elevato, ad esempio 50000. È necessario impostare il valore nel file aspnet.config dubito che il server possa gestire 50000 richieste simultanee, ma se così fosse , quindi raddoppiare. Impostarlo su zero non lo disabiliterà ... stranamente, significa che non può essere eseguita più di una richiesta contemporaneamente.

A proposito, sembra che ci sia un bug in v4. Per la modalità integrata, legge solo con successo il valore di requestQueueLimit se è configurato nel file aspnet.config come described on MSDN. Per qualche ragione, v4 non lo stava leggendo da machine.config quando ho sperimentato un po 'di tempo fa.

+0

Grazie per questo. Forse potresti chiarire un ultimo punto per me. Se le richieste totali in corso superano requestQueueLimit, il client riceve un 'Server 503 troppo occupato' - OK.Riceverò anche un 503 se maxConcurrentRequestsPerCPU viene superato/prima/requestQueueLimit? Cioè, stanno entrambi controllando il numero di richieste più o meno allo stesso punto nel ciclo di vita della gestione delle richieste? Quale da quello che ho letto è un retaggio di come IIS e ASP.NET si sono evoluti. – redcalx

+0

Non si otterrà un 503 se maxConcurrentRequestsPerCPU viene superato prima di RequestQueueLimit. Se maxConcurrentRequestsPerCPU viene superato prima di RequestQueueLimit, la richiesta verrà aggiunta a una coda. Sarà rimosso dalla coda non appena una delle richieste di esecuzione sarà completata. – Thomas

+0

Ci scusiamo ma non ancora al 100% chiaro ... Ho avuto l'impressione dal tuo blog che la coda CLR ThreadPool avrebbe accodato le richieste se maxConcurrentRequestsPerCPU * CPUCount era maggiore di maxWorkerThreads * CPUCount. Quindi, ho presupposto che il ThreadPool Q/fosse/il Q globale a cui ti riferivi nel tuo blog. Sembra che tu stia dicendo che c'è un'altra coda (legacy da IIS6?) Oltre al ThreadPool Q? – redcalx

2

È possibile controllare il codice sorgente dell'applicazione this. Il sintonizzatore IIS è un'applicazione open source che ottimizza le impostazioni di IIS per prestazioni migliori. D'altra parte la pagina this potrebbe essere utile per le vostre domande.