Ho il seguente codice che ho di benchmark con jMeter e ottenere circa 3000 richiesta per la seconda sulla mia macchina localhost (la await
manca intenzionalmente per eseguire in modo sincrono):Benchmarking ASP.NET richieste simultanee risultati poveri
public async Task<HttpResponseMessage> Get()
{
var resp = new HttpResponseMessage(HttpStatusCode.OK);
resp.Content = new StringContent(Thread.CurrentThread.ManagedThreadId.ToString(), Encoding.UTF8, "text/plain");
return resp;
}
il problema è che quando sospendo la richiesta per un secondo come qui di seguito, per qualche ragione il volume è fino a 10 richieste al secondo per ogni processo w3wp.exe (nuovamente il await
manca intenzionalmente per eseguire sincrono):
public async Task<HttpResponseMessage> Get()
{
Task.Delay(1000).Wait();
var resp = new HttpResponseMessage(HttpStatusCode.OK);
resp.Content = new StringContent(Thread.CurrentThread.ManagedThreadId.ToString(), Encoding.UTF8, "text/plain");
return resp;
}
Anche quando faccio uso await
non v'è alcuna differenza e le 10 richieste al secondo non migliora affatto:
public async Task<HttpResponseMessage> Get()
{
await Task.Delay(1000);
var resp = new HttpResponseMessage(HttpStatusCode.OK);
resp.Content = new StringContent(Thread.CurrentThread.ManagedThreadId.ToString(), Encoding.UTF8, "text/plain");
return resp;
}
Ho provato tutte le impostazioni di configurazione e niente rende ogni cambiamento a tutti: `
web.config
<system.net>
<connectionManagement>
<add address="*" maxconnection="65400" />
</connectionManagement>
</system.net>
aspnet.co nfig
<system.web>
<applicationPool
maxConcurrentThreadsPerCPU="100" />
</system.web>
machine.config
<processModel
autoConfig="false"
memoryLimit="70"
maxWorkerThreads="100"
maxIoThreads="100" />
Le configurazioni sono impostate per x86 e x64
ho 32 giga di mem e 4 core fisici, Windows 10
La CPU non supera il 10% di carico quando benching le 10 richieste al secondo.
Il codice sopra riportato utilizza l'API WEB, ma ovviamente riproduco gli stessi risultati utilizzando un gestore HTTP.
Utilizzando un singolo server web di uso generale un'applicazione ASP.NET ben progettata tratterà circa 300 req/s dell'interazione utente reale. I sistemi scarsamente architetti iniziano a vedere quegli zeri scomparire. Per aumentare il throughput su un singolo server Windows che si desidera utilizzare utilizzando "web gardens". In generale il collo di bottiglia non è il tuo server web ma lo stato condiviso (ad es. Il tuo database). –
@ChrisMarisic Io uso un web garden – realPro
10 req/s per una durata di esecuzione di una richiesta di 1 secondo sembra abbastanza normale con qualsiasi tecnologia. Ed è anche normale che la CPU non venga utilizzata (richiede solo l'attesa senza consumare alcuna elaborazione). Cosa ti aspetti? –