【问题标题】:Java Random Slowdowns on Mac OSMac OS 上的 Java 随机减速
【发布时间】:2010-12-11 17:37:12
【问题描述】:

我有一个 Java 程序,用于跨多个处理器进行一组科学计算,方法是将其分成几部分并在不同的线程中运行每一部分。这个问题是微不足道的,因此线程之间没有争用或通信。他们访问的唯一常见数据是一些不需要同步访问的共享静态缓存,以及硬盘驱动器上的一些数据文件。线程也不断地写入磁盘,但写入单独的文件。

我的问题是,有时当我运行程序时,我的速度非常快,而有时当我运行完全相同的程序时,它运行得非常慢。如果我看到它运行缓慢并且 ctrl-C 并重新启动它,它通常会再次开始快速运行。它似乎在运行的早期就将自己设置为慢速模式或快速模式,并且从不在模式之间切换。

我已将它连接到 jconsole,它似乎不是内存问题。当我发现它运行缓慢时,我尝试将探查器连接到它,但探查器无法连接。我尝试使用 -Xprof 运行,但慢速运行和快速运行之间的转储似乎并没有太大不同。我也尝试过使用不同的垃圾收集器和不同大小的内存空间。

我的机器是带有条带 RAID 分区的 mac pro。无论是慢还是快,cpu 的使用率都不会下降,如果线程花费太多时间阻塞从磁盘读取,你会预料到,所以我认为这不会是磁盘读取问题。

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

【问题讨论】:

  • 尝试使用“java -server”运行,也许它随机选择不使用JIT?以及如何确保不同的线程在不同的处理器/内核上运行?
  • @Piligrim,如果他使用的是 Mac OS X Snow Leopard,它默认带有 64 位 Java 6,他已经在使用服务器版本。如果 JVM 随机选择不使用 JIT,那就太奇怪了——这不是一个现实的场景……
  • 是的,我一直在使用 -d64,它显然取代了 -server。
  • 我会尝试继续使用分析器选项。连接后,它应该会在测试的几分钟内识别出问题。
  • 我能够复制减速并连接visualvm。当我连接时它运行缓慢,但在连接分析器后不久,它又加速了!以前从未这样做过。我认为它必须以某种方式进入垃圾收集器的退化案例。连接探查器将其从循环中剔除。有人知道这可能是什么吗?我正在使用 16 gigs 的最小和最大堆大小。

标签: java multithreading macos osx-snow-leopard operating-system


【解决方案1】:

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

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

https://visualvm.dev.java.net

您可能必须在问题发生之前进行连接。

【讨论】:

  • 我很确定它不会进入无限循环,因为即使程序运行缓慢,它仍然会完成并给出正确的输出。
  • 但是谢谢你,我会试试visual vm,看看它是否显示任何东西。
  • 我试过查看 visualvm 中的线程,但没有一个是阻塞的。它说它们都运行良好。如果我进行 cpu 分析,结果很奇怪.. 它只会偶尔更新,并且无论程序运行速度快还是慢都会给出无意义的结果。运行 cpu 分析器总是可以将程序退出“慢速模式”。
  • 为了清楚起见,在 visualvm 中加载它会将所有计算线程显示为 100%“绿色”,没有时间花费在睡眠、等待或监视器争用中。此外,垃圾收集器的使用率约为 0%。
【解决方案2】:

我认为您应该使用探查器查看线程视图 - 有多少线程,它们处于什么状态等。这可能是不时发生的奇怪竞争条件。也可能是使用分析器钩子检测类(这会导致减速),对竞争条件进行排序,您将不会看到附加分析器的减速:/

请查看this post,或者更确切地说是答案,其中提到了缓存争用问题。

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

请发布任何结果!

【讨论】:

  • 程序将n维参数空间作为输入,并将其划分为给定数量的恒定块,每个线程一个。在这种情况下,我使用 15 个块,因为我有 16 个逻辑处理器。线程几乎完全独立。它们从同一组数据文件中读取,但每个文件都有自己的通道,并写入单独的数据文件(参数空间中的每个点一个)。唯一的共享内存是一些未初始化的静态常量数组。当其中一个线程尝试查找常量时,它首先检查它是否已经...
  • ... 计算,如果没有,它计算它并将其放入数组中。所以这里多个线程将同时访问数组,但访问不是同步的,对数组的所有修改都是原子的。为了方便起见,我实际上是在一个进程中运行可以在 15 个独立进程中运行的东西。
【解决方案3】:

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

【讨论】:

  • 这很有趣。这可能与新 Nehalem 芯片中的 TurboBoost 相关吗?很奇怪,它变慢了,但仍然在顶部显示相同级别的 cpu 使用率。
  • 虽然如果它由于温带而受到限制,我希望它有时会减慢运行快速的进程,反之亦然。这永远不会发生。进程总是从一开始就卡住要么快要么慢,只有连接visualvm并启动一个cpu配置文件才能让它退出慢速模式。
【解决方案4】:

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

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

另一个可能导致速度变慢的问题是日志文件?我至少知道一些日志代码会随着日志文件的增长而逐渐减慢系统速度。有可能您的线程正在同步一个越来越大的日志文件,然后当您重新启动程序时,会使用另一个日志文件。

【讨论】:

  • 我试图意识到这个问题.. 我的机器有 32G 内存,我将进程限制为使用 16G 最大堆,并且进程通常不会超过 8G。所以它不应该是分页,但下次我重现这个错误时,我会找到一些东西来监控交换的使用情况。
  • 我报告了这个问题,它肯定没有击中页面文件,至少根据 mac os 活动监视器。
猜你喜欢
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 2012-03-22
相关资源
最近更新 更多