HPC应用程序中的Java RMI随机延迟

时间:2011-09-07 21:08:00

标签: java rmi latency slowdown

我正在使用Java和RMI,以便在数百个核心的集群上执行100k Montecarlo模拟。

我正在使用的方法是使用一个客户端应用程序来调用RMI进程,并对网格上可用(RMI)进程的数量进行模拟。

一旦运行模拟,我就必须重新聚合结果。

我唯一的限制是所有这一切都必须在不到500毫秒的时间内完成。

该过程实际上是随机的 BUT ,有时候,其中一个RMI调用需要200ms才能执行。

我已经在整个地方添加了大量的日志和时间,这也是我已经丢弃的原因:

1)模拟需要额外的时间 2)数据传输(它一直有效,有时仅验证减速,并且仅在RMI调用的子集上) 3)传回结果(我可以清楚地计算从上次RMI调用返回到过程结束的时间长度)

我唯一无法衡量的是,任何一个RMI Call都需要额外的时间进行初始化(老实说,这是我唯一能想到的)。原因是 - 不幸的是 - 时钟不同步:(

即使我从客户端保留(远程)对它的引用,RMI远程进程是否可能被钝化/分离/收集?

希望问题很清楚(我非常肯定不是)。

非常感谢,如果不够清楚,请毫不犹豫地提出更多问题。

此致 乔瓦尼

2 个答案:

答案 0 :(得分:0)

  

即使我从客户端保留(远程)对它的引用,RMI远程进程是否可能被钝化/分离/收集?

不太可能,但可能。不应收集RMI远程进程(因为RMI FAQ表示VM退出条件)。但是,如果操作系统需要,它可以被分页到磁盘。

您是否有办法排除GC调用(除了使用JVM TI编写监视器)?

此外,您的代码是否以这样的方式构建:您可以异步发送聚合器中的所有调用,将回复附加到列表中,并在关键时间结束时聚合结果,即使某些处理器没有返回结果?我假设每个处理器都是一个独立的随机事件,忽略一些结果是安全的。如果没有,请不要理会。

答案 1 :(得分:0)

我终于提出了问题。基本上在确保存根没有被释放并且GC没有在场景后面触发之后,我使用wireshark来理解是否存在任何网络问题。

我发现,随机丢失了一个数据包,我们的网络需要TCP 120ms(41次重传)才能正确地重新传输数据。

切换到jdk7,SDP和infiniband时,我们不再遇到此问题了。

所以基本上我的问题的答案是...... PACKET LOST!

谢谢谁回复了帖子,它有助于专注于正确的道路!

吉奥