Domanda

Abbiamo un client e un'applicazione server attualmente testando sulla stessa macchina Windows 7 a 64 bit. Sono entrambi scritti in C # e utilizzando P / Invoke per chiamare alle librerie Winsock2.

L'applicazione funziona benissimo nel complesso w / o eventuali errori. E la latenza per ogni "hop" su TCP / IP in media circa 350 microsecondi.

Tuttavia, a volte ci sono molto lunghi ritardi verso l'alto di 40 a 50 ms prima di ricevere i pacchetti e poi improvvisamente saranno tutti arrivare.

Gli sforzi per diagnosticare finora:

  1. Nel corso di questi ritardi di ricezione dei dati, il server continua a registrare che è l'invio di pacchetti. È impostato per inviare i pacchetti di test ogni 1 ms che lo farà per 15 o 20 e il più 50 ms a volte prima che il cliente riceve uno di essi.

  2. Il tcpdump è stato utilizzato per i pacchetti sniff sulla scheda di loopback e spettacoli che durante questo periodo di ritardo, c'è il traffico dalla porta del server (6488) alla porta del client (61743) come al solito.

  3. Il client chiama il select) chiamata Winsock2 (in un ciclo in modo di registrazione tramite un contatore prima delle select () di chiamata mostra che ha il descrittore di file corretto. E naturalmente questo funziona, prima e dopo il ritardo più che bene.

  4. Più registrazione immediatamente dopo le selezionate () chiamata mostra che il fd non è presente - significa che una lettura sulla presa bloccherà. Tuttavia, durante i periodi di trasmissione w / o eventuali ritardi, gli spettacoli registrazione funziona come previsto in modo che select () restituisce il fd della presa per fare una lettura non bloccante.

In breve, l'adattatore loopback sembra tenere questi pacchetti da qualche parte per un lungo tempo prima che finalmente li consegna al lato ricevente.

Eventuali ulteriori idee o una soluzione?

Alcuni pensieri sono l'è spesso affermato che I sovrapposta / O funziona meglio su Windows ma che sembra solo questione di scalabilità se avete bisogno di ascoltare più di 64 socket.

E 'possibile che il passaggio a sovrapposto farà il trucco? Vogliamo evitare il che aumenterà la scadenza del progetto e di bilancio. Questo dovrebbe funzionare con select () più che bene.

Inoltre, può essere che il processo o thread di Windows che gestisce il loopback ottiene contesto accesi o qualcosa del genere e, in caso affermativo, c'è un modo per configurarlo per evitare tali ritardi?

Edit: La risposta corretta era di assicurare che l'algoritmo Nagle è stato disattivato. Abbiamo pensato che fosse disattivato, ma è lì che è stato trovato il bug - nella nostra implementazione in-house di SetSocketOption () abbiamo usato GetSocketOption () per verificare. Così si scopre, è necessario impostare NoDelay prima di collegare o vincolante una presa altrimenti fallisce silenziosamente avere alcun effetto.

Molte grazie a Fun Mun Pieng per la risposta corretta !!!

È stato utile?

Soluzione

Ho il sospetto che questo può essere dovuto alla Nagle algoritmo . Il codice seguente disabilita:

socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top