Problem
我有一段java代码(如果相关的话是JDK 1.6.0._22 ),它实现了一个没有互斥锁的无状态、无副作用的函数。然而,它确实使用了大量内存(我不知道这是否相关)。
在过去,我访问过Sun实验室,收集了标准的“性能与线程数”曲线。由于此函数没有互斥锁,因此它有一个很好的图形,尽管垃圾收集是随着线程数量的增加而启动的。经过一些垃圾收集调优之后,我能够使这条曲线变得几乎平坦。
我现在正在英特尔硬件上做同样的实验。硬件有4个CPU,每个CPU有8个内核和超线程。这样就得到了64个availableProcessors()。不幸的是,“性能与线程数”的曲线对于1、2、3个线程都有很好的伸缩性,并且在3个线程上有上限。在3个线程之后,我可以将任意多个线程放到任务中,但性能并没有得到改善
尝试修复问题
我的第一个想法是我太愚蠢了,在某个地方引入了一些同步的代码。通常,要解决此问题,我会运行JConsole或JVisualVM,并查看线程堆栈跟踪。如果我有64个线程以3的速度运行,我预计其中61个线程正在等待进入互斥。我没找到这个。相反,我发现所有的线程都在运行:只是速度非常慢。
另一种想法是,也许时间框架引入了问题。我把我的函数换成了一个使用AtomicLong就能数到十亿的伪函数。这与线程的数量很好地结合在一起: 64个线程比1个线程快了64倍,我可以数到10,000倍。
我想(绝望地开始)也许垃圾收集需要很长的时间,所以我调整了垃圾收集参数。虽然这改善了我的延迟变化,但对吞吐量没有影响:我仍然有64个线程在以我期望的3个线程的速度运行。
我已经下载了英特尔工具VTunes,但我的技能很弱:它是一个复杂的工具,我还不了解它。我已经订购了一本说明书:给自己一份有趣的圣诞礼物,但这对我目前的问题有点为时已晚。
问题
https://stackoverflow.com/questions/13969076
复制相似问题