我正在使用Java和RMI,以便在数百个核心的集群上执行100k Montecarlo模拟。
我正在使用的方法是使用一个客户端应用程序来调用RMI进程,并对网格上可用(RMI)进程的数量进行模拟。
一旦运行模拟,我就必须重新聚合结果。
我唯一的限制是所有这一切都必须在不到500毫秒的时间内完成。
该过程实际上是随机的 BUT ,有时候,其中一个RMI调用需要200ms才能执行。
我已经在整个地方添加了大量的日志和时间,这也是我已经丢弃的原因:
1)模拟需要额外的时间 2)数据传输(它一直有效,有时仅验证减速,并且仅在RMI调用的子集上) 3)传回结果(我可以清楚地计算从上次RMI调用返回到过程结束的时间长度)
我唯一无法衡量的是,任何一个RMI Call都需要额外的时间进行初始化(老实说,这是我唯一能想到的)。原因是 - 不幸的是 - 时钟不同步:(
即使我从客户端保留(远程)对它的引用,RMI远程进程是否可能被钝化/分离/收集?
希望问题很清楚(我非常肯定不是)。
非常感谢,如果不够清楚,请毫不犹豫地提出更多问题。
此致 乔瓦尼
答案 0 :(得分:0)
即使我从客户端保留(远程)对它的引用,RMI远程进程是否可能被钝化/分离/收集?
不太可能,但可能。不应收集RMI远程进程(因为RMI FAQ表示VM退出条件)。但是,如果操作系统需要,它可以被分页到磁盘。
您是否有办法排除GC调用(除了使用JVM TI编写监视器)?
此外,您的代码是否以这样的方式构建:您可以异步发送聚合器中的所有调用,将回复附加到列表中,并在关键时间结束时聚合结果,即使某些处理器没有返回结果?我假设每个处理器都是一个独立的随机事件,忽略一些结果是安全的。如果没有,请不要理会。 p>
答案 1 :(得分:0)
我终于提出了问题。基本上在确保存根没有被释放并且GC没有在场景后面触发之后,我使用wireshark来理解是否存在任何网络问题。
我发现,随机丢失了一个数据包,我们的网络需要TCP 120ms(41次重传)才能正确地重新传输数据。
切换到jdk7,SDP和infiniband时,我们不再遇到此问题了。
所以基本上我的问题的答案是...... PACKET LOST!
谢谢谁回复了帖子,它有助于专注于正确的道路!
吉奥