Condividi tramite


Controllo dell'utilizzo delle risorse e miglioramento delle prestazioni

In questo argomento vengono descritte varie proprietà in diverse aree dell'architettura di Windows Communication Foundation (WCF) che funzionano per controllare l'utilizzo delle risorse e influire sulle metriche delle prestazioni.

Proprietà che vincolano il consumo di risorse in WCF

Windows Communication Foundation (WCF) applica vincoli per determinati tipi di processi a scopo di sicurezza o prestazioni. Questi vincoli si presentano in due forme principali, ossia quote di utilizzo oppure restrizioni di velocità. Le quote sono limiti che, quando raggiunto o superato, attivano un'eccezione immediata in un determinato punto del sistema. Le limitazioni sono limiti che non causano immediatamente la generazione di un'eccezione. Invece, quando si raggiunge un limite di controllo, l'elaborazione continua ma entro i limiti impostati da quel valore di controllo. Questa elaborazione limitata potrebbe attivare un'eccezione altrove, ma dipende dall'applicazione.

Oltre alla distinzione tra quote e limitazioni, alcune proprietà vincolanti si trovano a livello di serializzazione, altre a livello di trasporto e altre a livello di applicazione. Ad esempio, la quota TransportBindingElement.MaxReceivedMessageSize, implementata da tutti gli elementi di associazione di trasporto forniti dal sistema, è impostata su 65.536 byte per impostazione predefinita per impedire ai client malintenzionati di impegnarsi in attacchi Denial of Service contro un servizio causando un consumo eccessivo di memoria. In genere, è possibile aumentare le prestazioni riducendo questo valore.

Un esempio di quota di serializzazione è la DataContractSerializer.MaxItemsInObjectGraph proprietà , che specifica il numero massimo di oggetti serializzati o deserializzati dal serializzatore in una singola ReadObject chiamata al metodo. Un esempio di limitazione a livello di applicazione è la proprietà ServiceThrottle.MaxConcurrentSessions, che per impostazione predefinita limita il numero di connessioni simultanee del canale con sessione a 10. A differenza delle quote, se viene raggiunto questo valore di limitazione, l'applicazione continua l'elaborazione ma non accetta nuovi canali con sessione, il che significa che i nuovi client non possono connettersi fino a quando non viene terminato uno degli altri canali con sessione.

Questi controlli sono progettati per fornire una mitigazione pronta all'uso contro determinati tipi di attacchi o per migliorare le metriche delle prestazioni, come l'impronta di memoria, il tempo di avvio e così via. Tuttavia, a seconda dell'applicazione, questi controlli possono impedire le prestazioni dell'applicazione di servizio o impedire che l'applicazione funzioni affatto. Ad esempio, un'applicazione progettata per lo streaming video può facilmente superare la proprietà predefinita TransportBindingElement.MaxReceivedMessageSize . In questo argomento viene fornita una panoramica dei vari controlli applicati alle applicazioni a tutti i livelli di WCF, vengono descritti diversi modi per ottenere altre informazioni sull'eventuale ostacolo di un'impostazione dell'applicazione e vengono descritti i modi per risolvere vari problemi. La maggior parte delle limitazioni e alcune quote sono disponibili a livello di applicazione, anche quando la proprietà di base è un vincolo di serializzazione o trasporto. Ad esempio, è possibile impostare la DataContractSerializer.MaxItemsInObjectGraph proprietà usando la ServiceBehaviorAttribute.MaxItemsInObjectGraph proprietà nella classe del servizio.

Annotazioni

Se si verifica un problema specifico, leggere prima di tutto la guida introduttiva alla risoluzione dei problemi WCF per verificare se il problema (e una soluzione) è elencato.

Le proprietà che limitano i processi di serializzazione sono elencate in Considerazioni sulla sicurezza per i dati. Le proprietà che limitano il consumo di risorse correlate ai trasporti sono elencate in Quote di trasporto. Le proprietà che limitano il consumo di risorse a livello di applicazione sono i membri della ServiceThrottle classe .

Le impostazioni predefinite dei valori precedenti sono state scelte per abilitare la funzionalità di base dell'applicazione in un'ampia gamma di tipi di applicazioni, fornendo al tempo stesso protezione di base contro i problemi di sicurezza comuni. Tuttavia, diverse progettazioni di applicazioni potrebbero superare uno o più limiti di restrizione anche se l'applicazione è comunque sicura e funzionerebbe come previsto. In questi casi, è necessario identificare quali valori di limitazione vengono superati e a quale livello e decidere il corso di azione appropriato per aumentare la velocità effettiva dell'applicazione.

In genere, mentre si scrive l'applicazione e si esegue il debug, si imposta la proprietà ServiceDebugBehavior.IncludeExceptionDetailInFaults su true nel file di configurazione o tramite codice. Questa impostazione istruisce WCF a restituire le tracce dello stack delle eccezioni del servizio all'applicazione client per essere visualizzate. Questa funzionalità segnala la maggior parte delle eccezioni a livello di applicazione in modo da visualizzare quali impostazioni di quota potrebbero essere coinvolte, se questo è il problema.

Alcune eccezioni si verificano in fase di esecuzione sotto la visibilità del livello dell'applicazione e non vengono restituite usando questo meccanismo e potrebbero non essere gestite da un'implementazione personalizzata System.ServiceModel.Dispatcher.IErrorHandler . Se ci si trova in un ambiente di sviluppo come Microsoft Visual Studio, la maggior parte di queste eccezioni viene visualizzata automaticamente. Tuttavia, alcune eccezioni possono essere mascherate dalle impostazioni dell'ambiente di sviluppo, ad esempio Just My Code Visual Studio.

Indipendentemente dalle funzionalità dell'ambiente di sviluppo, è possibile usare le funzionalità di traccia e registrazione dei messaggi WCF per eseguire il debug di tutte le eccezioni e ottimizzare le prestazioni delle applicazioni. Per ulteriori informazioni, vedere Utilizzo del tracciamento per risolvere i problemi dell'applicazione.

Problemi di prestazioni e XmlSerializer

Servizi e applicazioni client che utilizzano tipi di dati serializzabili tramite il XmlSerializer generano e compilano codice di serializzazione per tali tipi di dati al runtime, il che può provocare un rallentamento delle prestazioni di avvio.

Annotazioni

Il codice di serializzazione pregenerato può essere usato solo nelle applicazioni client e non nei servizi.

Lo strumento Utilità metadati ServiceModel (Svcutil.exe) può migliorare le prestazioni di avvio per queste applicazioni generando il codice di serializzazione necessario dagli assembly compilati per l'applicazione. Per altre informazioni, vedere Procedura: Migliorare il tempo di avvio delle applicazioni client WCF tramite XmlSerializer.

Problemi di prestazioni durante l'hosting di servizi WCF in ASP.NET

Quando un servizio WCF è ospitato in IIS e ASP.NET, le impostazioni di configurazione di IIS e ASP.NET possono influire sulla velocità effettiva e sul footprint di memoria del servizio WCF. Per altre informazioni sulle prestazioni ASP.NET, vedere Miglioramento delle prestazioni ASP.NET. Un'impostazione che potrebbe avere conseguenze impreviste è MinWorkerThreads, ovvero una proprietà dell'oggetto ProcessModelSection. Se l'applicazione ha un numero fisso o ridotto di client, l'impostazione MinWorkerThreads su 2 potrebbe offrire un aumento della velocità effettiva in un computer multiprocessore con un utilizzo della CPU vicino a 100%. Questo aumento delle prestazioni comporta un costo: comporta anche un aumento dell'utilizzo della memoria, che potrebbe ridurre la scalabilità.

Vedere anche