2009-10-31 19 views
6

Ho una semplice applicazione C# che utilizza il multicast UDP in uno scenario single-receiver, single-sender. L'obiettivo è ottenere la consegna dei messaggi il più rapidamente possibile in un ambiente di rete locale.Prestazioni multicast UDP sotto carico

Ho usato SocketAsyncEventArgs/SendAsync/ReceiveAsync, BeginSend/BeginReceive, Threads/Send/Receive e ho provato sia il multicast PGM che UDP.

Ogni tentativo di implementazione funziona OK per la consegna ripetuta di messaggi fino a circa 1000 messaggi con invio locale, ricezione locale. Successivamente, le prestazioni iniziano a scendere in modo esponenziale. Dove 1000 messaggi richiedono alcuni centesimi di secondo, 10.000 messaggi potrebbero richiedere da 2 a 10 secondi.

Qualcuno ha esperienza nel multicasting UDP/PGM ad alte prestazioni? Qual è il miglior design per ottenere il massimo rendimento?

Aggiornamento

In questo momento, è solo un singolo programma in esecuzione a livello locale - 1 applicazione con 1 mittente e ricevente 1. I messaggi di test sono 4 byte.

risposta

9

Provare a rendere il buffer di invio o ricezione del socket (server o client) abbastanza grande da contenere la quantità di traffico che ci si aspetta di gestire. Ecco qualche esempio di codice C# dalla mia UDP multicast server/client sul lato server in cui dataSock è il mio Socket legato al gruppo multicast UDP:

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

essere sicuri anche e impostare SocketOptionName.SendBuffer sul lato client per abbinare il dimensione del buffer che il tuo server sta producendo.

Vorrei anche raccomandare, se non fossi già a conoscenza, di rendere le dimensioni del pacchetto inferiori rispetto al MTU. Per impostazione predefinita, le MTU sono impostate su 1500 byte. (MTU è la dimensione massima dell'unità di trasmissione)

È ancora possibile ottenere pacchetti persi a meno che non si riduca anche la velocità di trasmissione, per assicurarsi che i client possano tenere il passo. Probabilmente il tuo hardware di rete è non il collo di bottiglia qui. Vedere la mia domanda Need microsecond delay in .NET app for throttling UDP multicast transmission rate per una risposta a questo problema (utilizzando Stopwatch in un ciclo while per ritardi nell'ordine dei microsecondi).

+0

Grazie per le informazioni ben ponderate. – Anton

+0

Nessun problema. Sono in trincea con questa roba anche in questo momento. :) –

1

Non sono esperto in questo, ma sembra che tu stia sbattendo contro la capacità della tua rete. Potrebbe essere necessario aggiornare l'hardware per ottenere un rendimento migliore. Ma senza conoscere la dimensione dei pacchetti, la larghezza di banda della rete, o il numero di macchine che stanno tentando di comunicare, ecc., È solo un'ipotesi.

Problemi correlati