2011-11-17 80 views
1

我刚接触网络并询问一个简单的问题,这让我很困惑。我希望有很多网络知识的人可以提供帮助。位于一台机器上或两台机器上的两个进程的Java nio套接字通信

我始终将消息从进程A发送到进程B.如果A和B位于同一台机器上,则平均端到端延迟为〜6毫秒;如果A和B位于本地网络中的两台机器上(由非常简单的路由器连接),则平均端到端延迟为〜176 ms。进程A和进程B使用java非阻塞套接字进行通信。每条消息都是10 KB,一条消息的消息副本将发送给不同的接收方。

另一个测试是改变消息副本的数量。在此测试中,有三个进程(A,B和C),其中进程A发送给进程B,进程B发送给进程C.如果发送一个消息副本,End2End延迟约为10毫秒;如果连续发送两个消息副本(20 KB),则end2end延迟为147 ms;如果逐个发送四个消息副本(40 KB),则end2end延迟为〜800 ms。 每1000毫秒发送一条新消息。

消息副本之间没有延迟。当要发送的邮件副本数量增加时,为什么成本增长如此之快?这与我的网络配置或我的编码问题有关吗?造成这种差异的原因是什么?代码

部分是在此链接:How to let selector that socketchannel key change in java nio

在开始的时候,我觉得它是缓慢的监守TCP缓冲区已满,该过程必须等待当有新的空间来写。在某些参考中,tcp的等待时间可能是200 ms。这对我的问题是否正确以及如何验证?

+1

这将有助于,如果你可以发布一些代码。 – r0ast3d

+0

这听起来像代码是不完全正确的,所以它表现不如它可能。 –

+0

我的代码发布在http://stackoverflow.com/questions/8107828/how-to-let-selector-that-socketchannel-key-change-in-java-nio。它可以工作,但表现不好。 – susan

回答

0

它通过网络的速度总是比给定的CPU慢。

1

本地计算机和整个网络的时间对于该数据量看起来有点慢。当然,这也取决于对数据执行什么处理,以及它是同步还是异步完成。例如,当一行中发送多个请求时,速度减慢可以通过异步处理数据来解释。如果数据从请求中拉出并放入队列中进行“处理”并立即发送响应,则可能相对较快。如果在返回之前处理队列时需要阻塞后续请求,那可能会导致速度下降。但我只是在猜测这一点。

整个网络的请求速度显然取决于物理距离,跳数等,但数字似乎表明它总体上比应该慢。最可能的原因是代码中的逻辑不正确......但没有更多信息,不容易猜测原因(至少对我而言)。

出于好奇,我只是运行了一些快速测试,通过本地机器上的套接字发送消息,每个请求都是10K(响应数据包要小得多)。平均往返时间仅为0.22毫秒。对于网络上距离服务器两跳的类似测试,平均每次往返1.9毫秒。这是使用TCP/IP。使用UDP到服务器两跳,平均时间为1.7毫秒。

所以你看到的速度看起来很慢(但是我的测试的硬件和网络速度可能与你的设置没有什么共同之处......所以这些数字对你来说只是微乎其微)。

但是,您可以使用ping获得更多的价值,以获得您应该期待花费多长时间的基准。您可以指定ping的数据包大小(-s选项或可能取决于您使用的版本的-l)。Ping同样的两台机器,我运行了另一个测试,证明时代是有道理的。

+0

我正在使用tcp套接字。 ping命令是一个IP级命令。所以来自ping的响应时间可能不代表tcp的响应时间。对? – susan

+0

@susan:时间应该具有代表性。 TCP/IP构建在UDP之上,增加了一些开销,但不是很多。在我上面描述的测试中,我使用了TCP/IP。我现在刚刚使用UDP与服务器跑了两跳,平均时间为1.7ms(而TCP为1.9ms)。所以他们非常相似。 –

+0

谢谢。我很困惑我的代码有什么问题。我使用nio java套接字并在Windows XP上运行。因此,一台机器和两台机器上两个进程之间的巨大差异非常奇怪,可能的原因是什么? – susan

相关问题