我正在使用Java's fork-join framework来处理CPU密集型计算。
我已经调整了“顺序阈值”(用于确定是否创建子任务或执行工作),但令我失望的是,从单线程到4 + 4内核只会使整体性能提高一倍。该池确实报告了8个CPU,当我手动设置2,3,4时,我看到性能逐渐提高,但仍然是整体单线程吞吐量的两倍。此外,Linux系统活动监视器在该Java进程中徘徊在50%左右。
同样非常可疑的是,当我启动多个Java进程时,集体吞吐量更加一致(几乎比单个线程快4倍),而System Activity监视器显示更高的CPU使用率。
Java,Linux或fork / join框架是否存在限制,这会限制CPU的全部使用?有任何建议或类似经历吗?
NB。这是在Intel 3770 CPU上,具有4个内核和4个超线程内核,在Linux Mint盒上运行Oracle Java 7r13。
答案 0 :(得分:1)
感谢大家的想法和答案!根据你的建议,我得出结论,问题不是框架本身,而是进行了一些测试,发现几分钟后cpu负载下降到15%!
事实证明,随机(我广泛使用)在多线程设置中性能很差。解决方案是使用ThreadLocalRandom.current()。nextXXX()代替。我现在达到80%的使用率(仍然有一些连续的段落)。甜!
再次感谢您让我走上正轨。