Udostępnij za pośrednictwem


Kontrolowanie zużycia zasobów i poprawianie 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. Kwoty to limity, które po osiągnięciu lub przekroczeniu wyzwalają natychmiastowy wyjątek w systemie. Ograniczenia przepustowości to limity, które nie prowadzą do natychmiastowego wystąpienia wyjątku. Zamiast tego, po osiągnięciu limitu przepustnicy, przetwarzanie będzie kontynuowane, ale w granicach określonych przez tę wartość przepustnicy. 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 i ograniczeniami wydajności, niektóre właściwości ograniczające znajdują się na poziomie serializacji, niektóre na poziomie transportu, a niektóre na poziomie aplikacji. Na przykład limit TransportBindingElement.MaxReceivedMessageSize, który jest stosowany przez wszystkie systemowe elementy powiązania transportowego, jest domyślnie ustawiony na 65 536 bajtów, aby utrudnić złośliwym klientom przeprowadzanie ataków typu „odmowa usługi” poprzez nadmierne zużycie pamięci. (Zazwyczaj można zwiększyć wydajność, obniżając tę wartość).

Przykładem przydziału serializacji jest właściwość DataContractSerializer.MaxItemsInObjectGraph, która określa maksymalną liczbę obiektów, które serializer serializuje lub deserializuje podczas jednego wywołania metody ReadObject. Przykładem ograniczania na poziomie aplikacji jest ServiceThrottle.MaxConcurrentSessions atrybut, który domyślnie ogranicza liczbę współbieżnych połączeń kanałów sesyjnych do 10. (W przeciwieństwie do limitów przydziału, jeśli ta wartość limitu zostanie osiągnięta, aplikacja kontynuuje przetwarzanie, ale nie akceptuje nowych kanałów sesyjnych, co oznacza, że nowi klienci nie mogą nawiązać połączenia do momentu zakończenia jednego z innych kanałów sesyjnych).

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 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ść przepustowości i niektóre limity przydziału są dostępne na poziomie aplikacji, nawet jeśli właściwość podstawowa jest serializacją lub ograniczeniem transportowym. Na przykład można ustawić właściwość DataContractSerializer.MaxItemsInObjectGraph za pomocą właściwości ServiceBehaviorAttribute.MaxItemsInObjectGraph w klasie serwisowej.

Uwaga / Notatka

Jeśli masz konkretny problem, najpierw przeczytaj WCF Troubleshooting Quickstart, 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.

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, aby wskazać, które ustawienia limitu przydziału mogą być związane z problemem.

Niektóre wyjątki zdarzają się w czasie działania programu poza widocznością warstwy aplikacji i nie są zwracane przy użyciu tego mechanizmu, które mogą nie być obsługiwane przez niestandardową implementację 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, generują i kompilują kod serializacyjny dla tych typów danych w czasie działania, co może spowodować spowolnienie wydajności uruchamiania.

Uwaga / Notatka

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 na podstawie 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 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ść.

Zobacz także