当我使用10 gig网络接口从一个solaris m / c进行traceroute时,40字节数据包需要0.073 ms。
当我在java中做同样的事情时,时间会更长。即使经过10K迭代,它也会更长。可能是什么原因 ?
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();
}
它需要更长的69毫秒,它甚至不依赖于字节大小。即使我减少它说1字节数组,它仍然需要69毫安。任何评论/建议?
其他观察: 1. OutputStream.write和flush只需6微秒。 2.类似地,在接收和写回的TCPReceiver端的另一端,它只需要6微秒。
解决方案: 谢谢大家对此查询的回复。 我发现这是由于套接字缓冲区大小:
在solaris m / c上设置的默认缓冲区大小。
收到缓冲区大小49152.
发送缓冲区大小7552。
我增加了套接字缓冲区大小,性能几乎与traceRoute匹配。
答案 0 :(得分:3)
你不是喜欢比较。 ICMP和TCP是不同的协议。
如果您想确定延迟是否在您的代码,JVM,Solaris TCP堆栈或网络中,您必须从tcpdump / wireshark等开始。
答案 1 :(得分:1)
这可能是由于许多因素造成的。对于初学者来说,建立TCP通道需要时间。必须在两个端点之间发送几个数据包以建立可靠的介质。 ICMP消息不是这种情况,它们只是单个数据包。实际上,因为无论大小如何,您都没有看到传输数据所需的时间差异,那么您可能会认为实际传输数据所需的时间(您谈论的是非常少量的数据)在任何情况下,在10gig连接上)与建立信道所花费的时间相比可以忽略不计。此外,完全有可能存在一些与您使用Java(字节码语言)而不是像C或C ++一样在硬件上本机运行的事实相关的开销。
答案 2 :(得分:0)
连接所需的时间约为20毫秒。您需要使用现有连接进行测试。
TCP堆栈通过内核非常慢。在许多机器上需要大约50-100我们。您可以使用内核旁路驱动程序/支持来减少这种情况。