2

我有一个Java程序,用于在多个处理器之间进行一系列科学计算,方法是将其拆分为不同的线程并在其中运行各个部分。这个问题很简单,因此线程之间不存在争用或通信。他们访问的唯一常见数据是一些共享静态缓存,不需要同步访问权限,也可以访问硬盘上的一些数据文件。线程也连续写入磁盘,但分开文件。Java在Mac OS上的随机速度减慢

我的问题是,有时当我运行该程序时,我获得了非常好的速度,有时当我运行完全相同的东西时,它运行得非常缓慢。如果我看到它运行缓慢并按Ctrl-C并重新启动它,它通常会再次开始快速运行。它似乎在运行的早期阶段将其自身设置为低速模式或快速模式,并且从不在模式之间切换。

我已经把它连接到jconsole,它似乎不是一个内存问题。当我发现它运行缓慢时,我尝试连接一个探查器,但探查器无法连接。我试着用-Xprof运行,但慢速运行和快速运行之间的转储似乎没有太大的差别。我也尝试过使用不同的垃圾收集器和内存空间各个部分的不同尺寸。

我的机器是具有条带化RAID分区的mac pro。 CPU的使用率永远不会下降,无论它运行缓慢还是很快,如果线程花费太多时间阻塞从磁盘读取数据,您会期望这种情况,所以我不认为这可能是磁盘读取问题。

我的问题是,我的代码有哪些类型的问题可能导致这种情况?或者这可能是一个操作系统问题?我一直无法在一台机器上复制它,但我没有一台类似RAID设置的Windows机器。

+0

尝试使用“java -server”运行,也许它随机选择不使用JIT?你怎么能确保不同的线程运行在不同的处理器/内核上? – 2009-10-30 20:33:31

+1

@Piligrim,如果他使用默认配备64位Java 6的Mac OS X Snow Leopard,他已经在使用服务器版本。如果JVM会随机选择不使用JIT,这将是非常奇怪的 - 这不是一个现实的场景...... – Jesper 2009-10-30 22:15:46

+0

是的,我一直在使用-d64,显然是代替服务器。 – javajustice 2009-10-30 22:18:12

回答

1

您可能有进入无限循环的线程。

尝试连接VisualVM并使用线程监视器。

https://visualvm.dev.java.net

您可能有问题发生之前进行连接。

+0

林相当肯定它不会进入无限循环,因为即使程序运行缓慢,它仍然完成并给出正确的输出。 – javajustice 2009-10-30 22:19:50

+0

但是,谢谢你,我会尝试视觉虚拟现实,看看它是否显示任何东西。 – javajustice 2009-10-30 22:22:10

+0

我试过看visualvm中的线程,并没有一个被阻止。它说它们都运行良好。如果我做cpu分析,结果很奇怪......它只是零星地更新,并且无论程序运行得很快还是很慢,都会产生无意义的结果。 运行cpu事件探查器确实总是会将程序从“慢速模式”中敲出来。 – javajustice 2009-11-02 20:50:18

1

其次,你应该使用一个探查器来查看线程视图 - 有多少线程,它们处于什么状态等等。这可能是一个奇怪的竞赛状况,偶尔会发生。也有可能是这样的情况,用profiler挂钩(导致放缓)对这些类进行测试,将竞争条件分类出来,并且您将看到没有附加分析器的放缓:/

请看看this post,或者更确切地说,回答,哪里有提到的缓存争用问题。

您是否每次都产生相同的线程数?该数字是否小于或等于您的平台上可用的线程数?这个数字可以用相当准确的检查或推测。

请张贴任何finidng!

+0

该程序将n维参数空间作为输入,并将其分为每个线程一个常量给定数量的块。在这种情况下,我使用了15个块,因为我有16个逻辑处理器。 线程几乎完全独立。他们从同一组数据文件中读取数据,但每个数据文件都有自己的通道,并写出单独的数据文件(参数空间中的每个点都有一个文件)。 唯一的共享内存是一些开始未初始化的常量静态数组。当其中一个线程试图查找该常量时,它首先检查它是否已经... – javajustice 2009-11-02 20:36:34

+0

...计算出来,如果不是,则计算它并将其放入数组中。所以在这里,多个线程将同时访问数组,但访问不同步,并且对数组的所有修改都是原子的。 为了方便起见,我基本上在一个进程中运行了15个独立进程。 – javajustice 2009-11-02 20:39:31

1

您是否有测量CPU温度的工具?操作系统可能会限制CPU来处理温度问题。

+0

这很有趣。在新的Nehalem芯片中可能与TurboBoost的东西有关吗?非常奇怪的是,它的速度放缓,同时仍然在顶部显示相同级别的CPU使用率。 – javajustice 2009-11-02 20:42:02

+0

虽然如果因温和而节流,我认为它有时会减缓运行速度很快的流程,反之亦然。这绝不会发生。这个过程总是从一开始就卡住快或者慢,只有连接visualvm和启动一个cpu配置文件才能将其从慢速模式中解放出来。 – javajustice 2009-11-02 21:28:30

1

有时您的程序有可能被分页到磁盘吗?在这种情况下,您将需要查看整个操作系统的内存使用情况,而不仅仅是您的程序。根据经验我知道,当内存不断分页到磁盘并返回时,运行时性能会有很大差异。

我对OSX了解不多,但在Linux中,“free”命令对此很有用。

另一个可能导致这种放缓的问题是日志文件?我知道至少有一些日志记录代码会随着日志文件的增长而逐渐减慢系统。您的线程可能正在日益扩大的日志文件上进行同步,然后当您重新启动程序时,会使用另一个日志文件。

+0

我试图意识到这个问题..我的机器有32G的内存,我限制了使用16G最大堆的过程,并且过程通常永远不会超过8G。所以它不应该是分页,但下一次我重现错误,我会找到一些东西来监视交换使用情况。 – javajustice 2009-11-02 20:28:33

+0

我解决了这个问题,至少根据mac os活动监视器,它绝对不会触及页面文件。 – javajustice 2009-11-02 21:24:38