Contadores de desempenho do WCF
O WCF (Windows Communication Foundation) inclui um grande conjunto de contadores de desempenho para ajudar você a avaliar o desempenho do aplicativo.
Como habilitar os contadores de desempenho
Habilite os contadores de desempenho para um serviço WCF por meio do arquivo de configuração app.config do serviço WCF da seguinte maneira:
<configuration>
<system.serviceModel>
<diagnostics performanceCounters="All" />
</system.serviceModel>
</configuration>
O atributo performanceCounters
pode ser definido para habilitar um tipo específico de contadores de desempenho. Os valores válidos são
Todos: todos os contadores da categoria (ServiceModelService, ServiceModelEndpoint e ServiceModelOperation) são habilitados.
ServiceOnly: somente os contadores da categoria ServiceModelService são habilitados. Esse é o valor padrão.
Desativado: os contadores de desempenho ServiceModel* são desabilitados.
Caso deseje habilitar os contadores de desempenho para todos os aplicativos WCF, coloque as configurações no arquivo Machine.config. Confira a seção Como aumentar o tamanho da memória para contadores de desempenho abaixo para obter mais informações sobre como configurar memória suficiente para os contadores de desempenho no computador.
Se você usar pontos de extensibilidade do WCF, como invocadores de operação personalizados, também deverá emitir contadores de desempenho próprios. Isso ocorre porque, se você implementar um ponto de extensibilidade, o WCF poderá deixar de emitir os dados do contador de desempenho padrão no caminho padrão. Caso você não implemente o suporte ao contador de desempenho manual, talvez não veja os dados do contador de desempenho esperados.
Você também pode habilitar contadores de desempenho no código desta maneira.
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();
Exibindo dados de desempenho
Para ver os dados capturados pelos contadores de desempenho, use o Monitor de Desempenho (Perfmon.exe) incluído no Windows. Inicie essa ferramenta acessando Iniciar, clique em Executar e digite perfmon.exe
na caixa de diálogo.
Observação
As instâncias do contador de desempenho podem ser liberadas antes que as últimas mensagens tenham sido processadas pelo dispatcher do ponto de extremidade. Isso pode fazer com que a captura de dados de desempenho de algumas mensagens não ocorra.
Como aumentar o tamanho da memória para contadores de desempenho
O WCF usa uma memória compartilhada separada para as categorias de contadores de desempenho.
Por padrão, a memória compartilhada separada é definida como um quarto do tamanho da memória do contador de desempenho global. A memória do contador de desempenho global padrão é de 524.288 bytes. Portanto, as três categorias de contadores de desempenho do WCF têm um tamanho padrão de aproximadamente 128 KB cada. Dependendo das características de runtime dos aplicativos WCF em um computador, a memória do contador de desempenho pode estar esgotada. Quando isso acontece, o WCF grava um erro no log de eventos do aplicativo. O conteúdo do erro indica que um contador de desempenho não foi carregado, e a entrada contém a exceção "System.InvalidOperationException: a exibição de arquivo dos contadores personalizados está sem memória suficiente". Se o rastreamento estiver habilitado no nível de erro, essa falha também será rastreada. Se a memória do contador de desempenho estiver esgotada, continuar executando os aplicativos WCF com os contadores de desempenho habilitados poderá resultar na degradação do desempenho. Se você é administrador do computador, configure-o para alocar memória suficiente a fim de dar suporte ao número máximo de contadores de desempenho que podem existir a qualquer momento.
Você pode alterar a quantidade de memória do contador de desempenho para categorias do WCF no Registro. Para fazer isso, adicione um novo valor DWORD chamado FileMappingSize
para os três locais a seguir e defina-o como o valor desejado em bytes. Reinicialize o computador para que essas alterações entrem em vigor.
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 um grande número de objetos (por exemplo, ServiceHost) for descartado, mas estiver aguardando a coleta de lixo, o contador de desempenho PrivateBytes
registrará um número extraordinariamente alto. Para resolver esse problema, adicione contadores próprios específicos do aplicativo ou use o atributo performanceCounters
para habilitar somente contadores de nível de serviço.
Tipos de contadores de desempenho
Os contadores de desempenho têm escopo para três níveis diferentes: Serviço, Ponto de Extremidade e Operação.
Você pode usar o WMI para recuperar o nome de uma instância de contador de desempenho. Por exemplo,
O nome da instância do contador de serviço pode ser obtido por meio da propriedade "CounterInstanceName" da instância Serviço do WMI.
O nome da instância do contador de ponto de extremidade pode ser obtido por meio da propriedade "CounterInstanceName" da instância Ponto de Extremidade do WMI.
O nome da instância do contador de operação pode ser obtido por meio do método "GetOperationCounterInstanceName" da instância Ponto de Extremidade do WMI.
Para obter mais informações sobre o WMI, confira Como usar a Instrumentação de Gerenciamento do Windows para diagnóstico.
Contadores de desempenho de serviço
Os contadores de desempenho de serviço medem o comportamento do serviço como um todo e podem ser usados para diagnosticar o desempenho de todo o serviço. Eles podem ser encontrados no objeto de desempenho ServiceModelService 4.0.0.0
quando vistos com o Monitor de Desempenho. As instâncias são nomeadas com o seguinte padrão:
ServiceName@ServiceBaseAddress
Um contador em um escopo de serviço é agregado do contador em uma coleção de pontos de extremidade.
Os contadores de desempenho para a criação da instância de serviço são incrementados quando um InstanceContext é criado. Observe que um InstanceContext é criado mesmo quando você recebe uma mensagem sem ativação (com um serviço existente) ou quando você se conecta a uma instância de uma sessão, encerra a sessão e se reconecta em outra sessão.
Contadores de desempenho de ponto de extremidade
Os contadores de desempenho do ponto de extremidade permitem que você analise os dados que refletem como um ponto de extremidade está aceitando as mensagens. Eles podem ser encontrados no objeto de desempenho ServiceModelEndpoint 4.0.0.0
quando vistos com o Monitor de Desempenho. As instâncias são nomeadas com o seguinte padrão:
(ServiceName).(ContractName)@(endpoint listener address)
Os dados são semelhantes ao que é coletado para operações individuais, mas só são agregados no ponto de extremidade.
Um contador em um escopo de ponto de extremidade é agregado de contadores em uma coleção de operações.
Observação
Se dois pontos de extremidade tiverem nomes e endereços de contrato idênticos, eles serão mapeados para a mesma instância de contador.
Contadores de desempenho de operação
Os contadores de desempenho de operação são encontrados no objeto de desempenho ServiceModelOperation 4.0.0.0
quando vistos com o Monitor de Desempenho. Cada operação tem uma instância individual. Ou seja, se determinado contrato tiver dez operações, dez instâncias do contador de operação serão associadas a esse contrato. As instâncias de objeto são nomeadas usando o seguinte padrão:
(ServiceName).(ContractName).(OperationName)@(first endpoint listener address)
Esse contador permite medir como a chamada está sendo usada e como está o desempenho da operação.
Quando os contadores são visíveis em vários escopos, os dados coletados de um escopo mais alto são agregados com os dados de escopos inferiores. Por exemplo, Calls
em um ponto de extremidade representa a soma de todas as chamadas de operação no ponto de extremidade. Calls
em um serviço representa a soma de todas as chamadas aos todos os pontos de extremidade no serviço.
Observação
Se você tiver nomes de operação duplicados em um contrato, obterá apenas uma instância de contador para ambas as operações.
Programação dos contadores de desempenho do WCF
Vários arquivos são instalados na pasta de instalação do SDK para que você possa acessar os contadores de desempenho do WCF por meio de programação. Esses arquivos são listados da seguinte maneira:
- _ServiceModelEndpointPerfCounters.vrg
- _ServiceModelOperationPerfCounters.vrg
- _ServiceModelServicePerfCounters.vrg
- _SMSvcHostPerfCounters.vrg
- _TransactionBridgePerfCounters.vrg
Para obter mais informações sobre como acessar os contadores por meio de programação, confira Arquitetura de programação dos contadores de desempenho.