4

我正在使用Java 的 fork-join 框架来处理 CPU 密集型计算。

我已经稍微调整了“顺序阈值”(用于确定是创建子任务还是完成工作),但令我失望的是,从单线程到 4+4 内核仅使整体性能翻了一番。该池确实报告了 8 个 CPU,当我手动设置 2、3、4、.. 时,我看到性能逐渐提高,但仍然达到单线程吞吐量的两倍左右。此外,该 Java 进程的 Linux 系统活动监视器在 50% 左右徘徊。

另一个非常可疑的事实是,当我启动多个 Java 进程时,集体吞吐量更加一致(几乎比单个线程快 4 倍)并且系统活动监视器显示更高的 CPU 使用率。

是否有可能在 Java、Linux 或 fork/join 框架中存在不允许完全 CPU 使用的限制?有什么建议或类似的经历吗?

注意。这是在具有 4 个内核和 4 个超线程内核的 Intel 3770 CPU 上,在 Linux Mint 机器上运行 Oracle Java 7r13。

4

1 回答 1

1

谢谢大家的想法和回答!根据您的建议,我得出的结论是问题不在于框架本身,并继续进行了一些测试,发现几分钟后 CPU 负载下降到 15% !

事实证明,Random(我广泛使用)在多线程设置中性能很差。解决方案是改用 ThreadLocalRandom.current().nextXXX()。我现在的使用率达到了一致的 80%(仍然有一些连续的段落)。甜的!

再次感谢您让我走上正轨。

于 2013-03-15T11:35:39.457 回答