【发布时间】:2012-02-27 09:44:50
【问题描述】:
我一直在从事一个关于将数据从一个数据库复制到另一个数据库的项目。用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 进行机器通信时,包中的控制方法(例如 failTaskIfAbort()、performSanityCheck() 等)也存在。这让我觉得,RMI 线程在某种程度上是低优先级的。
我还上传了从 jvisualvm 导出的 nps 文件。你可以在这里得到它:exported profile result
【问题讨论】:
-
如何使用 RMI 复制数据?你在传递物体吗?如果是这样,可能是它的 RMI 序列化是问题所在?
-
jdk中的jvisualvm告诉你什么?
-
所以你说 JMS/RMI 与传输几乎没有关系(我假设处理),但你也说它对性能产生了巨大的影响。 ;) 顺便说一句,即使线程的优先级最低,如果有空闲 CPU,它仍然会以 100% 的速度运行。只有在没有空闲 CPU 并且它必须与更高优先级的线程竞争时,优先级才重要。
-
我怀疑它是无关的。看来您的瓶颈是从数据库中获取数据所需的时间。如果您一次下载到 8 个客户端,则每个客户端可能只能获得 1/8 的数据库带宽。我会看看当你只有一个客户端时它的表现(即 CPU 利用率高得多)
-
我同意 Peter Lawrey 的观点。如果您没有修改复制逻辑,很可能是您的数据库无法处理所有并行传输。
标签: java performance jms cpu rmi