Freigeben über


Steuern des Ressourcenverbrauchs und Verbessern der Leistung

In diesem Thema werden verschiedene Eigenschaften in verschiedenen Bereichen der Windows Communication Foundation (WCF)-Architektur beschrieben, die zur Steuerung des Ressourcenverbrauchs und auswirkungen auf Leistungsmetriken funktionieren.

Eigenschaften, die den Ressourcenverbrauch in WCF einschränken

Windows Communication Foundation (WCF) wendet Einschränkungen für bestimmte Arten von Prozessen für Sicherheits- oder Leistungszwecke an. Diese Einschränkungen bestehen in zwei Hauptformen, entweder Kontingente und Drosselungen. Kontingente sind Grenzwerte, die bei Erreichen oder Überschreiten eine sofortige Ausnahme zu einem bestimmten Zeitpunkt im System auslösen. Drosselungen sind Beschränkungen, die nicht sofort eine Ausnahme auslösen. Wenn stattdessen ein Drosselungslimit erreicht wird, wird die Verarbeitung fortgesetzt, aber innerhalb der durch diesen Drosselungswert festgelegten Grenzwerte. Diese eingeschränkte Verarbeitung kann an anderer Stelle eine Ausnahme auslösen, dies hängt jedoch von der Anwendung ab.

Neben der Unterscheidung zwischen Kontingenten und Drosselungen befinden sich einige Einschränkungseigenschaften auf Serialisierungsebene, einige auf Transportebene und einige auf Anwendungsebene. Beispielsweise wird das Kontingent TransportBindingElement.MaxReceivedMessageSize, das von allen vom System bereitgestellten Transportbindungselementen implementiert wird, standardmäßig auf 65.536 Byte festgelegt, um böswillige Clients daran zu hindern, Angriffe mit Denial-of-Service auf einen Dienst durchzuführen, indem übermäßige Arbeitsspeicherauslastung verursacht wird. (In der Regel können Sie die Leistung erhöhen, indem Sie diesen Wert verringern.)

Ein Beispiel für ein Serialisierungskontingent ist die DataContractSerializer.MaxItemsInObjectGraph Eigenschaft, die die maximale Anzahl von Objekten angibt, die der Serialisierer in einem einzelnen ReadObject Methodenaufruf serialisiert oder deserialisiert. Ein Beispiel für eine Drosselung auf Anwendungsebene ist die ServiceThrottle.MaxConcurrentSessions Eigenschaft, die standardmäßig die Anzahl der gleichzeitigen Sitzungskanalverbindungen auf 10 beschränkt. (Anders als bei den Kontingenten setzt die Anwendung die Verarbeitung fort, wenn dieser Drosselungswert erreicht ist, jedoch akzeptiert sie keine neuen sitzungsbasierten Kanäle, was bedeutet, dass neue Clients erst dann eine Verbindung herstellen können, wenn einer der anderen sitzungsbasierten Kanäle beendet wurde.)

Diese Steuerelemente dienen dazu, eine sofort einsatzbereite Gegenmaßnahme gegen bestimmte Arten von Angriffen bereitzustellen oder Leistungsmetriken wie Speicherbedarf, Startzeit usw. zu verbessern. Je nach Anwendung können diese Steuerelemente jedoch die Leistung der Dienstanwendung beeinträchtigen oder verhindern, dass die Anwendung überhaupt funktioniert. Beispielsweise kann eine Anwendung, die zum Streamen von Videos entwickelt wurde, die Standardeigenschaft TransportBindingElement.MaxReceivedMessageSize problemlos überschreiten. Dieses Thema bietet eine Übersicht über die verschiedenen Steuerelemente, die auf Anwendungen auf allen WCF-Ebenen angewendet werden, beschreibt verschiedene Möglichkeiten, um weitere Informationen darüber zu erhalten, ob eine Einstellung Ihre Anwendung behindert, und beschreibt Möglichkeiten zur Behebung verschiedener Probleme. Die meisten Drosselungen und einige Kontingente sind auf Anwendungsebene verfügbar, auch wenn die Basiseigenschaft eine Serialisierungs- oder Transporteinschränkung ist. Beispielsweise können Sie die DataContractSerializer.MaxItemsInObjectGraph-Eigenschaft mithilfe der ServiceBehaviorAttribute.MaxItemsInObjectGraph-Eigenschaft in der Dienstklasse festlegen.

Hinweis

Wenn Sie ein bestimmtes Problem haben, sollten Sie zuerst die WCF-Schnellstartanleitung zur Problembehandlung lesen, um festzustellen, ob Ihr Problem (und eine Lösung) dort aufgeführt ist.

Eigenschaften, die Serialisierungsprozesse einschränken, werden in Sicherheitsüberlegungen für Daten aufgeführt. Eigenschaften, die den Verbrauch von Ressourcen im Zusammenhang mit Transporten einschränken, werden in Transportkontingenten aufgeführt. Eigenschaften, die den Verbrauch von Ressourcen auf der Anwendungsebene einschränken, sind die Member der ServiceThrottle Klasse.

Die Standardwerte der vorstehenden Werte wurden ausgewählt, um grundlegende Anwendungsfunktionen über eine Vielzahl von Anwendungstypen hinweg zu aktivieren und gleichzeitig grundlegenden Schutz vor häufig auftretenden Sicherheitsproblemen zu bieten. Verschiedene Anwendungsdesigns können jedoch eine oder mehrere Drosselungseinstellungen überschreiten, obwohl die Anwendung andernfalls sicher ist und wie entworfen funktioniert. In diesen Fällen müssen Sie ermitteln, welche Drosselungswerte und auf welcher Ebene sie überschritten werden, und über die geeigneten Maßnahmen entscheiden, um den Anwendungsdurchsatz zu erhöhen.

In der Regel legen Sie, beim Schreiben und Debuggen der Anwendung, die ServiceDebugBehavior.IncludeExceptionDetailInFaults-Eigenschaft auf true in der Konfigurationsdatei oder programmgesteuert fest. Dadurch wird WCF angewiesen, Dienstausnahme-Stapelüberwachungen zur Anzeige an die Clientanwendung zurückzugeben. Dieses Feature meldet die meisten Ausnahmen auf Anwendungsebene so, dass angezeigt werden kann, welche Kontingenteinstellungen einbezogen werden können, wenn dies das Problem ist.

Einige Ausnahmen treten zur Laufzeit unterhalb der Sichtbarkeitsebene der Anwendung auf und werden nicht mit diesem Mechanismus zurückgegeben, daher werden sie möglicherweise nicht von einer benutzerdefinierten System.ServiceModel.Dispatcher.IErrorHandler Implementierung behandelt. Wenn Sie sich in einer Entwicklungsumgebung wie Microsoft Visual Studio befinden, werden die meisten dieser Ausnahmen automatisch angezeigt. Einige Ausnahmen können jedoch durch Entwicklungsumgebungseinstellungen wie Just My Code Visual Studio maskiert werden.

Unabhängig von den Funktionen Ihrer Entwicklungsumgebung können Sie Funktionen der WCF-Ablaufverfolgung und Nachrichtenprotokollierung verwenden, um alle Ausnahmen zu debuggen und die Leistung Ihrer Anwendungen zu optimieren. Weitere Informationen finden Sie unter Verwenden der Ablaufverfolgung zur Problembehandlung Ihrer Anwendung.

Leistungsprobleme und XmlSerializer

Dienste und Clientanwendungen, die Datentypen verwenden, die mit XmlSerializer serialisierbar sind, generieren und kompilieren den Serialisierungscode für diese Datentypen zur Laufzeit, was zu einer verzögerten Startleistung führen kann.

Hinweis

Vorab generierter Serialisierungscode kann nur in Clientanwendungen und nicht in Diensten verwendet werden.

Das ServiceModel Metadata Utility Tool (Svcutil.exe) kann die Startleistung für diese Anwendungen verbessern, indem der erforderliche Serialisierungscode aus den kompilierten Assemblys für die Anwendung generiert wird. Weitere Informationen finden Sie unter So verbessern Sie die Startzeit von WCF-Clientanwendungen mit dem XmlSerializer.

Leistungsprobleme beim Hosten von WCF-Diensten unter ASP.NET

Wenn ein WCF-Dienst unter IIS und ASP.NET gehostet wird, können sich die Konfigurationseinstellungen von IIS und ASP.NET auf den Durchsatz und den Speicherbedarf des WCF-Diensts auswirken. Weitere Informationen zu ASP.NET Leistung finden Sie unter "Verbessern ASP.NET Leistung". Eine Einstellung, durch die sich unbeabsichtigte Folgen ergeben können, ist MinWorkerThreads. Hierbei handelt es sich um eine Eigenschaft der ProcessModelSection. Wenn Ihre Anwendung über eine feste oder kleine Anzahl von Clients verfügt, kann die Einstellung MinWorkerThreads auf 2 eine Durchsatzverstärkung auf einem Multiprozessorcomputer mit einer CPU-Auslastung von nahezu 100%bereitstellen. Diese Leistungssteigerung hat einen Kostenaufwand: Sie führt auch zu einer Erhöhung der Speicherauslastung, wodurch die Skalierbarkeit reduziert werden kann.

Siehe auch