Niezgodności, słaba wydajność i zakleszczenia podczas wysyłania żądań usługi sieci Web z aplikacji ASP.NET

Tłumaczenia artykułów Tłumaczenia artykułów
Numer ID artykułu: 821268 - Zobacz jakich produktów dotyczą zawarte w tym artykule porady.
Rozwiń wszystko | Zwiń wszystko

Na tej stronie

Symptomy

Podczas wywoływania usług XML sieci Web z aplikacji ASP.NET mogą się pojawić niezgodności, słaba wydajność i zakleszczenia. Klienci mogą zgłaszać, że żądania przestają odpowiadać (lub „zawieszają się”) lub ich wykonanie zajmuje bardzo długi czas. Jeżeli podejrzewane jest zakleszczenie, może to oznaczać, że proces roboczy został ponownie wykorzystany. W dzienniku zdarzeń aplikacji mogą się pojawić następujące komunikaty:
  • Jeżeli używasz Internetowych usług informacyjnych firmy Microsoft (IIS) w wersji 5.0, w dzienniku zdarzeń aplikacji pojawią się następujące komunikaty:

       Typ zdarzenia:     Błąd
       Źródło zdarzenia:   ASP.NET 1.0.3705.0
       Kategoria zdarzenia: Brak
       Identyfikator zdarzenia:       1003
       Data:           5/4/2003
       Godzina:           18:18:23
       Użytkownik:           Brak
       Komputer:       <NazwaKomputera>
       Opis:
          aspnet_wp.exe  (PID: <xxx>) was recycled because it was suspected to be in a deadlocked state.
          It did not send any responses for pending requests in the last 180 seconds.
          (Żadna odpowiedź nie została wysłana dla oczekującego żądania w ciągu ostatnich 180 sekund.
          (PID: <xxx>) został przetworzony, ponieważ podejrzewano, że znajduje się w stanie zakleszczenia.)
    

  • If you are using IIS 6.0, you receive the following messages in the application event log: (Jeżeli używasz usług IIS 6.0, w dzienniku zdarzeń aplikacji pojawią się następujące komunikaty:)

       Typ zdarzenia:     Ostrzeżenie
       Źródło zdarzenia:   W3SVC-WP
       Kategoria zdarzenia: Brak
       Identyfikator zdarzenia:       2262
       Data:           5/4/2003
       Godzina:           13:02:33
       Użytkownik:           Brak
       Komputer:       <NazwaKomputera>
       Opis:
          ISAPI 'C:\Windows\Microsoft.net\Framework\v.1.1.4322\aspnet_isapi.dll' reported itself 
    	as  unhealthy for the following reason:  'Deadlock detected'
          (ISAPI `C:\Windows\Microsoft.net\Framework\v.1.1.4322\aspnet_isapi.dll` raportuje swój 
    	stan jako niezdrowy z następującego powodu: 'Wykryte zakleszczenie').

  • Jeżeli używasz usług IIS 6.0, w dzienniku zdarzeń systemowych pojawią się następujące komunikaty:

       Typ zdarzenia:     Ostrzeżenie
       Źródło zdarzenia:   W3SVC
       Kategoria zdarzenia: Brak
       Identyfikator zdarzenia:       1013
       Data:           5/4/2003
       Godzina:           13:03:47
       Użytkownik:           Brak
       Komputer:       <NazwaKomputera>
       Opis:
          A process serving application pool 'DefaultAppPool' exceeded time limits during shut down.
          The process id was '<xxxx>'.
          (Podczas zamykania procesu obsługującego pulę aplikacji 'DefaultAppPool' przekroczony został limit czasu. 
          Identyfikator procesu: <'xxxx'>.)

W przypadku wywołania metody HttpWebRequest.GetResponse może się również pojawić następujący komunikat o błędzie wyjątku:
„System.InvalidOperationException: There were not enough free threads in the ThreadPool object to complete the operation”. (System.InvalidOperationException: W obiekcie puli wątków brakowało wystarczającej liczby wolnych wątków, aby zakończyć operację).
Może się również pojawić następujący komunikat o błędzie wyjątku w przeglądarce:
„HttpException (0x80004005): Request timed out.” (HttpException (0x80004005): Upłynął limit czasu żądania).
Uwaga: Ten artykuł dotyczy również aplikacji, które wysyłają żądania HttpWebRequest bezpośrednio.

Przyczyna

Ten problem może wystąpić, ponieważ platforma ASP.NET ogranicza liczbę wątków roboczych i wątków portu zakończenia, których wywołanie może użyć do wykonania żądań.

Zazwyczaj wywołanie usługi sieci Web korzysta z jednego procesu roboczego, za pomocą którego wykonuje kod wysyłający żądanie, oraz z jednego wątku portu zakończenia w celu odebrania wywołania zwrotnego usługi sieci Web. Jeżeli jednak żądanie jest przekierowane lub wymaga uwierzytelnienia, wywołanie może użyć maksymalnie dwóch wątków roboczych oraz dwóch wątków portu zakończenia. Dlatego możliwe jest wyczerpanie zarządzanej puli wątków, gdy wywołania wielu usług sieci Web występują w tym samym czasie.

Przyjmijmy na przykład, że pula wątków jest ograniczona do 10 wątków roboczych i wszystkie z nich obecnie wykonują kod, który z wykonaniem czeka na wywołanie zwrotne. Wywołanie zwrotne nie zostanie nigdy wykonane, ponieważ wszystkie elementy robocze zakolejkowane w puli wątków są blokowane do momentu zwolnienia jednego z wątków.

Innym potencjalnym źródłem konfliktów jest parametr maxconnection, którego obszar nazw System.Net używa do ograniczenia liczby połączeń. W zasadzie ten limit działa zgodnie z oczekiwaniami. Jeżeli jednak wiele aplikacji próbuje wysłać wiele żądań pod jednym adresem IP jednocześnie, wątki mogą musieć czekać na dostępne połączenie.

Rozwiązanie

Aby rozwiązać te problemy, można dostosować następujące parametry pliku Machine.config, tak aby pasowały do bieżącej sytuacji:
  • maxWorkerThreads
  • minWorkerThreads
  • maxIoThreads
  • minFreeThreads
  • minLocalRequestFreeThreads
  • maxconnection
  • executionTimeout
Aby pomyślnie rozwiązać ten problem, wykonaj następujące czynności:
  • Ogranicz liczbę żądań ASP.NET wykonywanych jednocześnie do średnio 12 na jednostkę centralną.
  • Zezwól, aby wywołania zwrotne usługi sieci Web mogły dowolnie używać wątków z puli wątków.
  • Wybierz odpowiednią wartość dla parametru maxconnections. Dokonaj wyboru na podstawie liczby używanych adresów IP i domen AppDomains.
Uwaga: Zalecenie ograniczenia liczby żądań ASP.NET do 12 na jednostkę centralną jest trochę przypadkowe. Ten limit sprawdził się jednak w przypadku wielu aplikacji.

maxWorkerThreads i maxIoThreads

Program ASP.NET używa dwóch następujących ustawień konfiguracji do ograniczenia maksymalnej liczby używanych wątków roboczych i wątków zakończenia:
<processModel maxWorkerThreads="20" maxIoThreads="20">
Parametr maxWorkerThreads oraz maxIoThreads są niejawnie mnożone przez liczbę jednostek centralnych. Jeżeli na przykład masz dwa procesory, maksymalna liczba wątków roboczych jest następująca:
2*maxWorkerThreads

minFreeThreads i minLocalRequestFreeThreads

Program ASP.NET zawiera również następujące ustawienia konfiguracji, które określają liczbę wątków roboczych i wątków portu zakończenia wymaganych do uruchomienia żądana zdalnego lub lokalnego:
<httpRuntime minFreeThreads="8" minLocalRequestFreeThreads="8">
Jeżeli nie ma wystarczającej liczby wątków, żądanie jest kolejkowane do momentu, w którym zostanie zwolniona liczba wątków wystarczająca do wysłania żądania. W związku z tym program ASP.NET nie wykonuje więcej niż następującą liczbę żądań jednocześnie:
(maxWorkerThreads*liczba jednostek centralnych)-minFreeThreads
Uwaga: Parametry minFreeThreads i minLocalRequestFreeThreads nie są niejawnie mnożone przez liczbę jednostek centralnych.

minWorkerThreads

Począwszy od wersji ASP.NET 1.0 z dodatkiem Service Pack 3 i ASP.NET 1.1, program zawiera również następujące ustawienie konfiguracji, które określa liczbę wątków roboczych, które mogą być dostępne bezpośrednio dla usługi w celu wysłania żądania zdalnego.
<processModel minWorkerThreads="1">
Wątki kontrolowane przez to ustawienie można tworzyć znacznie szybciej niż wątki robocze tworzone za pomocą funkcji dostrajania wątków języka CLR. Dzięki temu ustawieniu program ASP.NET może obsługiwać żądania, które nagle wypełniają kolejkę żądań ASP.NET z powodu opóźnień na serwerze zaplecza, nagłej serii żądań po stronie klienta lub innych warunków, które mogą spowodować nagłe zwiększenie liczby żądań w kolejce. Domyślna wartość parametru minWorkerThreads to 1. Zalecane jest ustawienie wartości parametru minWorkerThreads na następującą wartość.
minWorkerThreads = maxWorkerThreads / 2
Domyślnie parametru minWorkerThreads nie ma w pliku Web.config lub Machine.config. To ustawienie jest niejawnie mnożone przez liczbę jednostek centralnych.

maxconnection

Parametr maxconnection określa, ile połączeń można nawiązać z określonym adresem IP. Parametr jest wyświetlany w następujący sposób:
<connectionManagement>
    <add address="*" maxconnection="2">
    <add address="65.53.32.230" maxconnection="12">
</connectionManagement>
Ustawienia parametrów omówione wcześniej w tym artykule należą do poziomu procesów. Parametr maxconnection dotyczy jednak poziomu AppDomain. Ponieważ to ustawienie dotyczy poziomu AppDomain, można domyślnie utworzyć maksymalnie dwa połączenia z określonym adresem IP dla każdego poziomu AppDomain należącego do procesu.

executionTimeout

Program ASP.NET używa następującego ustawienia konfiguracji do ograniczenia czasu wykonania żądania:
<httpRuntime executionTimeout="90"/>
Ten limit można również ustawić przy użyciu właściwości Server.ScriptTimeout.

Uwaga: Po zwiększeniu wartości parametru executionTimeout może się również pojawić konieczność zmodyfikowania ustawienia parametru processModel responseDeadlockInterval.

Zalecenia

Ustawienia zalecane w tej sekcji mogą nie działać w przypadku wszystkich aplikacji. Mimo to następujące dodatkowe informacje mogą pomóc w odpowiednim ich dostosowaniu.

Jeżeli z każdej strony ASPX wykonywane jest jedno wywołanie usługi sieci Web pod pojedynczym adresem IP, firma Microsoft zaleca zastosowanie następujących ustawień konfiguracji:
  • Ustaw wartości parametru maxWorkerThreads i parametru maxIoThreads na 100.
  • Ustaw wartość parametru maxconnection na 12*N (gdzie N jest liczbą używanych jednostek centralnych).
  • Ustaw wartość parametru minFreeThreads na 88*N, a wartość parametru minLocalRequestFreeThreads na 76*N.
  • Ustaw wartość minWorkerThreads na 50. Pamiętaj o tym, że domyślnie parametru minWorkerThreads nie ma w pliku konfiguracji. Należy go dodać.
Niektóre z zaleceń obejmują prostą formułę, która uwzględnia liczbę jednostek centralnych serwera. Zmienna reprezentująca liczbę jednostek centralnych w formule to N. Jeżeli jest włączona wielowątkowość, to w przypadku tych ustawień należy użyć liczby jednostek centralnych logicznych zamiast liczby jednostek centralnych fizycznych. Jeżeli na przykład korzystasz z serwera o czterech procesorach z włączoną wielowątkowością, wartość N w formułach będzie wynosiła 8 zamiast 4.

Uwaga: W przypadku zastosowania tej konfiguracji można wykonać maksymalnie 12 żądań ASP.NET na jednostkę centralną jednocześnie, ponieważ 100-88=12. Dlatego do innych zastosowań (takich jak wywołania zwrotne usługi sieci Web) dostępnych jest co najmniej 88*N wątków roboczych i 88*N wątków portu zakończenia.

Przykładowo używany jest serwer z czterema procesorami i włączoną wielowątkowością. Opierając się na tych formułach, należy zastosować następujące wartości dla ustawień konfiguracji podanych w tym artykule.
<processModel maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50">
<httpRuntime minFreeThreads="704" minLocalRequestFreeThreads="608"> 
<connectionManagement>
	<add address="[MiejsceNaAdresIP]" maxconnection="96"/>
</connectionManagement>

Również podczas korzystania z tej konfiguracji dostępnych jest 12 połączeń na jednostkę centralną na adres IP każdego poziomu AppDomain. Dlatego w następującym scenariuszu występuje niewielki konflikt, gdy żądania oczekują na połączenia, a pula wątków nie jest wyczerpana:
  • Sieć Web obsługuje tylko jedną aplikację (AppDomain).
  • Każde żądanie strony ASPX to jedno żądanie usługi sieci Web.
  • Wszystkie żądania są kierowane pod tym samym adresem IP.
Jeżeli jednak użyjesz tej konfiguracji, w następujących scenariuszach może być użytych zbyt wiele połączeń:
  • Żądania wysyłane pod wieloma adresami IP.
  • Żądania są przekierowywane (kod stanu 302).
  • Żądania wymagają uwierzytelnienia.
  • Żądania są wykonywane z wielu domen AppDomain.
W wymienionych scenariuszach warto użyć mniejszej wartości parametru maxconnection i większych wartości parametru minFreeThreads i parametru minLocalRequestFreeThreads.

Stan

Takie zachowanie jest zgodne z projektem programu.

Materiały referencyjne

Aby uzyskać więcej informacji, odwiedź następującą witrynę usługi MSDN (Microsoft Developer Network) w sieci Web:
http://msdn2.microsoft.com/en-us/library/ms998549.aspx

Właściwości

Numer ID artykułu: 821268 - Ostatnia weryfikacja: 13 marca 2007 - Weryfikacja: 7.2
Informacje zawarte w tym artykule dotyczą:
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Słowa kluczowe: 
kbprb KB821268

Przekaż opinię

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com