我有一个Java程序,用于在多个处理器之间进行一系列科学计算,将其分解为多个部分并在不同的线程中运行每个部分。这个问题很容易分区,因此线程之间没有争用或通信。他们访问的唯一常见数据是一些不需要同步访问的共享静态缓存,以及硬盘驱动器上的一些数据文件。线程也在不断写入磁盘,但要分离文件。
我的问题是,有时当我运行程序时,我的速度非常快,有时当我运行完全相同的东西时,它的运行速度非常慢。如果我看到它运行缓慢并且ctrl-C并重新启动它,它通常会再次开始快速运行。它似乎在运行的早期设置为慢速模式或快速模式,并且从不在模式之间切换。
我把它连接到jconsole,它似乎不是一个内存问题。当我抓住它慢慢地运行时,我已经尝试将探查器连接到它,但探查器将无法连接。我尝试使用-Xprof运行但是慢速运行和快速运行之间的转储似乎没有太大的不同。我也尝试过使用不同的垃圾收集器和内存空间各个部分的不同尺寸。
我的机器是带有条带RAID分区的mac pro。无论是缓慢运行还是快速运行,cpu的使用率都不会下降,如果线程在磁盘读取时花费了太多时间,那么你会期望这样,所以我不认为这可能是磁盘读取问题。
我的问题是,我的代码会出现什么类型的问题?或者这可能是操作系统问题?我无法在Windows机器上复制它,但我没有具有类似RAID设置的Windows机器。
答案 0 :(得分:1)
答案 1 :(得分:1)
我说你应该用一个查看线程视图的探查器来做这件事 - 有多少线程,它们处于什么状态等等。这可能是一个奇怪的竞争条件时有发生。也可能是使用分析器钩子(导致减速)对类进行检测,对竞争条件进行排序,并且在附加的分析器中看不到减速:/
请查看this post,或者更确切地说是答案,其中提到了缓存争用问题。
每次都会产生相同数量的线程吗?该数字是否小于或等于平台上可用的线程数?可以相当准确地检查或估计这个数字。
请发布任何结果!
答案 2 :(得分:1)
您是否有测量CPU温度的工具?操作系统可能会限制CPU处理温度问题。
答案 3 :(得分:1)
您的程序有时可能被分页到磁盘吗?在这种情况下,您需要查看整个操作系统的内存使用情况,而不仅仅是您的程序。我从经验中知道,当内存不断被分页到磁盘并返回时,运行时性能会有很大差异。
我对OSX了解不多,但在linux中,“free”命令对此有用。
可能导致这种放缓的另一个问题是日志文件?我至少知道一些日志代码会随着日志文件的增长而逐步减慢系统速度。您的线程可能正在大小增加的日志文件上进行同步,然后当您重新启动程序时,会使用另一个日志文件。