Resourceverbruik beheren en prestaties verbeteren
In dit onderwerp worden verschillende eigenschappen in verschillende gebieden van de WCF-architectuur (Windows Communication Foundation) beschreven die werken om het resourceverbruik te beheren en invloed te hebben op metrische prestatiegegevens.
Eigenschappen die het resourceverbruik beperken in WCF
Windows Communication Foundation (WCF) past beperkingen toe voor bepaalde soorten processen voor beveiligings- of prestatiedoeleinden. Deze beperkingen hebben twee hoofdvormen: quota en beperkingen. Quota zijn limieten die op een bepaald moment in het systeem een onmiddellijke uitzondering veroorzaken wanneer ze worden bereikt of overschreden. Beperkingen zijn limieten die niet onmiddellijk ertoe leiden dat er een uitzondering wordt gegenereerd. Wanneer een beperkingslimiet is bereikt, wordt de verwerking voortgezet, maar binnen de limieten die zijn ingesteld door die vertragingswaarde. Deze beperkte verwerking kan elders een uitzondering activeren, maar dit is afhankelijk van de toepassing.
Naast het onderscheid tussen quota en beperkingen bevinden sommige beperkingseigenschappen zich op het serialisatieniveau, sommige op transportniveau en sommige op toepassingsniveau. Het quotum TransportBindingElement.MaxReceivedMessageSize, dat wordt geïmplementeerd door alle door het systeem geleverde transportbindingselementen, is bijvoorbeeld standaard ingesteld op 65.536 bytes om kwaadwillende clients te belemmeren bij denial-of-service-aanvallen tegen een service door overmatig geheugenverbruik te veroorzaken. (Normaal gesproken kunt u de prestaties verhogen door deze waarde te verlagen.)
Een voorbeeld van een serialisatiequotum is de DataContractSerializer.MaxItemsInObjectGraph eigenschap, waarmee het maximum aantal objecten wordt opgegeven dat de serialisatiefunctie serialiseert of deserializeert in één ReadObject methodeaanroep. Een voorbeeld van een vertraging op toepassingsniveau is de ServiceThrottle.MaxConcurrentSessions eigenschap, die standaard het aantal gelijktijdige sessieful kanaalverbindingen beperkt tot 10. (In tegenstelling tot de quota, als deze vertragingswaarde is bereikt, blijft de toepassing verwerken, maar accepteert geen nieuwe sessieful kanalen, wat betekent dat nieuwe clients geen verbinding kunnen maken totdat een van de andere sessieful kanalen is beëindigd.)
Deze besturingselementen zijn ontworpen om een kant-en-klare beperking te bieden tegen bepaalde soorten aanvallen of om prestatiegegevens zoals geheugenvoetafdruk, opstarttijd enzovoort te verbeteren. Afhankelijk van de toepassing kunnen deze besturingselementen de prestaties van de servicetoepassing belemmeren of voorkomen dat de toepassing helemaal werkt. Een toepassing die is ontworpen om video te streamen, kan bijvoorbeeld eenvoudig de standaardeigenschap TransportBindingElement.MaxReceivedMessageSize overschrijden. In dit onderwerp vindt u een overzicht van de verschillende besturingselementen die worden toegepast op toepassingen op alle niveaus van WCF, worden verschillende manieren beschreven om meer informatie te verkrijgen over de vraag of een instelling uw toepassing belemmert en beschrijft manieren om verschillende problemen op te lossen. De meeste beperkingen en sommige quota zijn beschikbaar op toepassingsniveau, zelfs wanneer de basiseigenschap een serialisatie- of transportbeperking is. U kunt de DataContractSerializer.MaxItemsInObjectGraph eigenschap bijvoorbeeld instellen met behulp van de ServiceBehaviorAttribute.MaxItemsInObjectGraph eigenschap in de serviceklasse.
Notitie
Als u een bepaald probleem hebt, moet u eerst de snelstartgids voor probleemoplossing van WCF lezen om te zien of uw probleem (en een oplossing) daar wordt vermeld.
Eigenschappen die serialisatieprocessen beperken, worden vermeld in Beveiligingsoverwegingen voor gegevens. Eigenschappen die het verbruik van resources met betrekking tot transporten beperken, worden vermeld in transportquota. Eigenschappen die het verbruik van resources op de toepassingslaag beperken, zijn de leden van de ServiceThrottle klasse.
Toepassings- en prestatieproblemen met betrekking tot quotum-Instellingen detecteren
De standaardwaarden van de voorgaande waarden zijn gekozen om basistoepassingsfunctionaliteit in te schakelen voor een breed scala aan toepassingstypen en tegelijkertijd basisbeveiliging te bieden tegen veelvoorkomende beveiligingsproblemen. Verschillende toepassingsontwerpen kunnen echter een of meer instellingen voor beperkingen overschrijden, hoewel de toepassing anders veilig is en werkt zoals ontworpen. In deze gevallen moet u bepalen welke vertragingswaarden worden overschreden en op welk niveau, en beslissen over de juiste manier van actie om de doorvoer van toepassingen te verhogen.
Normaal gesproken stelt ServiceDebugBehavior.IncludeExceptionDetailInFaults u de eigenschap true
in het configuratiebestand of programmatisch in bij het schrijven van de toepassing en foutopsporing. Hiermee wordt WCF geïnstrueerd om traceringen van serviceuitzonderingsstacks te retourneren naar de clienttoepassing voor weergave. Deze functie rapporteert de meeste uitzonderingen op toepassingsniveau op een manier om weer te geven welke quota-instellingen kunnen worden gebruikt, als dat het probleem is.
Sommige uitzonderingen gebeuren tijdens runtime onder de zichtbaarheid van de toepassingslaag en worden niet geretourneerd met behulp van dit mechanisme en worden mogelijk niet verwerkt door een aangepaste System.ServiceModel.Dispatcher.IErrorHandler implementatie. Als u zich in een ontwikkelomgeving bevindt zoals Microsoft Visual Studio, worden de meeste van deze uitzonderingen automatisch weergegeven. Sommige uitzonderingen kunnen echter worden gemaskeerd door instellingen voor de ontwikkelomgeving, zoals Just My Code Visual Studio.
Ongeacht de mogelijkheden van uw ontwikkelomgeving, kunt u mogelijkheden van WCF-tracering en berichtlogboekregistratie gebruiken om fouten in alle uitzonderingen op te sporen en de prestaties van uw toepassingen af te stemmen. Zie Tracering gebruiken om problemen met uw toepassing op te lossen voor meer informatie.
Prestatieproblemen en XmlSerializer
Services en clienttoepassingen die gebruikmaken van gegevenstypen die serialiseren met behulp van de XmlSerializer serialisatiecode genereren en compileren voor deze gegevenstypen tijdens runtime, wat kan leiden tot trage opstartprestaties.
Notitie
Vooraf gegenereerde serialisatiecode kan alleen worden gebruikt in clienttoepassingen en niet in services.
Het hulpprogramma hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe) kan de opstartprestaties voor deze toepassingen verbeteren door de benodigde serialisatiecode te genereren van de gecompileerde assembly's voor de toepassing. Zie Procedures voor meer informatie: De opstarttijd van WCF-clienttoepassingen verbeteren met behulp van de XmlSerializer.
Prestatieproblemen bij het hosten van WCF-services onder ASP.NET
Wanneer een WCF-service wordt gehost onder IIS en ASP.NET, kunnen de configuratie-instellingen van IIS en ASP.NET van invloed zijn op de doorvoer en geheugenvoetafdruk van de WCF-service. Zie ASP.NET prestaties verbeteren voor meer informatie over ASP.NET prestaties. Een instelling die onbedoelde gevolgen kan hebben, is MinWorkerThreads, een eigenschap van de ProcessModelSection. Als uw toepassing een vast of klein aantal clients heeft, kan de instelling MinWorkerThreads op 2 een doorvoerboost bieden op een multiprocessorcomputer met een CPU-gebruik dicht bij 100%. Deze toename van de prestaties wordt gepaard met kosten: dit leidt ook tot een toename van het geheugengebruik, wat de schaalbaarheid kan verminderen.