Contatori delle prestazioni di WCF

Windows Communication Foundation (WCF) include un ampio set di contatori delle prestazioni che consentono di misurare le prestazioni dell'applicazione.

Attivazione dei contatori delle prestazioni

È possibile abilitare i contatori delle prestazioni per un servizio WCF tramite il file di configurazione app.config del servizio WCF come indicato di seguito:

<configuration>  
    <system.serviceModel>  
        <diagnostics performanceCounters="All" />  
    </system.serviceModel>  
</configuration>  

L'attributo performanceCounters può essere impostato per attivare un tipo specifico di contatori delle prestazioni. I valori validi sono:

  • All: vengono attivati tutti i contatori della categoria (ServiceModelService, ServiceModelEndpoint e ServiceModelOperation).

  • ServiceOnly: vengono attivati soltanto i contatori della categoria ServiceModelService. Questo è il valore predefinito.

  • Off: vengono disattivati i contatori delle prestazioni della categoria ServiceModel*.

Se si desidera abilitare i contatori delle prestazioni per tutte le applicazioni WCF, è possibile inserire le impostazioni di configurazione nel file Machine.config. Per altre informazioni sulla configurazione di memoria sufficiente per i contatori delle prestazioni nel computer, vedere la sezione Aumento delle dimensioni della memoria per i contatori delle prestazioni.

Se si usano punti di estendibilità WCF, ad esempio i richiami delle operazioni personalizzate, è necessario generare contatori delle prestazioni personalizzati. Ciò avviene perché se si implementa un punto di estendibilità, WCF potrebbe non generare più i dati del contatore delle prestazioni standard nel percorso predefinito. Se non si implementa il supporto manuale dei contatori delle prestazioni, è possibile che i dati previsti di questi ultimi non vengano visualizzati.

È inoltre possibile abilitare contatori delle prestazioni nel codice nel modo seguente:

using System.Configuration;  
using System.ServiceModel.Configuration;  
using System.ServiceModel.Diagnostics;  
Configuration config = ConfigurationManager.OpenExeConfiguration(  
    ConfigurationUserLevel.None);  
ServiceModelSectionGroup sg = ServiceModelSectionGroup.GetSectionGroup(config);  
sg.Diagnostic.PerformanceCounters = PerformanceCounterScope.All;  
config.Save();  

Visualizzazione dei dati sulle prestazioni

Per visualizzare i dati acquisiti dai contatori delle prestazioni è possibile usare lo strumento Performance Monitor (Perfmon.exe) di Windows. È possibile avviare questo strumento passando a Start, quindi fare clic su Esegui e digitare perfmon.exe nella finestra di dialogo.

Nota

Le istanze del contatore delle prestazioni possono essere rilasciate prima che gli ultimi messaggi siano stati elaborati dal Dispatcher dell'endpoint. In questo caso è possibile che i dati relativi alle prestazioni non vengano acquisiti per alcuni messaggi.

Aumento della dimensione della memoria per i contatori delle prestazioni

WCF usa memoria condivisa separata per le relative categorie di contatori delle prestazioni.

Per impostazione predefinita, la memoria condivisa separata è impostata su un quarto della dimensione della memoria globale dei contatori delle prestazioni. La dimensione della memoria globale predefinita dei contatori delle prestazioni è di 524.288 byte. Di conseguenza, le tre categorie di contatori delle prestazioni WCF hanno una dimensione predefinita di circa 128 KB ciascuno. A seconda delle caratteristiche di runtime delle applicazioni WCF in un computer, la memoria del contatore delle prestazioni potrebbe essere esaurita. In questo caso, WCF scrive un errore nel registro eventi dell'applicazione. Il contenuto dell'errore indica che un contatore delle prestazioni non è stato caricato e la voce contiene l'eccezione "System.InvalidOperationException: la visualizzazione file dei contatori personalizzati non è in memoria". Se la traccia è abilitata a livello di errore, viene tracciato anche questo errore. Se la memoria del contatore delle prestazioni è esaurita, continuare a eseguire le applicazioni WCF con contatori delle prestazioni abilitati potrebbe comportare una riduzione delle prestazioni. In questo caso l'amministratore del computer dovrà configurare il computer per l'allocazione di memoria sufficiente a supportare il numero massimo di contatori delle prestazioni che possono essere presenti in qualsiasi momento.

È possibile modificare la quantità di memoria del contatore delle prestazioni per le categorie WCF nel Registro di sistema. A tale scopo, è necessario aggiungere un nuovo valore DWORD denominato FileMappingSize ai tre percorsi specificati di seguito e impostarlo sul valore desiderato espresso in byte. Riavviare il computer per rendere effettive le modifiche.

  • HKLM\System\CurrentControlSet\Services\ServiceModelEndpoint 4.0.0.0\Performance

  • HKLM\System\CurrentControlSet\Services\ServiceModelOperation 4.0.0.0\Performance

  • HKLM\System\CurrentControlSet\Services\ServiceModelService 4.0.0.0\Performance

Quando numerosi oggetti (ad esempio, ServiceHost) vengono eliminati ma rimangono in attesa di essere sottoposti all'operazione di Garbage Collection, il contatore delle prestazioni PrivateBytes registra un valore insolitamente elevato. Per risolvere questo problema è possibile aggiungere contatori specifici dell'applicazione o usare l'attributo performanceCounters per attivare soltanto i contatori a livello di servizio.

Tipi di contatori delle prestazioni

I contatori delle prestazioni vengono applicati a tre livelli differenti: servizio, endpoint e operazione.

Per recuperare il nome di un'istanza di contatore delle prestazioni è possibile usare WMI. ad esempio:

  • Il nome dell'istanza del contatore del servizio può essere ottenuto tramite la proprietà "CounterInstanceName" dell'istanza del servizio WMI.

  • Il nome dell'istanza del contatore degli endpoint può essere ottenuto tramite la proprietà "CounterInstanceName" dell'istanza dell'endpoint WMI.

  • Il nome dell'istanza del contatore delle operazioni può essere ottenuto tramite il metodo "GetOperationCounterInstanceName" dell'istanza dell'endpoint WMI.

Per altre informazioni su WMI, vedere Uso di Strumentazione gestione Windows per la diagnostica.

Contatori delle prestazioni a livello di servizio

I contatori delle prestazioni del servizio misurano il comportamento del servizio nel suo insieme e possono essere usati per diagnosticare le prestazioni dell'intero servizio. Sono reperibili nell'oggetto prestazione ServiceModelService 4.0.0.0 in caso di visualizzazione con Performance Monitor. Le istanze vengono denominate usando il modello seguente:

ServiceName@ServiceBaseAddress

Un contatore nell'ambito di un servizio viene aggregato dal contatore in una raccolta di endpoint.

I contatori delle prestazioni per la creazione dell'istanza di servizio vengono incrementati alla creazione di un nuovo contesto InstanceContext. Si noti che un nuovo contesto InstanceContext viene creato anche quando si riceve un messaggio di non attivazione (con un servizio esistente) o quando vi è una connessione a un'istanza da una determinata sessione, si termina la sessione e ci si riconnette da un'altra sessione.

Contatori delle prestazioni a livello di endpoint

I contatori delle prestazioni a livello di endpoint consentono di analizzare i dati che riflettono la modalità di accettazione dei messaggi da parte di un endpoint. Sono reperibili nell'oggetto prestazione ServiceModelEndpoint 4.0.0.0 in caso di visualizzazione con Performance Monitor. Le istanze vengono denominate usando il modello seguente:

(ServiceName).(ContractName)@(endpoint listener address)

I dati sono simili a quelli raccolti per le singole operazioni, ma vengono aggregati soltanto nell'endpoint.

Un contatore nell'ambito di un endpoint viene aggregato dai contatori in una raccolta di operazioni.

Nota

Se due endpoint hanno nomi e indirizzi di contratto identici, vengono mappati alla stessa istanza di contatore.

Contatori delle prestazioni a livello di operazione

I contatori delle prestazioni a livello di operazione sono reperibili nell'oggetto prestazione ServiceModelOperation 4.0.0.0 in caso di visualizzazione con Performance Monitor. Ogni operazione ha un'istanza singola. Ovvero, se un determinato contratto ha 10 operazioni, ad esso sono associate 10 istanze di contatore per l'operazione. Le istanze di oggetti vengono denominate usando il modello seguente:

(ServiceName).(ContractName).(OperationName)@(first endpoint listener address)

Questo contatore consente di misurare come viene usata la chiamata e le prestazioni dell'operazione.

Quando i contatori sono visibili su più ambiti, i dati raccolti da un ambito di livello superiore vengono aggregati ai dati relativi ad ambiti di livello inferiore. Ad esempio, il contatore Calls in un endpoint rappresenta la somma di tutte le chiamate a operazioni all'interno dell'endpoint; mentre il contatore Calls in un servizio rappresenta la somma di tutte le chiamate a tutti gli endpoint all'interno del servizio.

Nota

Se in un contratto sono presenti nomi di operazione duplicati, per entrambe le operazioni è possibile ottenere soltanto le istanze di un solo contatore.

Programmazione dei contatori delle prestazioni di WCF

Diversi file vengono installati nella cartella di installazione dell'SDK in modo che sia possibile accedere ai contatori delle prestazioni WCF a livello di codice. Questi file sono elencati di seguito:

  • _ServiceModelEndpointPerfCounters.vrg
  • _ServiceModelOperationPerfCounters.vrg
  • _ServiceModelServicePerfCounters.vrg
  • _SMSvcHostPerfCounters.vrg
  • _TransactionBridgePerfCounters.vrg

Per altre informazioni su come accedere ai contatori a livello di codice, vedere Architettura di programmazione dei contatori delle prestazioni.

Vedi anche