Control del consumo de recursos y mejora del rendimiento

En este tema se describen varias propiedades de diferentes áreas de la arquitectura de Windows Communication Foundation (WCF) que trabajan para controlar el consumo de recursos y que afectan a las métricas del rendimiento.

Propiedades que restringen el consumo de recursos en WCF

Windows Communication Foundation (WCF) aplica restricciones sobre ciertos tipos de procesos con fines de seguridad o rendimiento. Estas restricciones adquieren dos formas básicas: cuotas y aceleradores. Las cuotas son límites que, cuando se alcanzan o superan, desencadenan una excepción inmediata en algún punto del sistema. Las limitaciones son límites que no producen inmediatamente una excepción. En su lugar, cuando se alcanza el límite del acelerador, el procesamiento continúa pero dentro de los límites establecidos por ese valor. Este procesamiento limitado puede activar una excepción en otra parte, pero esto depende de la aplicación.

Además de la distinción entre cuotas y aceleradores, algunas propiedades de restricción se encuentran en el nivel de serialización, algunas en el nivel de transporte y algunas en el nivel de aplicación. Por ejemplo, la cuota TransportBindingElement.MaxReceivedMessageSize, que implementan todos los elementos de enlace de transporte proporcionados por el sistema, está establecida de forma predeterminada en 65.536 bytes para impedir que los clientes malintencionados emprendan ataques de denegación de servicio contra un servicio provocando el consumo excesivo de memoria. (Normalmente, puede aumentar el rendimiento bajando este valor.)

Un ejemplo de una cuota de la serialización es la propiedad DataContractSerializer.MaxItemsInObjectGraph, que especifica el número máximo de objetos que el serializador serializa o deserializa en una única llamada al método ReadObject. Un ejemplo de un acelerador en el nivel de aplicación es la propiedad ServiceThrottle.MaxConcurrentSessions, que de forma predeterminada restringe el número de conexiones de canal con sesión simultáneas a 10. (A diferencia de las cuotas, si se alcanza este valor de acelerador, la aplicación continúa con el procesamiento pero no acepta nuevos canales con sesión, lo que significa que los nuevos clientes no se pueden conectar hasta que uno de los otros canales con sesión haya finalizado.)

Estos controles están diseñados para proporcionar una mitigación rápida contra ciertos tipos de ataques o para mejorar métrica de rendimiento tal como el consumo de memoria, el tiempo de inicio, etc. Sin embargo, dependiendo de la aplicación, estos controles pueden impedir el rendimiento de la aplicación del servicio o evitar que la aplicación funcione. Por ejemplo, una aplicación diseñada para transmitir secuencias de vídeo puede superar con facilidad la propiedad TransportBindingElement.MaxReceivedMessageSize predeterminada. En este tema se proporciona un resumen de los diferentes controles aplicados a las aplicaciones en todos los niveles de WCF, se describen varias maneras de obtener más información sobre si un valor está entorpeciendo una aplicación y se describen maneras de corregir varios problemas. La mayoría de los aceleradores y algunas cuotas están disponibles en el nivel de aplicación, incluso cuando la propiedad base es una serialización o una restricción de transporte. Por ejemplo, puede establecer la propiedad DataContractSerializer.MaxItemsInObjectGraph utilizando la propiedad ServiceBehaviorAttribute.MaxItemsInObjectGraph en la clase de servicio.

Nota

Si tiene un problema determinado, primero debe leer Inicio rápido de solución de problemas de WCF para ver si su problema (y una solución) aparecen en la lista.

Las propiedades que restringen los procesos de serialización se enumeran en Consideraciones de seguridad para datos. Las propiedades que restringen el consumo de recursos relacionadas con transportes se enumeran en Cuotas de transporte. Las propiedades que restringen el consumo de recursos en el nivel de aplicación son los miembros de la clase ServiceThrottle.

Los valores predeterminados de los valores anteriores se han elegido para habilitar la funcionalidad de la aplicación básica en una amplia gama de tipos de aplicación proporcionando al mismo tiempo protección básica contra los problemas de seguridad comunes. Sin embargo, los diseños de las diferentes aplicaciones pueden superar uno o más valores de acelerador aunque por otro lado la aplicación sea segura y funcione como se ha diseñado. En estos casos, debe identificar qué valores de acelerador se superan y en qué nivel, y decidir la acción adecuada para aumentar el rendimiento de la aplicación.

Normalmente, al escribir la aplicación y depurarla, establece la propiedad ServiceDebugBehavior.IncludeExceptionDetailInFaults en true en el archivo de configuración o mediante programación. Esto indica a WCF que se devuelvan los seguimientos de pila de excepciones de servicio a la aplicación cliente para verlas. Esta característica crea informes de la mayoría de las excepciones en el nivel de aplicación de manera que se muestran qué valores de cuota podrían estar implicados, si ése es el problema.

En tiempo de ejecución se producen algunas excepciones bajo el nivel de aplicación visible y no se devuelven por medio de este mecanismo ni pueden controlarse mediante una implementación System.ServiceModel.Dispatcher.IErrorHandler personalizada. Si está en un entorno de desarrollo como Microsoft Visual Studio, la mayoría de estas excepciones se muestran automáticamente. Sin embargo, algunas excepciones pueden estar enmascaradas por algunas configuraciones del entorno de desarrollo, como Solo mi código de Visual Studio.

Con independencia de las funcionalidades de su entorno de desarrollo, puede utilizar funcionalidades de seguimiento y registro de mensajes de WCF para depurar todas las excepciones y ajustar el rendimiento de sus aplicaciones. Para más información, consulte Uso del seguimiento para solucionar problemas de la aplicación.

Problemas de rendimiento y XmlSerializer

Los servicios y las aplicaciones cliente que usan tipos de datos que son serializables mediante XmlSerializer generan y compilan el código de serialización de los tipos de datos en tiempo de ejecución, lo que se puede traducir en un rendimiento de inicio lento.

Nota

El código de serialización generado previamente solo puede usarse en aplicaciones cliente, no en servicios.

La herramienta ServiceModel Metadata Utility Tool (Svcutil.exe) puede mejorar el rendimiento de inicio de estas aplicaciones mediante la generación de código de serialización necesario a partir de los ensamblados compilados para la aplicación. Para más información, consulte mejora del tiempo de inicio de las aplicaciones cliente WCF mediante XmlSerializer.

Problemas de rendimiento al hospedar los servicios WCF bajo ASP.NET

Cuando un servicio WCF se hospeda bajo IIS y ASP.NET, la configuración de IIS y ASP.NET puede afectar al rendimiento y al consumo de memoria del servicio WCF. Para más información sobre el rendimiento de ASP.NET, consulte Mejora del rendimiento de ASP.NET. Una configuración que quizá pueda tener consecuencias imprevistas es la propiedad MinWorkerThreads, que es una propiedad de la clase ProcessModelSection. Si la aplicación tiene un número fijo o pequeño de clientes, al establecer MinWorkerThreads en 2 se podría observar un aumento del rendimiento en un equipo con varios procesadores que tenga un uso de CPU próximo al 100%. Esta mejora del rendimiento tiene su precio: aumentará también el consumo de memoria, lo que podría disminuir la escalabilidad.

Consulte también