RMI表现太慢

时间:2012-02-27 09:44:50

标签: java performance jms cpu rmi

我一直致力于一个项目,该项目涉及从一个数据库到另一个数据库的数据复制。用java6编写。并在分布式机器上工作。我们有9台服务器机器。一个是我的主控制模块工作的主节点,它获取复制请求并将作业分配给其他8台机器。

它开始用JMS编码,以便在之前将任务分配给该8台机器。在另一台计算机上有一台Apache Active MQ服务器。但我发现这不太合适,并且机器需要更紧密地耦合,因为它导致一些代码开销,并且必须为发送到从机的所有消息返回响应消息。我决定改变主节点和其他8台从机之间的互连,并用RMI对其进行编码。

我为从属机器编写了一个RMI服务器,为主节点机器编写了客户端。然后在主节点上创建线程以在从机上触发分布式任务。

事情是性能急剧下降。通常,我能够在大约6分钟内从一个特定的数据库复制大约6GB的数据到另一个数据库。现在复制9GB数据需要超过1个半小时。在从机上执行任务时,它常常消耗大量CPU。我观察CPU使用率超过90%。现在它的使用率从未超过15%。

我需要了解导致性能下降的原因。我该怎么办 ?我应该使用故障排除工具吗?

编辑------------

好的我只在我的笔记本电脑上创建了一个从模块实例,并发送了16个任务来处理它并使用jvisualvm对CPU进行了分析。结果在图片CPU Profiler result中。

当我使用JMS进行机器通信时,包中的控制方法(例如,failTask​​IfAbort(),performSanityCheck()等)也存在。这让我觉得,RMI线程在某种程度上是低优先级的东西。

我还上传了从jvisualvm导出的nps文件。你可以在这里得到它:exported profile result

2 个答案:

答案 0 :(得分:1)

在模块上进行了一些CPU采样并且它似乎在oracle.net.ns.Packet.receive()上花费了大约90%。所以它是关于从db获取数据。这解释了为什么CPU使用率降低了。它等待数据库返回数据。实际上,我很愚蠢没有查询在db端查询性能。我以为我之前复制了这9 GB的数据并取得了良好的效果。问题是访问分区表。它与任务分发的RMI / JMS使用无关。

答案 1 :(得分:0)

来自评论,

我怀疑它与事物无关。看来你的瓶颈是从数据库中获取数据所需的时间。如果要一次下载到8个客户端,则每个客户端可能只获得数据库带宽的1/8。当你只有一个客户端(即CPU利用率更高)时,我会看到它是如何执行的。

顺便说一句:您可能会发现数据受服务器网络适配器的限制,或者它可以从数据库中检索数据的速度。如果是前者,您可以在服务器上使用备用网络适配器来增加带宽。