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



我正在使用Java和RMI,以便在数百个内核的集群上执行100k蒙特卡罗模拟。

我使用的方法是有一个调用RMI进程的客户端应用程序,并根据网格上可用(RMI)进程的数量划分模拟。

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

我唯一的限制是所有这些必须在不到500ms的时间内完成。

进程实际上是在但是随机的,有时,一个RMI调用需要200ms的时间来执行。

我已经在所有地方添加了大量的日志和计时,作为可能的原因,我已经丢弃了:

1)模拟需要额外的时间2)数据传输(它持续工作,只是有时验证减速,并且仅在RMI调用的子集上)3)返回结果(我可以清楚地计时从最后RMI调用返回到过程结束的时间)

我唯一无法测量的是,是否有任何RMI调用需要额外的时间来初始化(老实说,这是我唯一可以假设的事情)。原因是——不幸的是——时钟没有同步:(

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

希望问题足够清楚(我很确定它不是)。

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

问候,乔凡尼

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

不太可能,但有可能。不应该收集RMI远程进程(正如RMI FAQ针对VM退出条件所指出的那样)。但是,如果操作系统需要,可以将其分页到磁盘。

你有办法排除GC调用(除了用JVM TI编写监视器)吗?

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

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

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

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

所以基本上我的问题的答案是…数据包丢失!

感谢回复帖子的人,它帮助我们专注于正确的道路!

Gio

相关内容

  • 没有找到相关文章

最新更新