2011-09-07 33 views
1

我正在使用Java和RMI为了在数百个内核的集群上执行100k Montecarlo仿真。HPC应用程序中的Java RMI随机延迟

我正在使用的方法是有一个客户端应用程序调用RMI进程并在网格上的可用(RMI)进程数量上划分仿真。

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

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

该过程实际上已经到位但是随机地,不时地,其中一个RMI调用需要200ms多执行。

我添加日志和定时加载所有的地方和可能的原因我已经放弃:

1)模拟采取额外的时间 2)数据传输(它不断地工作,只是有时减速被验证,并且只在RMI呼叫的一个子集上) 3)将结果传回(我可以清楚地计时从最后的RMI呼叫返回到过程结束的时间)

我唯一不能测量的是IF任何RMI呼叫都会花费额外的时间进行初始化(并且老实说我是唯一可以设想的)。这样做的原因是,-unfortunately-时钟不同步:(

这是可能的RMI远程进程得到了钝化/分离/收集即使我保持一个(远程)引用它从客户端?

希望这个问题是非常明显的(我非常肯定这是不是)。

感谢密尔,不要犹豫,使更多的问题,如果它不够明确。

问候, Giovanni

回答

0

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

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

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

此外,您的代码是如何构建的:您可以异步发送来自聚合器的所有调用,将响应附加到列表中,并在关键时间结束时汇总结果,即使某些处理器没有“ t返回结果?我假设每个处理器都是一个独立的随机事件,并且忽略一些结果是安全的。如果不是,不理会。

+0

嗨, 感谢您的答复。 寻呼的东西是让我害怕的东西。 无论如何,我并没有使用回调函数,实际上我也不知道“排除GC函数”的含义。我有JVM来打印GC活动。 它的工作方式是创建多个线程,并且每个线程都处理RMI调用。线程和对RMI进程的引用在启动时脱机初始化,并且引用保存在客户机进程中,以使热服务准备好运行。 在这种情况下,回调方法是否有用?无论如何,我会放弃它。 干杯, 吉奥 –

+0

一个更多的信息在这里。基本上,如果我针对一个RMI进程运行1个线程,它总是可以正常工作。一旦我使用更多的RMI进程(这意味着更多的线程**和套接字**),延迟开始出现。如果我打电话给我的本地env(线程和RMI进程在同一硬件上,根本没有延迟,Socket是我的下一个调查区域,是否有线索? –

+0

如果打印出GC活动,是否看到任何关联在GC启动和高延迟调用之间?如果不是,你排除了GC(这就是我的意思)。回调方法的唯一原因是安全地忽略高延迟请求,而不是修复它们。您仍然可以在您所需的时间范围内得到答案,因为您的聚合器可以全天候工作,不会因为这种延迟造成的任何后果而引发争论。因为您将应用程序描述为蒙特卡罗模拟器,所以我提供的是一种可能性(与分支定界相比,正确性要求全部完成) – ccoakley

0

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

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

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

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

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

吉奥

+0

SDP已被弃用,OFED不再支持SDP,因此Java的SDP也失败了。 – RoboAlex