Mam następujący kod, który odniesienia z JMeter i uzyskać około 3000 wniosek na sekundę na moim komputerze localhost (the await
brakuje celowo uruchomić synchronicznie):Benchmarking ASP.NET jednoczesnych żądań słabych wyników
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;
}
problem polega na tym, że kiedy wstrzymać wniosek o jedną sekundę jak poniżej, z jakiegoś powodu przepustowość wynosi aż do 10 wniosków na sekundę dla każdego procesu w3wp.exe (znowu await
brakuje celowo uruchomić synchronicznie):
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;
}
Nawet kiedy należy używać await
nie ma żadnej różnicy, a 10 wniosków na sekundę nie poprawia wcale:
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;
}
Próbowałem wszystkich ustawień konfiguracyjnych i nic nie sprawia żadnych zmian w ogóle: `
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" />
W configs są ustawione zarówno dla x86 i x64
mam 32 koncertów MEM i 4 rdzenie fizyczne, systemie Windows 10
Procesor nie przekracza 10% obciążenia, gdy ustalenie 10 żądań na sekundę.
Powyższy kod wykorzystuje WEB API, ale oczywiście odtwarzam te same wyniki za pomocą Handler'a HTTP.
Stosując pojedynczy serwer WWW ogólnego przeznaczenia dobrze zaprojektowane aplikacja ASP.NET przetworzy około 300 REQ/S rzeczywistym udziału użytkownika. Źle opracowane systemy zaczynają widzieć znikające zera. Aby zwiększyć przepustowość na pojedynczym serwerze Windows, który chcesz sprawdzić używając "ogrodów internetowych". Ogólnie rzecz biorąc, wąskim gardłem nie jest twój serwer internetowy, ale stan udostępniony (np. Twoja baza danych). –
@ChrisMarisic Korzystam z ogrodu internetowego – realPro
10 req/s dla czasu wykonania żądania wynoszącego 1 sekundę wydaje się być całkiem normalny w przypadku każdej technologii. Jest także normalne, że procesor nie jest używany (żądania oczekują bez przetwarzania). Czego oczekujesz? –