2009-09-18 1 views
5

Abbiamo recentemente completato un'analisi delle prestazioni di invio multicast. Fortunatamente, Java e C si sono comportati in modo quasi identico, poiché abbiamo testato diverse velocità di invio del traffico su Windows e Solaris.Prestazioni di trasmissione multicast

Tuttavia, abbiamo notato che il tempo di inviare un messaggio multicast aumenta all'aumentare del tempo tra le mandate. Più frequentemente chiamiamo invia, meno tempo ci vuole per completare la chiamata di invio.

L'applicazione ci consente di controllare la quantità di tempo che aspettiamo tra la chiamata di invio, di sotto si vede il tempo che aumenta come il ritardo tra i pacchetti sale. Quando si inviano 1000 pacchetti al secondo (1 ms di tempo di attesa), sono necessari solo 13 microsecondi per chiamare send. A 1 pacchetto/secondo (tempo di attesa 1000 ms), il tempo aumenta fino a 20 microsecondi.

Wait time (ms)      us to send 
0         8.67 
1         12.97 
10         13.06 
100         18.03 
1000        20.82 
10000        57.20 

Vediamo questo fenomeno sia da Java che da C e sia su Windows che su Solaris. Stiamo testando su un server Dell 1950, con una scheda di rete a doppia porta Intel Pro 1000. Il micro-benchmarking è difficile, specialmente in Java, ma non pensiamo che questo sia collegato a JITing o GC.

codice Java e la linea di comando che sto utilizzando per i test sono a: http://www.moneyandsoftware.com/2009/09/18/multicast-send-performance/

risposta

2

Alcune teorie:

Il mio primo pensiero è stato che io considero il caching ad essere un fattore qui - se il i compiti e i valori sono ancora in pila o nella recente memoria a breve termine, è possibile che sia in grado di inviarli più velocemente. Con l'aumentare del tempo, la possibilità che sia ancora disponibile diminuisce, quindi in media richiedere più tempo.

Tuttavia, mi aspetto che ci sia un limite superiore se questo fosse il caso ... qualche punto in cui è sempre in cache.

Un ragionamento alternativo è che c'è una perdita di memoria o un peggioramento delle prestazioni nel tempo nell'app/test/piattaforma. Questo anche se (se esiste) significa che più a lungo si aspetta, più a lungo si ha il tempo di degradare le prestazioni, e quindi più tempo ci vorrebbe per inviare.

ANCHE - se si impiegano più tempo tra i pacchetti per inviarli, è possibile superare i timeout di apprendimento dell'indirizzo, sia tabelle IP che tabelle MAC. Se queste tabelle/cache sono scadute, avrebbero bisogno di impararle nuovamente prima di inoltrare il pacchetto.

Buona fortuna!

+0

Per verificare questa teoria, l'OP deve verificare con unicast e vedere un profilo simile mostrato nell'analisi. – Stef

+0

beh, in teoria - ma la maggior parte degli switch/router con cui ho lavorato mantengono tabelle e cache separate per unicast vs multicast. Quindi possono avere entrambi gli stessi timeout, ma IIRC erano anche configurabili ... –

+0

I timeout nelle tabelle di routing non comportano che tutto sotto il tempo di timeout abbia la stessa velocità, mentre tutto è più lento.Ma vediamo che si degradano gradualmente mentre aumentiamo il tempo tra i pacchetti. –

1

Il codice per eseguire tali attività è memorizzato nella cache più vicino alla CPU (forse anche ancora nei registri) quando si è appena verificata una chiamata.

+0

Se fosse true, si vedrebbe il peggioramento delle prestazioni di qualsiasi operazione quando il tempo tra le operazioni aumenta. Ho cambiato il test per fare un sqrt o tan invece e vediamo una curva di riduzione delle prestazioni simile. Sta utilizzando l'affinità della CPU e protegge il modo giusto per risolvere questo problema? –

1

Come stai aspettando tra le mandate? Hai provato ad aspettare perché tu non rinunci alla CPU?