2011-07-06 1 views
0

Lorsque je fais traceroute d'un Solaris m/c à un autre en utilisant une interface réseau de 10 gig, il faut 0,073 ms pour des paquets de 40 octets.Calcul du temps de trajet aller-retour de Tcp en utilisant java

Lorsque je fais la même chose en java, le temps est beaucoup plus long. Il est plus long même après 10 itérations. Quelle pourrait être la raison ?

Java: Sender (Snippet)

Socket sendingSocket = new Socket(address, RECEIVER_PORT); 
sendingSocket.setTcpNoDelay(true); 
OutputStream outputStream = sendingSocket.getOutputStream(); 
byte[] msg = new byte[64]; // assume that it is populated. 
for (int i = 0; i < 10000; i++) { 
    long start = System.nanoTime(); 
    outputStream.write(msg,0,64); 
    outputStream.flush(); 

    inputStream.read(msg,0,64); // inputStream is initialized like outputstream 
    long end = System.nanoTime(); 
} 

Il prend beaucoup plus 69 Millis et il ne dépend même pas de la taille d'octets. Même si je le réduis pour dire un tableau de 1 byte, cela prend encore 69 millis. Un commentaire/suggestion?

Autre observation: 1. OutputStream.write et affleurent ne prend que 6 micros. 2. De même, de l'autre côté TCPReceiver qui reçoit et écrit en arrière, il ne prend que 6 micros.

Solution: Merci à tous ceux que vous avez répondu pour cette requête. J'ai trouvé que c'était dû à la taille du tampon socket:

Taille de tampon par défaut définie sur solaris m/c.

Received Taille du tampon 49152.

Envoi Taille du tampon 7552.

I augmenté la taille de la mémoire tampon de prise et la performance correspond presque traceroute.

Répondre

3

Vous ne comparez pas comme avec. ICMP et TCP sont des protocoles différents.

Si vous voulez décider si le temps d'attente est dans votre code, la machine virtuelle Java, pile TCP Solaris ou le réseau que vous aurez à commencer par tcpdump/Wireshark etc.

+0

Alors que je suis d'accord avec votre comparaison STMP et TCP sont deux choses différentes, 65 millis est beaucoup trop dans le cas de TCP. – 2sb

+0

@ 2sb vous envoyez également beaucoup plus de données dans le cas TCP, presque deux fois plus. – EJP

+0

@ 2sb: Je suis d'accord - 65 millis ne semble pas raisonnable. C'est pourquoi je voudrais commencer avec un tcpdump pour aider à éliminer certaines causes potentielles. –

1

Ceci est probablement dû à un certain nombre de facteurs. Pour commencer, établir un canal TCP prend du temps. Plusieurs paquets doivent être envoyés entre les deux extrémités pour établir le support fiable. Ce n'est pas le cas des messages ICMP, ce sont simplement des paquets simples. En fait, comme vous ne voyez aucune différence dans le temps nécessaire pour transmettre les données, quelle que soit leur taille, vous pouvez probablement supposer que la quantité de temps nécessaire pour transmettre réellement les données (vous parlez d'une très petite quantité de données) dans les deux cas sur une connexion 10gig) est négligeable par rapport au temps nécessaire pour établir le canal. En outre, il est tout à fait possible qu'il y ait une surcharge liée au fait que vous utilisiez Java (un langage de bytecode) plutôt que quelque chose comme C ou C++ qui tourne nativement sur le matériel.

+0

L'établissement de la connexion (c'est-à-dire l'ouverture du Socket) ne se trouve pas à l'intérieur du bloc qui est mesuré, cependant. –

+0

Bien le langage bytecode n'est pas si mauvais. si java peut ajouter une latence de 65 millis alors aucun ne l'utilisera jamais :) – 2sb

0

Le temps de connexion peut être d'environ 20 ms. Vous devez tester en utilisant une connexion existante.

La pile TCP est relativement lente à travers le noyau. Cela prend environ 50-100 us sur beaucoup de machines. Vous pouvez réduire cela de manière substantielle en utilisant les pilotes/support de contournement du noyau.

+0

Oui j'ai utilisé la connexion existante. 5-100 US, c'est bien, mais dans mon cas, il était stupéfiant de 65 millis de plus, ce qui est beaucoup trop. – 2sb