Teď jste offline a čekáte, až se znova připojí internet.

Konflikty, sníženého výkonu a zablokování při volání webové služby z aplikace technologie ASP.NET

DŮLEŽITÉ: Tento článek je přeložen pomocí softwaru na strojový překlad Microsoft. Nepřesný či chybný překlad lze opravit prostřednictvím technologie Community Translation Framework (CTF). Microsoft nabízí strojově přeložené, komunitou dodatečně upravované články, a články přeložené lidmi s cílem zajistit přístup ke všem článkům v naší znalostní bázi ve více jazycích. Strojově přeložené a dodatečně upravované články mohou obsahovat chyby ve slovníku, syntaxi a gramatice. Společnost Microsoft není odpovědná za jakékoliv nepřesnosti, chyby nebo škody způsobené nesprávným překladem obsahu nebo jeho použitím našimi zákazníky. Více o CTF naleznete na http://support.microsoft.com/gp/machine-translation-corrections/cs.

Projděte si také anglickou verzi článku: 821268
Příznaky
Pokud provedete volání webové služby z aplikace Microsoft ASP.NET, může dojít k soupeření, sníženého výkonu a zablokování. Klienti mohou hlásit, že požadavky přestat reagovat (nebo "zavěsit"), nebo trvat velmi dlouhou dobu spuštění. Pokud podezření na zablokování, může být pracovní proces recyklován. Může se zobrazit následující zprávy v protokolu událostí aplikace.
  • Pokud používáte Internetová informační služba (IIS) 5.0, můžete zobrazit následující zprávy v protokolu aplikace:

       Event Type:     Error   Event Source:   ASP.NET 1.0.3705.0   Event Category: None   Event ID:       1003   Date:           5/4/2003   Time:           6:18:23 PM   User:           N/A   Computer:       <ComputerName>   Description:      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.

  • Pokud používáte službu IIS 6.0, můžete zobrazit následující zprávy v protokolu aplikace:

       Event Type:     Warning   Event Source:   W3SVC-WP   Event Category: None   Event ID:       2262   Date:           5/4/2003   Time:           1:02:33 PM   User:           N/A   Computer:       <ComputerName>   Description:      ISAPI 'C:\Windows\Microsoft.net\Framework\v.1.1.4322\aspnet_isapi.dll' reported itself as      unhealthy for the following reason: 'Deadlock detected'.

  • Pokud používáte službu IIS 6.0, můžete zobrazit následující zprávy do systémového protokolu:

       Event Type:     Warning   Event Source:   W3SVC   Event Category: None   Event ID:       1013   Date:           5/4/2003   Time:           1:03:47 PM   User:           N/A   Computer:       <ComputerName>   Description:      A process serving application pool 'DefaultAppPool' exceeded time limits during shut down.      The process id was '<xxxx>'.

Také zobrazí následující chybová zpráva výjimka při volání metody HttpWebRequest.GetResponse :
"Výjimka System.InvalidOperationException: nebyl dostatek volných vláken v objektu zachovalo k dokončení této operace."
Můžete také obdržet následující chybová zpráva výjimka v prohlížeči:
"HttpException (0x80004005): Vypršel časový limit žádosti."
Poznámka: Tento článek platí také pro aplikace, které přímo požádat HttpWebRequest .
Příčina
Tomuto problému může dojít, protože technologie ASP.NET omezuje počet pracovních podprocesů a port ukončení podprocesů volání lze použít k provedení požadavků.

Volání webové služby se obvykle používá jeden podproces spuštění kódu, který odesílá požadavek a jeden podproces dokončení port pro příjem zpětného volání z webové služby. Pokud však požadavek přesměrován, nebo vyžaduje ověření, volání může použít až dva pracovní podprocesy a oba podprocesy port dokončení. Proto můžete vyčerpat spravované zachovalo, při současně dojít k více voláním webové služby.

Předpokládejme například, že zachovalo je omezena na 10 pracovních podprocesů a všech 10 pracovních podprocesů aktuálně prováděných kód, který čeká na zpětné volání spustit. Zpětné volání lze nikdy spustit, protože všechny pracovních položek, které jsou ve frontě, aby zachovalo jsou blokovány, dokud nebude k dispozici podproces.

Jiné potenciální zdroj konfliktu je maxconnection parametr, který používá obor názvů System.Net omezit počet připojení. Obecně tento limit funguje podle očekávání. Však pokud mnoho aplikací se pokusí provést mnoho požadavků na jedinou adresu IP ve stejné době, může mít podprocesy čekání na připojení k dispozici.
Řešení
Chcete-li vyřešit tyto potíže, můžete naladit následující parametry v souboru Machine.config, která nejlépe vyhovuje vaší situaci:
  • maxWorkerThreads
  • minWorkerThreads
  • maxIoThreads
  • minFreeThreads
  • minLocalRequestFreeThreads
  • maxconnection
  • executionTimeout
Chcete-li tyto problémy vyřešit úspěšně, můžete proveďte následující akce:
  • Omezte počet požadavků technologie ASP.NET, které mohou být prováděny ve stejnou dobu přibližně 12 na jeden procesor.
  • Povolte webové služby zpětná volně použít vlákna zachovalo.
  • Vyberte odpovídající hodnotu parametru maxconnections . Počet andAppDomains IP adresy, které jsou používány založte svůj výběr.
Poznámka: Doporučení omezit počet žádostí technologie ASP.NET 12 každý procesor je poněkud svévolné. Toto omezení však ukázala funguje dobře pro většinu aplikací.

maxWorkerThreads a maxIoThreads

Technologie ASP.NET používá následující nastavení konfigurace dvou omezit maximální počet pracovních podprocesů a ukončení podprocesů, které jsou používány:
<processModel maxWorkerThreads="20" maxIoThreads="20">
Parametr maxWorkerThreads a parametr maxIoThreads se implicitně násobí počet procesorů. Například pokud máte dva procesory, maximální počet pracovních podprocesů je následující:
2 * maxWorkerThreads

minFreeThreads a minLocalRequestFreeThreads

Technologie ASP.NET obsahuje také následující nastavení konfigurace, které určují počet pracovních podprocesů a ukončení podprocesů port musí být k dispozici ke spuštění vzdáleného požadavku nebo místní požadavek:
<httpRuntime minFreeThreads="8" minLocalRequestFreeThreads="8">
Pokud nejsou k dispozici dostatečné vláken, je požadavek ve frontě dokud dostatečně vlákna jsou zdarma k provedení požadavku. Proto technologie ASP.NET nebude možné spustit více než následující počet požadavků současně:
(maxWorkerThreads*počet procesorů)-minFreeThreads
Poznámka:MinFreeThreads parametr a parametru minLocalRequestFreeThreads nejsou násobí implicitně počet procesorů.

minWorkerThreads

Technologie ASP.NET 1.0 Service Pack 3 a 1.1 technologie ASP.NET technologie ASP.NET obsahuje také následující konfigurační nastavení, které určuje, kolik pracovních podprocesů může být k dispozici okamžitě služby vzdáleného požadavku.
<processModel minWorkerThreads="1">
Podprocesů, které jsou ovládány pomocí tohoto nastavení lze vytvořit mnohem vyšší rychlostí než pracovních podprocesů, které jsou vytvořeny z možnosti "optimalizace vlákno" výchozí modul CLR. Toto nastavení umožňuje požadavky technologie ASP.NET do služby, které mohou být náhle naplnění fronty požadavků ASP.NET kvůli zpomalování na serveru back-end, náhlé shlukového přenosu požadavků koncového klienta nebo něco podobného, který by způsobil náhlým nárůstem počtu požadavků ve frontě. Výchozí hodnota pro parametr minWorkerThreads je 1. Doporučujeme nastavit hodnotu pro parametr minWorkerThreads na následující hodnotu.
minWorkerThreads = maxWorkerThreads / 2
Standardně je parametr minWorkerThreads není v souboru Web.config nebo Machine.config. Toto nastavení je implicitně vynásobením počtu procesorů.

maxconnection

Maxconnection parametr určuje, kolik připojení lze provádět určitou adresu IP. Tento parametr se zobrazí následovně:
<connectionManagement>    <add address="*" maxconnection="2">    <add address="http://65.53.32.230" maxconnection="12"></connectionManagement>
Pokud kód aplikace odkazuje na aplikaci podle názvu hostitele namísto adresy IP, parametr by měl vypadat takto:
<connectionManagement>    <add address="*" maxconnection="2">    <add address="http://hostname" maxconnection="12"></connectionManagement>
Navíc-pokud aplikace je umístěn na jiný port než 80, parametr musí obsahovat nestandardní port v identifikátoru URI je podobná následující:
<connectionManagement>    <add address="*" maxconnection="2">    <add address="http://hostname:8080" maxconnection="12"></connectionManagement>
Nastavení parametrů, které jsou popsány dříve v tomto článku budou na úrovni procesu. Nastavení parametru maxconnection však platí na úrovni domény aplikace. Ve výchozím nastavení vzhledem k tomu, že toto nastavení platí pro úroveň domény aplikace, můžete vytvořit maximálně dvě připojení na konkrétní adresu IP z každé domény aplikace v procesu.

executionTimeout

Technologie ASP.NET používá následující nastavení konfigurace pro omezení doba provádění požadavku:
<httpRuntime executionTimeout="90"/>
Tento limit lze nastavit také pomocí vlastnosti Server.ScriptTimeout .

Poznámka: Pokud zvýšíte hodnotu položky executionTimeout parametru, bude pravděpodobně také změnit nastavení parametru processModel responseDeadlockInterval .

Doporučení

Nastavení, které se doporučuje v této části nemusí fungovat pro všechny aplikace. Však následující doplňkové informace pomohou provést příslušné úpravy.

Pokud provádíte jednu volání webové služby na jedinou adresu IP z každé stránky ASPX, společnost Microsoft doporučuje použít následující nastavení konfigurace:
  • Hodnoty parametru maxWorkerThreads a maxIoThreads parametru nastavena na hodnotu 100.
  • Nastavte hodnotu maxconnection parametr 12 *N (kde N je počet procesorů spočítačovým mít).
  • Nastavte hodnoty parametru minFreeThreads88 *N a pomocí parametru minLocalRequestFreeThreads76 *N.
  • Setthe hodnota minWorkerThreads na 50. Nezapomeňte, že minWorkerThreads není ve výchozím nastavení konfiguračního souboru. Je třeba ji přidat.
Některé z těchto doporučení se týkají jednoduchý vzorec, který zahrnuje počet procesorů na serveru. Je proměnná, která představuje počet procesorů ve vzorcích N. Pro tato nastavení máte hyperthreading povoleno, je nutné použít počet logických procesorů místo počet fyzických procesorů. Například pokud máte čtyřprocesorových server s hyperthreading povoleno, pak hodnota N ve vzorcích budou 8 místo 4.

Poznámka: Při použití této konfigurace lze provést maximálně 12 ASP.NET požadavky na procesor ve stejnou dobu, protože 100 88 = 12. Tedy minimálně 88 *N pracovní vlákna a 88 *N dokončení port vlákna jsou k dispozici pro jiné účely (například pro zpětná volání webové služby).

Například používáte server se čtyřmi procesory a hyperthreading povoleno. Na základě těchto vzorců, použijete tyto hodnoty pro nastavení konfigurace, které jsou zmíněny v tomto článku.
<system.web>	<processModel maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50"/>	<httpRuntime minFreeThreads="704" minLocalRequestFreeThreads="608"/></system.web><system.net>	<connectionManagement>		<add address="[ProvideIPHere]" maxconnection="96"/>	</connectionManagement></system.net>

Navíc při použití této konfigurace 12 připojení jsou k dispozici každý procesor jedné IP adrese pro jednotlivé domény aplikace. Proto v následující situaci velmi málo soupeření dojde k čekající požadavky pro připojení a není vyčerpána fondu podprocesů:
  • Web hostí pouze jedna aplikace (AppDomain).
  • Každý požadavek na stránku ASPX je jeden požadavek webové služby.
  • Všechny požadavky se stejnou IP adresou.
Však při použití této konfigurace scénářích, které obsahují jednu z následujících akcí bude pravděpodobně používat příliš mnoho připojení:
  • Požadavky jsou na více adres IP.
  • Požadavky jsou přesměrované (302 stavový kód).
  • Požadavky vyžadují ověřování.
  • Požadavky jsou vyrobeny z více součástí AppDomain.
V těchto případech je vhodné použít nižší hodnotu maxconnection parametr a vyšší hodnoty parametru minFreeThreads a pomocí parametru minLocalRequestFreeThreads .
Prohlášení
Toto chování je záměrné.
Další informace
Pokud dochází k nedostatečný výkon a soupeření ve službě IIS 7.0 a ASP.NET, přejděte na následující Microsoft blogy:
Odkazy
Další informace naleznete na následujícím webu Microsoft Developer Network (MSDN):

Upozornění: Tento článek je přeložený automaticky

Vlastnosti

ID článku: 821268 - Poslední kontrola: 03/15/2015 03:37:00 - Revize: 14.0

Microsoft .NET Framework 2.0, Microsoft ASP.NET 1.1, Microsoft ASP.NET 1.0

  • kbprb kbmt KB821268 KbMtcs
Váš názor