Kontrolowanie zużycia zasobów i zwiększanie wydajności
W tym temacie opisano różne właściwości w różnych obszarach architektury programu Windows Communication Foundation (WCF), które działają w celu kontrolowania zużycia zasobów i wpływu na metryki wydajności.
Właściwości ograniczające użycie zasobów w programie WCF
Program Windows Communication Foundation (WCF) stosuje ograniczenia dotyczące niektórych typów procesów na potrzeby zabezpieczeń lub wydajności. Te ograniczenia są dostępne w dwóch głównych formach: przydziałach i ograniczeniach. Limity przydziału to limity, które po osiągnięciu lub przekroczeniu wyzwalają natychmiastowy wyjątek w pewnym momencie systemu. Ograniczenia to limity, które nie powodują natychmiastowego zgłoszenia wyjątku. Zamiast tego po osiągnięciu limitu ograniczenia przetwarzanie będzie kontynuowane, ale w granicach ustawionych przez wartość ograniczania. To ograniczone przetwarzanie może spowodować wystąpienie wyjątku w innym miejscu, ale zależy to od aplikacji.
Oprócz rozróżnienia między limitami przydziału i ograniczeniami niektóre właściwości ograniczenia znajdują się na poziomie serializacji, niektóre na poziomie transportu, a niektóre na poziomie aplikacji. Na przykład limit przydziału TransportBindingElement.MaxReceivedMessageSize, który jest implementowany przez wszystkie elementy powiązania transportu dostarczone przez system, jest ustawiony na 65 536 bajtów domyślnie, aby utrudnić złośliwym klientom angażowanie się w ataki typu "odmowa usługi" na usługę przez spowodowanie nadmiernego zużycia pamięci. (Zazwyczaj można zwiększyć wydajność, obniżając tę wartość).
Przykładem przydziału serializacji jest DataContractSerializer.MaxItemsInObjectGraph właściwość, która określa maksymalną liczbę obiektów serializujących lub deserializujących w jednym ReadObject wywołaniu metody. Przykładem ograniczania na poziomie aplikacji jest ServiceThrottle.MaxConcurrentSessions właściwość, która domyślnie ogranicza liczbę współbieżnych połączeń kanału sesji do 10. (W przeciwieństwie do limitów przydziału, jeśli ta wartość ograniczania zostanie osiągnięta, aplikacja kontynuuje przetwarzanie, ale nie akceptuje nowych kanałów sesji, co oznacza, że nowi klienci nie mogą nawiązać połączenia do momentu zakończenia jednego z innych kanałów sesji).
Te mechanizmy kontroli zostały zaprojektowane tak, aby zapewnić gotowe do użycia środki zaradcze w przypadku niektórych typów ataków lub poprawić metryki wydajności, takie jak zużycie pamięci, czas uruchamiania itd. Jednak w zależności od aplikacji te kontrolki mogą utrudniać wydajność aplikacji usługi lub uniemożliwić działanie aplikacji w ogóle. Na przykład aplikacja przeznaczona do strumieniowego przesyłania strumieniowego wideo może łatwo przekroczyć właściwość domyślną TransportBindingElement.MaxReceivedMessageSize . W tym temacie omówiono różne kontrolki stosowane do aplikacji na wszystkich poziomach programu WCF, opisano różne sposoby uzyskiwania dodatkowych informacji na temat tego, czy ustawienie utrudnia aplikację, i opisuje sposoby rozwiązywania różnych problemów. Większość ograniczeń i niektóre limity przydziału są dostępne na poziomie aplikacji, nawet jeśli właściwość podstawowa jest serializacją lub ograniczeniem transportu. Na przykład można ustawić DataContractSerializer.MaxItemsInObjectGraph właściwość przy użyciu ServiceBehaviorAttribute.MaxItemsInObjectGraph właściwości w klasie usługi.
Uwaga
Jeśli masz konkretny problem, najpierw przeczytaj przewodnik Szybki start dotyczący rozwiązywania problemów z usługą WCF, aby sprawdzić, czy problem (i rozwiązanie) jest tam wymieniony.
Właściwości ograniczające procesy serializacji są wymienione w temacie Zagadnienia dotyczące zabezpieczeń danych. Właściwości ograniczające zużycie zasobów związanych z transportami są wymienione w temacie Przydziały transportu. Właściwości ograniczające zużycie zasobów w warstwie aplikacji są elementami członkowskimi ServiceThrottle klasy.
Wykrywanie problemów z aplikacją i wydajnością związanych z Ustawienia limitu przydziału
Wartości domyślne powyższych wartości zostały wybrane w celu włączenia podstawowych funkcji aplikacji w wielu różnych typach aplikacji przy jednoczesnym zapewnieniu podstawowej ochrony przed typowymi problemami z zabezpieczeniami. Jednak różne projekty aplikacji mogą przekraczać jedno lub więcej ustawień ograniczania, mimo że aplikacja jest bezpieczna i działa zgodnie z założeniami. W takich przypadkach należy określić, które wartości ograniczania są przekraczane i na jakim poziomie oraz zdecydować o odpowiednim przebiegu działania w celu zwiększenia przepływności aplikacji.
Zazwyczaj podczas pisania aplikacji i debugowania jej należy ustawić ServiceDebugBehavior.IncludeExceptionDetailInFaults właściwość na true
w pliku konfiguracji lub programowo. Spowoduje to, że program WCF zwróci ślady stosu wyjątków usługi do aplikacji klienckiej do wyświetlania. Ta funkcja zgłasza większość wyjątków na poziomie aplikacji w taki sposób, jak wyświetlanie ustawień limitu przydziału, jeśli jest to problem.
Niektóre wyjątki występują w czasie wykonywania poniżej widoczności warstwy aplikacji i nie są zwracane przy użyciu tego mechanizmu i mogą nie być obsługiwane przez implementację niestandardową System.ServiceModel.Dispatcher.IErrorHandler . Jeśli korzystasz ze środowiska programistycznego, takiego jak Microsoft Visual Studio, większość z tych wyjątków jest wyświetlana automatycznie. Jednak niektóre wyjątki mogą być maskowane przez ustawienia środowiska deweloperskiego, takie jak Just My Code Visual Studio.
Niezależnie od możliwości środowiska projektowego, możesz użyć funkcji śledzenia i rejestrowania komunikatów WCF, aby debugować wszystkie wyjątki i dostosowywać wydajność aplikacji. Aby uzyskać więcej informacji, zobacz Używanie śledzenia do rozwiązywania problemów z aplikacją.
Problemy z wydajnością i xmlSerializer
Usługi i aplikacje klienckie korzystające z typów danych, które można serializować przy użyciu XmlSerializer kodu generowania i kompilowania serializacji dla tych typów danych w czasie wykonywania, co może spowodować spowolnienie wydajności uruchamiania.
Uwaga
Wstępnie wygenerowany kod serializacji może być używany tylko w aplikacjach klienckich, a nie w usługach.
Narzędzie ServiceModel Metadata Tool (Svcutil.exe) może zwiększyć wydajność uruchamiania tych aplikacji, generując niezbędny kod serializacji z skompilowanych zestawów dla aplikacji. Aby uzyskać więcej informacji, zobacz How to: Improve the Startup Time of WCF Client Applications using the XmlSerializer (Jak poprawić czas uruchamiania aplikacji klienckich WCF przy użyciu narzędzia XmlSerializer).
Problemy z wydajnością podczas hostowania usług WCF w ASP.NET
Gdy usługa WCF jest hostowana w usługach IIS i ASP.NET, ustawienia konfiguracji usług IIS i ASP.NET mogą mieć wpływ na przepływność i pamięć usługi WCF. Aby uzyskać więcej informacji na temat wydajności ASP.NET, zobacz Poprawianie wydajności ASP.NET. Jedno ustawienie, które może mieć niezamierzone konsekwencje, to MinWorkerThreads, czyli właściwość ProcessModelSection. Jeśli aplikacja ma stałą lub małą liczbę klientów, ustawienie MinWorkerThreads wartości 2 może zapewnić zwiększenie przepływności na maszynie wieloprocesorowej, która ma wykorzystanie procesora CPU zbliżone do 100%. Ten wzrost wydajności wiąże się z kosztami: spowoduje to również wzrost użycia pamięci, co może zmniejszyć skalowalność.