Tra il codice e la realtà

omnia munda mundis
  • rss
  • Inizio
  • About
  • Andrea Murru

Perdita di pacchetti ad alti bitrate

Andrea Murru | 19 gennaio 2009

In un progetto sul quale ho lavorato di recente, mi è capitato di avere a che fare con flussi (streaming multimediali) a bitrate relativamente alto, per l’hw in questione. Scrivo questo post perché siamo stati vittime di un nostro (banale) bug che ci è costato qualche giorno di test e qualche mal di testa: magari qualcuno potrà evitarseli leggendo questo post… non si trova molta documentazione in giro.

Intanto qualche altro dettaglio sul sistema: un client che riceve flussi multimediali in UDP (fino a 10 mbs) su windows embedded ce 6.0, realizzato in c++ con il visual studio 2005, utilizzando direttamente winsock2. Un thread si occupa della ricezione utilizzando semplicemente una socket in modalità bloccante in un ciclo di lettura che ha anche il compito di effetture alcune operazioni sui dati (poco onerose in termini di CPU) e di copiarli in un buffer dal quale un thread consumatore le preleva. Viene utilizzata la funzione recv(), visto che la modalità bloccante non è affatto un problema (e quindi l’ overlapped I/O è inutile) e le completion routine non sono ben supportate da windows embedded ce 6.0.

Tutto sembra funzionare bene, fino a bitrare inferiori a 2 mbs, ma superando tale valore… si manifestano degli strani problemi. Dopo molta fatica (visto che ovviamente non era possibile andare in debug, ma neppure scrivere su file se non pochi kbytes e quidi il debug stesso non poteva che avvenire anch’esso via rete), sembrava inequivocabile che si trattasse di perdite di pacchetti dallo 0.3% al 3% circa. A ridurre la nostra lucità di analisi si metteva anche il fatto che ad avere problema era solo uno streamer che utilizzavamo per la prima volta, mentre quello che avevamo utilizzato fino ad allora funzionava alla grande (ora sappiamo che dipendeva solo dal bitrate).

Il passo successivo (e molto poco divertente) è stato quello di usare wireshark per verificare se una tale perdita di pacchetti era in qualche modo imputabile alla nostra lettura… provate a cercare in un dump 1 paccheto perso, verificando che non ci siano buchi in un continuity counter a 4 bit e con il parser di wireshark bacato. Davvero poco divertente. Comunque le perdite non c’erano!

Il problema è semplicemente legato al fatto che il sistema operativo allocca un buffer interno, settato di defaut a pochi kbytes, che può facilmente venire saturato se il thread che effettua la lettura non è sufficientemente veloce o se viene sospeso (anche solo per pochi ms).

Fortunatamnte la soluzione esiste: basta settare un buffer di ricezione più grande.

unsigned bufferSize = 1024 * 1024;
::setsockopt(s_, SOL_SOCKET, SO_RCVBUF, (const char FAR*)&bufferSize, sizeof(bufferSize));

con 1 mbyte di buffer, a 10 mbs, si possono gestire circa 800 ms di flusso: si tratta di un valore congruo che ci ha permesso di eliminare del tutto le perdite.

Comments
Nessun Commento »
Categorie
Programmazione
Tags
C++, completion routine, overlapped I/O, socket, SO_RCVBUF, windows embedded ce 6.0, wireshark
Commenti RSS Commenti RSS
Trackback Trackback

Contatti



sitòfono

Suggeriti

  • Caasa Caasa
  • Carlo Pescio
  • CICAP
  • Mercato-Immobiliare.info Mercato-Immobiliare.info
  • Programmazione.it
  • Technology Bites Technology Bites
  • UAAR UAAR
  • Wall Street Italia

RSS news da leggere

  • Ammettiamolo, pochi avrebbero scommesso sul “default da neve ... - Online-News 6 febbraio 2012
  • Pedofilia, il Papa: priorità alle vittime Cardinal Nevada: oltre ... - Il Messaggero 6 febbraio 2012
  • Ambientalisti, per amor di Dio - L'Indro 6 febbraio 2012
  • Il pensiero religioso dal paleolitico all'Islam - Guagnano Informa (Blog) 6 febbraio 2012
  • I PICCOLI E LA FEDE: DON BENZI (CEI), UN TEMPO IMPORTANTE PER LA ... - Toscana Oggi 6 febbraio 2012
  • Papa: a settembre il 3/o volume su Gesu' - Corriere della Sera 6 febbraio 2012
  • Eugenio Finardi: “A Morandi non potevo dire di no” - LeiWeb 6 febbraio 2012
  • Julien Ries: «Al Meeting ho visto che la perversione del '68 ... - Tempi.it 6 febbraio 2012
  • È necessario trasmettere entusiasmo per Cristo. Come fecero i ... - Tempi.it 6 febbraio 2012
  • Volunia, il motore di ricercaitaliano che va oltre Google 6 febbraio 2012
  • Un nuovo grande occhio scruterà l'universo 6 febbraio 2012

Lavoro

  • Abbeynet
  • Caasa Caasa
  • Mercato-Immobiliare.info Mercato-Immobiliare.info
  • Pane e Dolce Pane e Dolce
  • Plus Immobiliare

Notizie Condivise

categorie

  • Attualità (28)
  • Filosofia (7)
  • Informatica (14)
  • Programmazione (13)
  • Religione (16)
  • Storia (2)

tag

affidabilità Andrea Murru Bagnasco Barragan Benedetto XVI Berlusconi bibbia blog C++ caasa Calice d'oro Carlo Pescio cloaking comandamenti completion routine Corte di Cassazione costituzione Droga efficienza Eluana Englaro europeana eutanasia fluido non newtoniano gioia google gSOAP iDoser informazione ip-delivery Java JSON Kant Le Iene libertà Linus Torvalds Marcello Pera mercato immobiliare miracoli numeri omonimia peccato ragione SEO UAAR XML
rss Commenti RSS