Controlando o consumo de recursos e melhorando o desempenho

Este tópico descreve várias propriedades em diferentes áreas da arquitetura do Windows Communication Foundation (WCF) que funcionam para controlar o consumo de recursos e afetar as métricas de desempenho.

Propriedades que restringem o consumo de recursos no WCF

O Windows Communication Foundation (WCF) aplica restrições em determinados tipos de processos para fins de segurança ou desempenho. Estes constrangimentos apresentam-se de duas formas principais: quotas e limitações. As quotas são limites que, quando atingidos ou ultrapassados, desencadeiam uma exceção imediata em algum momento do sistema. Os aceleradores são limites que não fazem com que uma exceção seja lançada imediatamente. Em vez disso, quando um limite de aceleração é atingido, o processamento continua, mas dentro dos limites definidos por esse valor de acelerador. Esse processamento limitado pode desencadear uma exceção em outro lugar, mas isso depende do aplicativo.

Além da distinção entre cotas e aceleradores, algumas propriedades restritivas estão localizadas no nível de serialização, algumas no nível de transporte e outras no nível de aplicativo. Por exemplo, a cota TransportBindingElement.MaxReceivedMessageSize, que é implementada por todos os elementos de vinculação de transporte fornecidos pelo sistema, é definida como 65.536 bytes por padrão para impedir que clientes mal-intencionados se envolvam em ataques de negação de serviço contra um serviço, causando consumo excessivo de memória. (Normalmente, você pode aumentar o desempenho reduzindo esse valor.)

Um exemplo de uma cota de serialização é a DataContractSerializer.MaxItemsInObjectGraph propriedade, que especifica o número máximo de objetos que o serializador serializa ou desserializa em uma única ReadObject chamada de método. Um exemplo de um acelerador no nível do aplicativo é a ServiceThrottle.MaxConcurrentSessions propriedade, que, por padrão, restringe o número de conexões simultâneas de canal de sessão a 10. (Ao contrário das cotas, se esse valor de aceleração for atingido, o aplicativo continuará processando, mas não aceitará novos canais de sessão, o que significa que novos clientes não poderão se conectar até que um dos outros canais de sessão seja encerrado.)

Esses controles são projetados para fornecer uma mitigação pronta para uso contra certos tipos de ataques ou para melhorar as métricas de desempenho, como espaço ocupado pela memória, tempo de inicialização e assim por diante. No entanto, dependendo do aplicativo, esses controles podem impedir o desempenho do aplicativo de serviço ou impedir que o aplicativo funcione. Por exemplo, um aplicativo projetado para transmitir vídeo pode facilmente exceder a propriedade padrão TransportBindingElement.MaxReceivedMessageSize . Este tópico fornece uma visão geral dos vários controles aplicados a aplicativos em todos os níveis do WCF, descreve várias maneiras de obter mais informações sobre se uma configuração está prejudicando seu aplicativo e descreve maneiras de corrigir vários problemas. A maioria dos aceleradores e algumas cotas estão disponíveis no nível do aplicativo, mesmo quando a propriedade base é uma restrição de serialização ou transporte. Por exemplo, você pode definir a DataContractSerializer.MaxItemsInObjectGraph propriedade usando a ServiceBehaviorAttribute.MaxItemsInObjectGraph propriedade na classe de serviço.

Nota

Se você tiver um problema específico, você deve primeiro ler o Guia de início rápido de solução de problemas do WCF para ver se o problema (e uma solução) está listado lá.

As propriedades que restringem os processos de serialização estão listadas em Considerações de segurança para dados. As propriedades que restringem o consumo de recursos relacionados aos transportes estão listadas em Cotas de Transporte. As propriedades que restringem o consumo de recursos na camada de aplicativo são os ServiceThrottle membros da classe.

Os padrões dos valores anteriores foram escolhidos para habilitar a funcionalidade básica do aplicativo em uma ampla variedade de tipos de aplicativos e, ao mesmo tempo, fornecer proteção básica contra problemas comuns de segurança. No entanto, diferentes designs de aplicativos podem exceder uma ou mais configurações de aceleração, embora o aplicativo seja seguro e funcione como projetado. Nesses casos, você deve identificar quais valores de aceleração estão sendo excedidos e em que nível, e decidir sobre o curso de ação apropriado para aumentar a taxa de transferência do aplicativo.

Normalmente, ao escrever o aplicativo e depurá-lo, você define a ServiceDebugBehavior.IncludeExceptionDetailInFaults propriedade como true no arquivo de configuração ou programaticamente. Isso instrui o WCF a retornar rastreamentos de pilha de exceção de serviço para o aplicativo cliente para exibição. Esse recurso relata a maioria das exceções no nível do aplicativo de forma a exibir quais configurações de cota podem estar envolvidas, se esse for o problema.

Algumas exceções acontecem em tempo de execução abaixo da visibilidade da camada de aplicativo e não são retornadas usando esse mecanismo, e podem não ser tratadas por uma implementação personalizada System.ServiceModel.Dispatcher.IErrorHandler . Se você estiver em um ambiente de desenvolvimento como o Microsoft Visual Studio, a maioria dessas exceções será exibida automaticamente. No entanto, algumas exceções podem ser mascaradas por configurações de ambiente de desenvolvimento, como Just My Code Visual Studio.

Independentemente dos recursos do seu ambiente de desenvolvimento, você pode usar os recursos de rastreamento WCF e registro de mensagens para depurar todas as exceções e ajustar o desempenho de seus aplicativos. Para obter mais informações, consulte Usando o rastreamento para solucionar problemas do seu aplicativo.

Problemas de desempenho e XmlSerializer

Serviços e aplicativos cliente que usam tipos de dados que são serializáveis usando o código de serialização gerar e compilar para esses tipos de dados em tempo de execução, o XmlSerializer que pode resultar em desempenho de inicialização lento.

Nota

O código de serialização pré-gerado pode ser usado apenas em aplicativos cliente e não em serviços.

A ServiceModel Metadata Utility Tool (Svcutil.exe) pode melhorar o desempenho de inicialização para esses aplicativos gerando o código de serialização necessário dos assemblies compilados para o aplicativo. Para obter mais informações, consulte Como: Melhorar o tempo de inicialização de aplicativos cliente WCF usando o XmlSerializer.

Problemas de desempenho ao hospedar serviços WCF sob ASP.NET

Quando um serviço WCF é hospedado em IIS e ASP.NET, as definições de configuração do IIS e do ASP.NET podem afetar a taxa de transferência e o espaço de memória do serviço WCF. Para obter mais informações sobre ASP.NET desempenho, consulte Melhorando o desempenho ASP.NET. Uma configuração que pode ter consequências não intencionais é MinWorkerThreads, que é uma propriedade do ProcessModelSection. Se seu aplicativo tiver um número fixo ou pequeno de clientes, a configuração MinWorkerThreads como 2 pode fornecer um aumento de taxa de transferência em uma máquina multiprocessador que tenha uma utilização da CPU próxima de 100%. Esse aumento no desempenho tem um custo: também causará um aumento no uso de memória, o que pode reduzir a escalabilidade.

Consulte também