我正面临着多核系统的可扩展性问题。我的应用程序是在4个物理核心机器上并行处理科学数据,8个逻辑核心激活超线程。我们启动了8个JVM,每个逻辑核心一个(我们最终可能会切换到一个JVM以避免JVM的开销)
问题在于可扩展性几乎是线性的,最多可达4个内核,但是通过增加4个"逻辑内核",我们几乎不会获得10-20%的性能。
我通过分析应用程序来分析线程行为,我看到没有等待太多的锁或线程。我还检查了pidstat,但我没有看到过多的上下文切换开销。更确切地说,Java进程几乎没有上下文切换。 CPU使用率非常高,几乎达到100%,这似乎也没问题。
我的问题是如何在超过物理内核数量后检测和分析这种不良可扩展性的原因。我可以使用哪些工具和方法来检测争用的位置,我应该在哪里查看,并且可以以某种方式修复它而无需更改应用程序的架构(例如,每台计算机切换到一个JVM)
由于
答案 0 :(得分:0)
请注意,超线程并不会使单核的容量翻倍。事实上,当超线程处于开启状态时,有些任务表现更差。
收益将非常依赖于工作的性质 - 更多的管道停滞将意味着有更多的机会来安排另一个流程来代替停滞的流程。
作为一个例子:完全随机访问内存在超线程性能增益方面比在同一缓存行中的非常快速的CPU密集计算产生更多。
以下是两个硬件线程共享的内容,因此任何会产生限制任何收益的争用:
另一个观察是操作系统必须支持SMT / HT,否则它将无法将任何内容安排到其他内核中或安排错误的任务。
当操作系统支持时,文件句柄或网络套接字等内容仍然存在操作系统争用的可能性。更多' 令人尴尬的可并行化'工作的性质,限制这种争论的机会就越多。但是,如果您的工作涉及读取和/或写入相同的系统资源,您将获得较少的收益。
将所有这些任务放入1个JVM后,您的并行度将是:
int cores = Runtime.getRuntime().availableProcessors();