2009-10-31 15 views
6

Tengo una aplicación C# simple que usa multidifusión UDP en un escenario de un solo receptor y un solo remitente. El objetivo es obtener la entrega de mensajes lo más rápido posible en un entorno de red local.Rendimiento de multidifusión UDP bajo carga

He utilizado SocketAsyncEventArgs/SendAsync/ReceiveAsync, BeginSend/BeginReceive, Threads/Send/Receive, y he intentado tanto la multidifusión PGM como la UDP.

Cada intento de implementación funciona bien para la entrega de mensajes repetidos hasta alrededor de 1000 mensajes con envío local, recepción local. Después de eso, el rendimiento comienza a disminuir exponencialmente. Donde 1000 mensajes toman algunas centésimas de segundo, 10,000 mensajes pueden tomar entre 2 y 10 segundos.

¿Alguien tiene experiencia en multidifusión UDP/PGM de alto rendimiento? ¿Cuál es el mejor diseño para obtener el máximo rendimiento?

actualización

En este momento, es sólo un único programa que se ejecuta localmente - 1 aplicación con 1 emisor y 1 receptor. Los mensajes de prueba son 4 bytes.

Respuesta

9

Intente que el búfer de envío o recepción de su zócalo (servidor o cliente) sea lo suficientemente grande como para acomodar la cantidad de tráfico que espera tratar. Aquí hay alguna muestra de código C# de mi propia UDP multicast servidor/cliente en el servidor donde dataSock es mi Socket unido al grupo de multidifusión UDP:

dataSock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveBuffer, (NumberOfPackets * PacketSize) + SmallEpsilonForExtraHeadroom); 

También asegúrese y establecer SocketOptionName.SendBuffer en el lado del cliente para que coincida con el Tamaño del búfer que su servidor está produciendo.

También recomendaría, si aún no lo sabía, que el tamaño de sus paquetes sea inferior al MTU. Por defecto, las MTU están configuradas en 1500 bytes. (MTU es el tamaño máximo de la unidad de transmisión)

Aún puede obtener paquetes caídos a menos que también acelere su tasa de envío, para asegurarse de que sus clientes puedan mantener el ritmo. Su hardware de red probablemente sea no el cuello de botella aquí. Consulte mi pregunta Need microsecond delay in .NET app for throttling UDP multicast transmission rate para obtener una respuesta a ese problema (usando Stopwatch en un ciclo while para retrasos del orden de microsegundos).

+0

Gracias por la información bien pensada. – Anton

+0

Ningún problema en absoluto. Estoy en las trincheras con estas cosas en este momento también. :) –

1

No soy experto en esto, pero suena como que choca contra la capacidad de su red. Es posible que deba actualizar su hardware para obtener un mejor rendimiento. Pero sin saber el tamaño de los paquetes, el ancho de banda de la red o cuántas máquinas intentan comunicarse, etc., eso es solo una suposición.

Cuestiones relacionadas