Kontrollieren des Ressourcenverbrauchs und Verbessern der Leistung
In diesem Thema werden verschiedene Eigenschaften in unterschiedlichen Bereichen der WCF-Architektur (Windows Communication Foundation) beschrieben, die den Ressourcenverbrauch kontrollieren und Einfluss auf die Leistungsmetriken haben.
Eigenschaften, die den Ressourcenverbrauch in WCF einschränken
WCF (Windows Communication Foundation) wendet Einschränkungen auf bestimmte Typen von Prozessen an, entweder zu Sicherheits- oder zu Leistungszwecken. Diese Einschränkungen treten in zwei Hauptformen auf, jeweils als Kontingente und Drosselungen. Kontingente sind Beschränkungen, die an einem Punkt im System eine sofortige Ausnahme verursachen, sobald sie erreicht oder überschritten werden. Drosselungen sind Beschränkungen, die nicht sofort eine Ausnahme auslösen. Stattdessen wird beim Erreichen einer Drosselungsbeschränkung der Prozess fortgesetzt, jedoch innerhalb der durch den Drosselungswert festgelegten Grenzen. Diese eingeschränkte Verarbeitung löst möglicherweise an anderer Stelle eine Ausnahme aus, dies hängt jedoch von der jeweiligen Anwendung ab.
Zusätzlich zu der Unterscheidung zwischen Kontingenten und Drosselungen befinden sich einige einschränkende Eigenschaften auf der Serialisierungsebene, auf der Transportebene und auf der 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, Denial-of-Service-Angriffe gegen einen bestimmten Dienst zu starten und dadurch einen überhöhten Speicherbedarf zu verursachen. (I. d. R. können Sie die Leistung erhöhen, indem Sie diesen Wert herabsetzen.)
Ein Beispiel für ein Serialisierungskontingent ist die DataContractSerializer.MaxItemsInObjectGraph-Eigenschaft, die die maximale Anzahl an Objekten angibt, die das Serialisierungsprogramm in einem einzigen 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 sitzungsbasierten Kanalverbindungen 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 wurden dafür entwickelt, eine übliche Entschärfung gegen bestimmte Arten von Angriffen einzuleiten oder die Leistungsmetriken wie Speicherbeanspruchung, Startzeit usw. zu verbessern. Jedoch können diese Steuerelemente, je nach Anwendung, auch eine Beeinträchtigung der Anwendungsleistung zur Folge haben oder dazu führen, dass die Anwendung gar nicht mehr funktioniert. Zum Beispiel kann eine Anwendung, die für das Videostreaming entworfen wurde, die standardmäßige TransportBindingElement.MaxReceivedMessageSize-Eigenschaft leicht überschreiten. Dieses Thema liefert einen Überblick über die verschiedenen Kontrollen für Anwendungen aller WCF-Ebenen. Außerdem werden verschiedene Methoden beschrieben, mit denen Sie Informationen zu beeinträchtigenden Einstellungen Ihrer Anwendung erhalten, und es wird erklärt, wie unterschiedliche Probleme behoben werden können. Die meisten Drosselungen und einige Kontingente sind auf der Anwendungsebene verfügbar, auch wenn die Basiseigenschaft eine Serialisierungs- oder Transportbeschränkung ist. So können Sie z. B. die DataContractSerializer.MaxItemsInObjectGraph-Eigenschaft mithilfe der ServiceBehaviorAttribute.MaxItemsInObjectGraph-Eigenschaft der Dienstklasse festlegen.
Hinweis
Wenn ein Problem auftritt, sollten Sie zunächst im Schnellstart zur WCF-Problembehandlung nachlesen. Möglicherweise wird das Problem (und die entsprechende Lösung) dort beschrieben.
Eigenschaften, die Serialisierungsprozesse einschränken, sind unter Sicherheitsüberlegungen für Daten aufgeführt. Eigenschaften, die den Verbrauch von Ressourcen im Zusammenhang mit Transporten einschränken, sind unter Transportkontingente aufgelistet. Eigenschaften, die den Verbrauch von Ressourcen auf der Anwendungsschicht einschränken, gehören zur ServiceThrottle-Klasse.
Erkennen von Anwendungs- und Leistungsproblemen in Zusammenhang mit den Kontingenteinstellungen
Die Standardeinstellungen für die vorangehenden Werte wurden ausgewählt, um eine grundlegende Funktionalität für viele verschiedene Anwendungstypen zu ermöglichen und gleichzeitig einen Schutz vor häufig auftretenden Sicherheitsproblemen zu bieten. Jedoch überschreiten die verschiedenen Anwendungs-Designs möglicherweise eine oder mehrere Drosselungseinstellungen, obwohl die Anwendung ansonsten sicher ist und wie gewünscht funktionieren würde. In einem solchen Fall müssen Sie feststellen, welche Drosselungswerte auf welcher Ebene überschritten werden. Legen Sie anschließend angemessene Maßnahmen zur Erhöhung des Anwendungsdurchsatzes fest.
In der Regel wird beim Schreiben und Debuggen der Anwendung die ServiceDebugBehavior.IncludeExceptionDetailInFaults-Eigenschaft in der Konfigurationsdatei oder programmgesteuert auf true
festgelegt. Dadurch wird WCF angewiesen, Dienstausnahme-Stapelüberwachungen zur Anzeige an die Clientanwendung zurückzugeben. Diese Funktion meldet die meisten Ausnahmen auf Anwendungsebene so, dass angezeigt wird, welche Kontingenteinstellungen möglicherweise beteiligt sind, falls das Problem hierdurch verursacht wurde.
Einige Ausnahmen treten während der Laufzeit außerhalb der Sichtbarkeit der Anwendungsschicht auf und werden nicht mithilfe dieses Mechanismus zurückgegeben. Möglicherweise werden sie auch nicht von einer benutzerdefinierten System.ServiceModel.Dispatcher.IErrorHandler-Implementierung gehandhabt. Wenn Sie in einer Entwicklungsumgebung wie Microsoft Visual Studio arbeiten, werden die meisten dieser Ausnahmen automatisch angezeigt. Einige Ausnahmen können jedoch durch Einstellungen der Entwicklungsumgebung maskiert werden, beispielsweise die Einstellung Nur eigenen Code in Visual Studio.
Unabhängig von den Funktionen Ihrer Entwicklungsumgebung können Sie die Funktionen der WCF-Ablaufverfolgung und -Nachrichtenprotokollierung verwenden, um alle Ausnahmen zu debuggen und die Leistung Ihrer Anwendung zu optimieren. Weitere Informationen finden Sie unter Verwenden der Ablaufverfolgung zum Beheben von Anwendungsfehlern.
Leistungsprobleme und XmlSerializer
Dienste und Clientanwendungen, die Datentypen verwenden, die mit dem XmlSerializer serialisiert werden können, generieren und kompilieren für diese Datentypen während der Laufzeit Code, was zu einem verlangsamten Start führen kann.
Hinweis
Vorab generierter Serialisierungscode kann nur in Clientanwendungen und nicht in Diensten verwendet werden.
Mithilfe des ServiceModel Metadata Utility-Tools (Svcutil.exe) lässt sich die Startleistung dieser Anwendungen verbessern, indem der erforderliche Serialisierungscode aus den kompilierten Assemblys für die Anwendung generiert wird. Weitere Informationen finden Sie unter Gewusst wie: Verbessern der Startzeit von WCF-Clientanwendungen mit dem XmlSerializer.
Leistungsprobleme beim Hosten von WCF-Diensten unter ASP.NET
Wird ein WCF-Dienst unter IIS und ASP.NET gehostet, können sich die Konfigurationseinstellungen von IIS und ASP.NET auf den Durchsatz und die Speicherbeanspruchung des WCF-Diensts auswirken. Weitere Informationen zur ASP.NET-Leistung finden Sie unter Verbessern der ASP.NET-Leistung. Eine Einstellung, durch die sich unbeabsichtigte Folgen ergeben können, ist MinWorkerThreads. Hierbei handelt es sich um eine Eigenschaft der ProcessModelSection. Verfügt die Anwendung über eine feste oder über eine geringe Anzahl von Clients, lässt sich durch Festlegen von MinWorkerThreads auf "2" bei einem Computer mit mehreren Prozessoren, dessen CPU-Auslastung sich nahe bei 100 Prozent bewegt, möglicherweise ein Leistungsschub beim Durchsatz erzielen. Dieser Leistungszuwachs bringt jedoch auch einen Nachteil mit sich, da sich dadurch auch eine erhöhte Speicherauslastung ergibt, was zu einer geringeren Skalierbarkeit führt.