Domanda

AIUTO PER FAVORE! Ho un'applicazione che necessita il più vicino possibile all'elaborazione in tempo reale e continuo a imbattermi in questo insolito problema di ritardo sia con TCP che con UDP. Il ritardo si verifica come un orologio ed è sempre lo stesso periodo di tempo (principalmente da 15 a 16 ms). Si verifica quando si trasmette a qualsiasi macchina (vigilia locale) e su qualsiasi rete (ne abbiamo due).

Una rapida analisi del problema:

Uso sempre winsock in C ++, compilato in VS 2008 Pro, ma ho scritto diversi programmi per inviare e ricevere in vari modi usando sia TCP che UDP. Uso sempre un programma intermedio (eseguito localmente o da remoto) scritto in varie lingue (MATLAB, C #, C ++) per inoltrare le informazioni da un programma all'altro. Entrambi i programmi Winsock funzionano sulla stessa macchina, quindi visualizzano i timestamp per Tx e Rx dallo stesso clock. Continuo a vedere emergere un modello in cui verrà trasmessa una raffica di pacchetti e poi c'è un ritardo di circa 15-16 millisecondi prima della raffica successiva, nonostante non sia stato programmato alcun ritardo. A volte può essere tra 15 e 16 ms tra ogni pacchetto anziché un'esplosione di pacchetti. Altre volte (raramente) avrò un ritardo di lunghezza diversa, come ~ 47 ms. Mi sembra sempre di ricevere i pacchetti entro un millesimo di secondo dalla loro trasmissione, sebbene con lo stesso schema di ritardo sia esposto tra le raffiche trasmesse.

Ho il sospetto che winsock o la NIC stiano eseguendo il buffering dei pacchetti prima di ogni trasmissione, ma non ho trovato alcuna prova. Ho una connessione Gigabit a una rete che riceve vari livelli di traffico, ma provo la stessa cosa anche quando eseguo il programma intermedio su un cluster che ha una rete privata senza traffico (almeno dagli utenti) e una connessione a 2 Gigabit. Sperimenterò anche questo ritardo durante l'esecuzione locale del programma intermedio con i programmi di invio e ricezione.

È stato utile?

Soluzione

Stamattina ho risolto il problema mentre riscrivevo il server in Java. La risoluzione del mio orologio di sistema di Windows è tra 15 e 16 millisecondi. Ciò significa che ogni pacchetto che mostra lo stesso millisecondo del suo tempo di trasmissione viene effettivamente inviato a diversi millisecondi in un intervallo di 16 millisecondi, ma i miei timestamp aumentano solo ogni 15-16 millisecondi in modo che appaiano uguali.

Sono venuto qui per rispondere alla mia domanda e ho visto la risposta sull'aumento della priorità del mio programma. Così ho avviato tutti e tre i programmi, sono entrato nel task manager, ho aumentato tutti e tre a "tempo reale" priorità (che nessun altro processo era in corso) e li ha eseguiti. Ho avuto gli stessi intervalli di 15-16 millisecondi.

Grazie per le risposte.

Altri suggerimenti

È sempre coinvolto il buffering e varia tra hardware / driver / sistema operativo ecc. Anche gli scheduler di pacchetti svolgono un ruolo importante.

Se vuoi "quotare duro in tempo reale" garanzie, probabilmente dovresti stare lontano da Windows ...

Quello che probabilmente stai vedendo è un ritardo dello scheduler: la tua applicazione è in attesa di altri processi per terminare il time-lapse e rinunciare alla CPU. Le finestre temporali standard su Windows multiprocessore vanno da 15ms a 180ms.

Potresti provare ad aumentare la priorità della tua applicazione / thread.

Oh sì, so cosa intendi. Windows e i suoi buffer ... prova a regolare i valori di SO_SNDBUF sul mittente e SO_RCVBUF sul lato ricevente. Inoltre, controlla l'hardware di rete coinvolto (router, switch, gateway multimediali) - elimina il più possibile tra le macchine per evitare la latenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top