2015-12-10 9 views
11

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.

+3

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). –

+0

@ChrisMarisic Korzystam z ogrodu internetowego – realPro

+1

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? –

Odpowiedz

2

Oto możliwe zrozumienie. W każdym razie do zbadania.

Task.Delay() tworzy nowe zadanie, którego zadaniem jest wstrzymanie. Jeśli dobrze rozumiem, zadania często są wysyłane do puli robotów .Net, która ma ograniczony rozmiar. (Możesz sprawdzić za pomocą ThreadPool.GetMaxThreads) Kiedy spróbujesz umieścić zbyt wiele, kod "wykona kopię zapasową", gdy czeka na pulę wątków.

Załóżmy, że masz pulę wątków o rozmiarze 40. Po wysłaniu 40 zadań, wszystkie czekające na sekundę, możesz maksymalnie wydłużyć pulę wątków. Twoje wąskie gardło byłoby zadaniem, gumming puli wątku, nie ustępując miejsca.

Zwykle zadania, które powodują kosztowne zapytania IO, takie jak zapytania do bazy danych lub kontrola wydawania zbiorów IO pliku, gdy czekają na wykonanie pracy. Zastanawiam się, czy Task.Delay jest bardziej "clingy".

Spróbuj wymienić Task.Delay() na System.Threading.Thread.Sleep() i zobacz, czy to coś zmieni.

+0

Korzystanie z System.Threading.Thread.Sleep() zmniejszyło liczbę żądań na sekundę do 8 żądań na sekundę. – realPro

1

Wiem, że w systemie Windows 8 istnieje maksymalny równoczesny limit połączeń wynoszący 10, który powstrzymuje osoby próbujące korzystać z systemów operacyjnych dla konsumentów do uruchamiania obciążeń serwerów. Nie widzę powodu, dla którego system Windows 10 byłby inny.

http://blogs.iis.net/owscott/windows-8-iis-8-concurrent-requests-limit

+0

Tak, widziałem również ten post i tak zainstalowany serwer 2016, aby uruchomić testy, ale zachowanie nie zmieniło się w żaden sposób. – realPro

Powiązane problemy