2009-11-04 7 views
10

Durante il test di un server multicast UDP che ho scritto su Windows 7 Ultimate x64, mi sono imbattuto in una cosa più curiosa. Riproduzione di musica con foobar2000 sullo sfondo in modo significativo migliorata La velocità di trasmissione del server, ma ha anche incontrato minori perdite di pacchetti. Disattivando immediatamente la musica, la velocità di trasmissione è scesa a livelli inferiori a quelli accettabili, ma ha anche prodotto una perdita di pacchetti pari a 0. (Ho un'applicazione client che comunica con il server e riporta pacchetti non riconosciuti)Best practice di applicazioni di rete ad alte prestazioni

Sono consapevole del comportamento di Vista (e su) per far funzionare bene i media e le applicazioni di rete, ma di certo non mi aspettavo che suonasse la musica migliorerebbe le prestazioni della rete, né che la disattivazione delle prestazioni di rete degradate fosse così significativa.

Cosa posso fare su questo dal punto di vista del codice nella mia applicazione server in modo che funzioni in modo coerente sia che si riproduca musica o meno su Vista e su? Vorrei certamente evitare di dover informare tutti i miei clienti su come modificare il loro registro per ottenere velocità di trasmissione accettabili, e vorrei anche evitare di farli semplicemente "riprodurre musica" per ottenere anche tassi di trasmissione accettabili. L'applicazione dovrebbe "funzionare" secondo me.

Sto pensando che la soluzione implichi qualcosa sulla falsariga delle priorità del processo, MMCSS, o forse qualche altra oscura chiamata API di Windows per farlo fare qui The Right Thing (TM).

Inoltre, scusate ma la creazione di un caso di test riproducibile è una quantità non trascurabile di lavoro. Il comportamento di limitazione si verifica solo quando il driver per la scheda di rete fisica sta funzionando attivamente e non può essere riprodotto utilizzando l'interfaccia di loopback. Uno avrebbe bisogno di un'implementazione del client, un'implementazione del server e l'hardware della rete fisica con cui testarlo.

+0

quando dici "sta suonando musica", intendi che sta riproducendo musica del tuo HD e utilizzando la scheda audio? O è in streaming tramite la stessa scheda di rete? – Toad

+0

@reinier: Sì, foobar2000 sta caricando lentamente i dati dall'HD e lo streaming audio all'interfaccia audio esterna tramite USB 2.0. –

risposta

3

Quello che si osserva è l'effetto collaterale della risoluzione di clock della macchina del proprio lettore multimediale a 1 ms.

Questo accade solo durante il gioco

L'effetto collaterale è - la tua applicazione ha porzione di tempo più piccoli e questo imporves vostra applicazione perché probabilmente hai avuto molta CPU rubato dalla tua app e con porzione di tempo più lungo - più a lungo tempo.

di provarlo è sufficiente impostare la risoluzione del timer all'interno della vostra applicazione per 1ms e confrontare le prestazioni senza riproduzione multimediale.

Dovrebbe essere lo stesso come se senza impostazione clocres ma con riproduzione multimediale.

0

Foobar ha ottenuto molti plug-in scritti da persone diverse. Questi potrebbero essere la causa del tuo problema. Ti propongo di avvicinarti alla vera ragione. Prova a disattivare i plug-in uno ad uno eseguendo il test ogni volta che un plug-in è disabilitato.

Spero che l'idea possa essere d'aiuto.

+0

Dubito fortemente che il problema sia specifico di foobar2000. Proverò altri lettori multimediali per diagnosticare ulteriormente il problema. * Potrebbe * avere qualcosa a che fare con l'interfaccia audio USB 2.0 che uso. Farò dei test anche con la scheda audio integrata. –

0

Questo suona come il throughput di gestione TSP/IP basato sul suo algoritmo primitivo. Il white paper qui dovrebbe dare più sfondo. http://www.asperasoft.com/?gclid=CICSzMqD8Z0CFShGagod_ltSMQ Il loro prodotto è un protocollo UDP che funziona molto bene.

+0

Devo dire che utilizzo entrambi i protocolli TCP e UDP all'interno della stessa applicazione. TCP è solo per informazioni di controllo e coordinamento di tutti i client; non dovrebbe essere il collo di bottiglia qui. Io uso UDP esclusivamente per il trasferimento dei dati e mantengo i pacchetti al di sotto dei 1500 byte. Stavo usando tutto l'UDP ma ho incontrato seri problemi di sincronizzazione e stavo per reinventare la ruota TCP, quindi ho detto perché non usare solo il TCP. –

+0

TCP/IP è il primo posto in cui cercherò il tuo problema. –

+0

@Mike: Pensi che la perdita di pacchetti UDP sul lato server sia in qualche modo correlata alla comunicazione TCP in corso? TCP viene utilizzato solo per notificare a tutti i client che il prossimo batch di dati sta per essere inviato su UDP. C'è anche un messaggio 'settore completo' che viene inviato dopo un breve ritardo dal server. Mentre è in atto un trasferimento batch UDP, non vi sono messaggi TCP inviati avanti e indietro dall'applicazione tranne il normale flusso di traffico TCP che il sistema operativo esegue per mantenere stabilita la connessione. –

2

Sono passati molti anni da quando ho scritto il codice relativo al protocollo di rete, ma offrirò un'ipotesi.

Sospetto che si tratti di un problema di throughput and latency. Riproduzione di musica sta introducendo la contesa I/O e aggiungendo latenza nella trasmissione dei pacchetti. Tuttavia, è probabile che la latenza aggiunta causi l'accodamento dei pacchetti e quindi la produzione in batch aumenti il ​​throughput .

Per risolvere questo problema nel codice, è possibile provare a inviare i pacchetti in lotti da soli. Suppongo che tu stia inviando ciascun pacchetto al sistema per la trasmissione mentre i dati sono pronti. Raggruppa più pacchetti e inviali al sistema contemporaneamente. Anche solo un gruppo di due o tre pacchetti potrebbe fare una differenza drammatica, specialmente se si è introducing your own small delay tra ogni chiamata di sistema.

Non sono riuscito a trovare alcun collegamento direttamente rilevante da una ricerca rapida su Google. Tuttavia, è possibile vedere il concetto in this discussion of network tuning for Linux o in this FAQ che descrive tecniche come il batching per migliorare il throughput.

+0

Sto già raggruppando i pacchetti in gruppi di 1.024. I pacchetti sono circa 1400 byte ciascuno. Ottengo circa 50-60 pacchetti riconosciuti negativamente dal client su 1.024. Quando spengo il lettore multimediale sulla macchina server, il conteggio NAK scende immediatamente a 0 e si ottiene un migliore throughput. Questo sembra indicare che il server è responsabile della perdita di pacchetti. Mi chiedo cosa posso fare dal lato server, se mai, per accogliere automaticamente questa contesa I/O. –

+0

Il tuo commento sembra indicare l'opposto della tua domanda. Stai davvero cercando di inviare 1024 pacchetti ogni 50-100 μs? È una folle produzione. E il problema è davvero il throughput o la perdita di dati? –

+0

Oh no no. Il ritardo di 50-100 microsecondi è il ritardo tra l'invio di singoli pacchetti all'interno del settore dei pacchetti 1024. Inoltre, non credo di aver menzionato il mio ritardo di 50-100 microsecondi in questa domanda. Stai incrociando le mie domande su SO? :) –