【发布时间】:2017-10-09 14:13:03
【问题描述】:
我在多核系统上面临可扩展性问题。我的应用程序在 4 个物理核心机器上并行处理科学数据,8 个逻辑核心激活了超线程。我们启动了 8 个 JVM,每个逻辑核心一个(我们最终可能会切换到一个 JVM 以避免 JVM 的开销)
问题在于,最多 4 个核心的可扩展性几乎是线性的,但是通过增加 4 个“逻辑核心”,我们几乎无法获得 10-20% 的性能。
我通过分析应用程序来分析线程行为,我没有看到任何锁或等待过多的线程。我还检查了 pidstat 并且我没有看到例如过多的上下文切换开销。更准确地说,Java 进程几乎没有上下文切换。 CPU 使用率非常高,几乎达到 100%,这似乎也还可以。
我的问题是如何在超过物理内核数量后检测和分析这种不良可扩展性的原因。我可以使用哪些工具和方法来检测争用在哪里,我应该在哪里查看,我可以在不改变应用程序架构的情况下以某种方式修复它(例如每台机器切换到一个 JVM)
谢谢
【问题讨论】:
标签: java scalability multicore hyperthreading