2015-06-12 10 views
6

Ho bisogno di un'applicazione web per essere in grado di operare a un numero molto elevato di richieste al secondo, mantenendo un tempo di risposta piuttosto basso (meno di ~ 70 ms).Ottimizzazione di IIS e ASP.net per max Richieste/Secondo

Per scopi di test, ho avviato 3 istanze ec4 c4.xlarge e le ho inserite in un sistema di bilanciamento del carico elastico.

Ho un metodo simile a questo.

[HttpPost] 
[Route("api/test/rps")] 
public IHttpActionResult TestRequestsPerSecond(MediumSizedObject testObj) 
{ 
    return new StatusCodeResult(HttpStatusCode.NoContent, Request); 
} 

Mi aspettavo che una di queste istanze fosse in grado di gestire molte migliaia di richieste al secondo (poiché in pratica non fa nulla). Con mia sorpresa, sto riscontrando problemi nel gestire 300 richieste al secondo senza che la CPU raggiunga il massimo e le richieste inizino a fare la fila.

Ecco le prestazioni di una delle istanze a circa 240 richieste al secondo.

Performance Monitor

Come potete vedere ho 19 in coda già richieste, e il processore è 78%. (Anche i miei interruttori di contesto stanno salendo a circa 8-9K che sembra alto).

Questo sta accadendo su tutti e 3 i server.

cose che ho cambiato sul server

machine.config linee rilevanti

<processModel autoConfig="true" 
        maxWorkerThreads="100" 
        maxIoThreads="100" 
        minWorkerThreads="50" 
        minIoThreads="50" /> 
    <httpRuntime 
     minFreeThreads="176" 
     minLocalRequestFreeThreads="152" 
     /> 

produzione web di configurazione (possibilmente) Linee rilevanti

<system.web> 
    <sessionState mode="Off" /> 
    <authentication mode="None" /> 
    <compilation targetFramework="4.5" /> 
    <httpRuntime targetFramework="4.5" /> 
</system.web> 
<system.webServer> 
    <modules> 
     <remove name="FormsAuthentication" /> 
     <remove name="PassportAuthentication" /> 
     <remove name="Profile" /> 
     <remove name="AnonymousIdentification" /> 
     <remove name="WindowsAuthentication" /> 
    </modules> 
    <handlers> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <remove name="OPTIONSVerbHandler" /> 
     <remove name="TRACEVerbHandler" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
</system.webServer> 

ho provato con un default machine.config ed era solo un po 'peggio.

Per qualche ragione a circa 130 richieste al secondo, siamo solo al 30% della CPU e quasi nessuna richiesta viene accodata.

Ci deve essere qualche impostazione magica che mi manca. Questo par è il corso con IIS? È forse WebAPI 2 che è la colpa qui? (Sono giù per testare Nancy o ServiceStack se qualcuno pensa che sarebbe di aiuto).

Ho bisogno di istanze più grandi?

Eventuali suggerimenti o cose da cercare, tweak sarebbe fantastico.

(ho avuto l'Azione WebAPI restituire un task per vedere se ha fatto alcuna differenza, ma non ha)

+0

Suppongo che, oltre alla restituzione di Task, sia stata eseguita l'azione 'async'. Hai fatto? I risultati non sono cambiati? – JotaBe

+0

@JotaBe Sì, lo avevo contrassegnato come asincrono (anche se non avevo nulla da attendere). Nessuna differenza apprezzabile –

risposta

0

È necessario impostare il valore della autoconfig nell'elemento processModel su "false" prima degli altri attributi che hai modificato nell'elemento processModel per avere effetto.

Problemi correlati