Řízení spotřeby prostředků a zlepšení výkonu
Toto téma popisuje různé vlastnosti v různých oblastech architektury WCF (Windows Communication Foundation), které pracují na řízení spotřeby prostředků a ovlivňují metriky výkonu.
Vlastnosti, které omezují spotřebu prostředků ve WCF
Windows Communication Foundation (WCF) používá omezení pro určité typy procesů pro účely zabezpečení nebo výkonu. Tato omezení mají dvě hlavní formy– kvóty a omezení. Kvóty jsou omezení, která při dosažení nebo překročení aktivují okamžitou výjimku v určitém okamžiku v systému. Omezení jsou omezení, která okamžitě nezpůsobí vyvolání výjimky. Místo toho při dosažení limitu omezení bude zpracování pokračovat, ale v mezích nastavených hodnotou omezení. Toto omezené zpracování může aktivovat výjimku jinde, ale to závisí na aplikaci.
Kromě rozlišování mezi kvótami a omezeními se některé vlastnosti omezení nacházejí na úrovni serializace, některé na úrovni přenosu a některé na úrovni aplikace. Například kvóta TransportBindingElement.MaxReceivedMessageSize, která je implementována všemi prvky přenosové vazby poskytované systémem, je nastavena na 65 536 bajtů ve výchozím nastavení, aby zabránila škodlivým klientům v zapojení útoků do služby do útoku na službu tím, že způsobuje nadměrnou spotřebu paměti. (Obvykle můžete zvýšit výkon snížením této hodnoty.)
Příkladem kvóty serializace je DataContractSerializer.MaxItemsInObjectGraph vlastnost, která určuje maximální počet objektů, které serializátor serializuje nebo deserializuje v jednom ReadObject volání metody. Příkladem omezení na úrovni aplikace je ServiceThrottle.MaxConcurrentSessions vlastnost, která ve výchozím nastavení omezuje počet souběžných připojení kanálu relace na 10. (Na rozdíl od kvót platí, že pokud dojde k dosažení této hodnoty omezení, aplikace pokračuje ve zpracování, ale nepřijímá žádné nové kanály s relacemi, což znamená, že se noví klienti nemůžou připojit, dokud nebude ukončen jeden z ostatních kanálů relace.)
Tyto ovládací prvky jsou navržené tak, aby poskytovaly předem nastavené zmírnění rizik u určitých typů útoků nebo zlepšily metriky výkonu, jako jsou nároky na paměť, čas spuštění atd. V závislosti na aplikaci ale tyto ovládací prvky můžou bránit výkonu aplikace služby nebo zabránit tomu, aby aplikace vůbec fungovala. Například aplikace navržená pro streamování videa může snadno překročit výchozí TransportBindingElement.MaxReceivedMessageSize vlastnost. Toto téma obsahuje přehled různých ovládacích prvků použitých pro aplikace na všech úrovních WCF, popisuje různé způsoby, jak získat další informace o tom, zda nastavení brání vaší aplikaci, a popisuje způsoby, jak opravit různé problémy. Většina omezení a některé kvóty jsou k dispozici na úrovni aplikace, i když je základní vlastnost serializace nebo přenos omezení. Vlastnost můžete například nastavit DataContractSerializer.MaxItemsInObjectGraph pomocí ServiceBehaviorAttribute.MaxItemsInObjectGraph vlastnosti třídy služby.
Poznámka:
Pokud máte konkrétní problém, měli byste si nejdřív přečíst rychlý start pro řešení potíží s WCF a zjistit, jestli tam je váš problém (a řešení).
Vlastnosti, které omezují procesy serializace, jsou uvedeny v aspektech zabezpečení pro data. Vlastnosti, které omezují spotřebu prostředků souvisejících s přenosy, jsou uvedeny v kvótách přenosu. Vlastnosti, které omezují spotřebu prostředků na aplikační vrstvě, jsou členy ServiceThrottle třídy.
Zjišťování problémů s aplikací a výkonem souvisejících s Nastavení kvót
Výchozí hodnoty předchozích hodnot byly zvoleny tak, aby umožňovaly základní funkce aplikací v široké škále typů aplikací a současně poskytovaly základní ochranu před běžnými problémy se zabezpečením. Různé návrhy aplikací však mohou překročit jedno nebo více nastavení omezení, i když je aplikace jinak zabezpečená a fungovala by tak, jak je navržena. V těchto případech musíte určit, které hodnoty omezení se překročí a na jaké úrovni, a rozhodnout se, jaký postup je vhodný pro zvýšení propustnosti aplikace.
Při zápisu aplikace a jeho ladění obvykle nastavíte ServiceDebugBehavior.IncludeExceptionDetailInFaults vlastnost v true
konfiguračním souboru nebo programově. To dává WCF pokyn, aby vrátil trasování zásobníku výjimek služby klientské aplikaci pro zobrazení. Tato funkce hlásí většinu výjimek na úrovni aplikace takovým způsobem, jak zobrazit, která nastavení kvóty se můžou v případě problému účastnit.
K některým výjimkám dochází za běhu pod viditelností aplikační vrstvy a nevrací se pomocí tohoto mechanismu a nemusí je zpracovat vlastní System.ServiceModel.Dispatcher.IErrorHandler implementace. Pokud jste ve vývojovém prostředí, jako je Microsoft Visual Studio, zobrazí se většina těchto výjimek automaticky. Některé výjimky ale můžou být maskovány nastavením vývojového prostředí, jako je například Just My Code Visual Studio.
Bez ohledu na možnosti vývojového prostředí můžete pomocí funkcí trasování WCF a protokolování zpráv ladit všechny výjimky a ladit výkon vašich aplikací. Další informace najdete v tématu Použití trasování k řešení potíží s aplikací.
Problémy s výkonem a XmlSerializer
Služby a klientské aplikace, které používají datové typy serializovatelné pomocí XmlSerializer kódu generování a kompilace serializace pro tyto datové typy za běhu, což může vést k pomalému spuštění výkonu.
Poznámka:
Předgenerovaný kód serializace lze použít pouze v klientských aplikacích a ne ve službách.
Nástroj ServiceModel Metadata Utility (Svcutil.exe) může zlepšit výkon spouštění pro tyto aplikace generováním potřebného serializačního kódu z kompilovaných sestavení pro aplikaci. Další informace naleznete v tématu Postupy: Zlepšení doby spuštění klientských aplikací WCF pomocí XmlSerializer.
Problémy s výkonem při hostování služeb WCF v ASP.NET
Pokud je služba WCF hostovaná ve službě IIS a ASP.NET, může nastavení konfigurace služby IIS a ASP.NET ovlivnit propustnost a paměťovou stopu služby WCF. Další informace o výkonu ASP.NET naleznete v tématu Zlepšení výkonu ASP.NET. Jedním z nastavení, které může mít nezamýšlené důsledky, je MinWorkerThreads, což je vlastnost ProcessModelSection. Pokud má vaše aplikace pevný nebo malý počet klientů, MinWorkerThreads nastavení na 2 může zvýšit propustnost u počítače s více procesory, který má využití procesoru téměř 100 %. Toto zvýšení výkonu přináší náklady: to také způsobí zvýšení využití paměti, což může snížit škálovatelnost.