Controlando o consumo de recursos e a melhoria de desempenho

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

Propriedades que restringem o consumo de recursos no WCF

O WCF (Windows Communication Foundation) aplica restrições a determinados tipos de processos para fins de segurança ou desempenho. Elas se apresentam, principalmente, de duas formas: cotas e restrições. Cotas são limites que, quando alcançados ou excedidos, disparam uma exceção imediata em algum ponto do sistema. Restrições são limites que impedem que uma exceção seja lançada imediatamente. Em vez disso, quando um limite de restrição é alcançado, o processamento continua, mas dentro dos limites definidos por esse valor de restrição. Esse processamento limitado pode disparar uma exceção em outro lugar, mas isso depende do aplicativo.

Além da distinção entre cotas e restrições, algumas propriedades de restrição estão localizadas no nível de serialização, algumas no nível de transporte e outras no nível do aplicativo. Por exemplo, a cota TransportBindingElement.MaxReceivedMessageSize, implementada por todos os elementos de associaçã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, causando consumo excessivo de memória. (Normalmente, você pode aumentar o desempenho reduzindo esse valor.)

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

Esses controles foram criados para fornecer uma mitigação pronta para uso em relação a determinados tipos de ataques ou para melhorar as métricas de desempenho, como volume de memória, tempo de inicialização etc. No entanto, dependendo do aplicativo, esses controles podem impedir o funcionamento ou o desempenho dele. Por exemplo, um aplicativo criado 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á dificultando seu aplicativo e descreve maneiras de corrigir vários problemas. A maioria das restrições e algumas cotas estão disponíveis no aplicativo, mesmo quando a propriedade básica é uma restrição de serialização ou transporte. Por exemplo, você pode definir a propriedade DataContractSerializer.MaxItemsInObjectGraph usando a propriedade ServiceBehaviorAttribute.MaxItemsInObjectGraph na classe de serviço.

Observação

Se você tiver um problema específico, leia primeiro o Início Rápido de solução de problemas do WCF para ver se encontra alguma solução por 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 membros da classe ServiceThrottle.

Os padrões dos valores anteriores foram escolhidos para habilitar a funcionalidade básica do aplicativo em uma ampla gama de tipos de aplicativo, fornecendo proteção básica contra problemas comuns de segurança. No entanto, designs de aplicativos diferentes podem exceder uma ou mais configurações de restrição, embora o aplicativo seja seguro e funcione como projetado. Nesses casos, você deve identificar quais valores de restriçã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 propriedade ServiceDebugBehavior.IncludeExceptionDetailInFaults 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 aplicativo, de modo a exibir quais configurações de cota podem estar envolvidas, se esse for o problema.

Algumas exceções ocorrem em tempo de execução abaixo da visibilidade da camada do aplicativo e não são retornadas usando esse mecanismo. Além disso, elas podem não ser tratadas por uma implementação personalizada de 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 o Just My Code (Apenas Meu Código) do Visual Studio.

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

Problemas de desempenho e XmlSerializer

Os serviços e os aplicativos cliente que usam tipos de dados serializados usando XmlSerializer, geram e compilam o código de serialização para esses tipos de dados em tempo de execução, o que pode levar a um desempenho lento da inicialização.

Observação

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

A Ferramenta do Utilitário de Metadados ServiceModel (Svcutil.exe) pode melhorar o desempenho da inicialização desses aplicativos, gerando o código de serialização necessário dos assemblies compilados do aplicativo. Para obter mais informações, confira Como melhorar o tempo de inicialização dos aplicativos cliente do WCF usando o XmlSerializer.

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

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

Confira também