1

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

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

运行模拟后,我必须重新汇总结果。

我唯一的限制是所有这些都必须在 500 毫秒内发生。

该过程实际上是随机的,有时,RMI 调用之一需要多花 200 毫秒才能执行。

我已经在各处添加了大量的日志和时间,这可能是我已经丢弃的原因:

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

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

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

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

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

问候,乔瓦尼

4

2 回答 2

0

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

不太可能,但可能。不应收集 RMI 远程进程(正如RMI 常见问题解答中针对 VM 退出条件所指出的那样)。但是,如果操作系统需要,它可以被分页到磁盘。

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

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

于 2011-09-07T22:08:25.987 回答
0

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

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

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

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

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

于 2011-09-13T15:34:37.330 回答