Tengo un servidor .NET 2.0 que parece estar corriendo en problemas de escala, probablemente debido a un mal diseño del código de toma de manejo, y estoy en busca de orientación sobre cómo podría rediseñarlo para mejorar el rendimiento.Consejos/técnicas de alto rendimiento sockets de servidor de C#
Escenario de uso: 50 - 150 clientes, alta velocidad (hasta 100s/segundo) de mensajes pequeños (10s de bytes cada uno) a/desde cada cliente. Las conexiones de los clientes son de larga vida, generalmente horas. (El servidor es parte de un sistema comercial. Los mensajes del cliente se agregan en grupos para enviar a un intercambio en un número menor de conexiones de socket 'salientes', y los mensajes de confirmación se envían a los clientes a medida que el intercambio procesa cada grupo .) SO es Windows Server 2003, el hardware es 2 x 4-core X5355.
diseño de socket del cliente actual: Un TcpListener
genera un subproceso para leer cada socket de cliente que se conectan los clientes. Los hilos bloquean en Socket.Receive
, analizan los mensajes entrantes y los insertan en un conjunto de colas para su procesamiento por la lógica del servidor central. Los mensajes de acuse de recibo se envían nuevamente a través de los sockets del cliente utilizando las llamadas asincrónicas Socket.BeginSend
de los hilos que hablan al lado de la centralita.
problemas observados: Al reducirse la cantidad de clientes ha crecido (ahora 60-70), hemos empezado a ver los retrasos intermitentes de hasta 100s de milisegundos al enviar y recibir datos a/de los clientes. (Registramos marcas de tiempo para cada mensaje de acuse de recibo, y podemos ver brechas largas ocasionales en la secuencia de marca de tiempo para grupos de acks del mismo grupo que normalmente salen en unos pocos totales.)
El uso total de la CPU del sistema es bajo (< 10%), hay un montón de memoria RAM libre, y la lógica de la base y el lado de salida (intercambio orientación) está realizando muy bien, por lo que el problema parece estar aislado con el código de socket de cara al cliente. Existe un ancho de banda de red amplio entre el servidor y los clientes (LAN gigabit), y hemos descartado problemas de red o de capa de hardware.
Cualquier sugerencia o punteros a recursos útiles serán bienvenidos. Si alguien tiene algún consejo de diagnóstico o depuración para averiguar exactamente qué es lo que está mal, también sería genial.
Nota: Tengo el artículo Winsock: Get Closer to the Wire with High-Performance Sockets in .NET de MSDN Magazine, y he echado un vistazo al componente "XF.Server" de Kodart: parece incompleto en el mejor de los casos.
estuvo de acuerdo, aunque debo añadir que a pesar de que "descartado" problemas de red, consideraría intercambiar varias piezas (especialmente el servidor) y asegurarse de tener todos los últimos firmware y controladores. –