2017-10-09 156 views
0

我面临多核系统的可伸缩性问题。我的应用程序在4个物理核心机器上并行处理科学数据,8个逻辑核心启用超线程。我们推出8个JVM,每个逻辑核心一个(我们最终可能会切换到一个JVM,以避免JVM的开销)如何检测多核可伸缩性/争用问题

问题是可扩展性几乎是线性的,最多4个核心,但我们几乎没有增加10-20通过增加4个“逻辑核心”来提高性能。

我通过剖析应用程序来分析线程行为,并且看不到太多的锁或线程。我也检查了pidstat,我没有看到例如过度的上下文切换开销。更确切地说,java进程几乎没有上下文切换。 CPU使用率超高,几乎达到100%,这似乎也没问题。

我的问题是如何在超过物理内核数量后检测并分析这种不良可扩展性的原因。我可以使用哪些工具和方法来检测竞争的位置,我应该在哪里查看并且能够以某种方式修复它,而不会改变应用程序的体系结构(例如,切换到每台计算机的一个JVM)

谢谢

回答

0

请注意,超线程不会使单核的容量翻倍。实际上,当超线程处于开启状态时,有些任务会变得更糟。

收益将取决于工作性质 - 更多的管道摊位将意味着更多机会安排另一个过程来代替停滞的过程。

作为一个例子:完全随机访问内存在超线程性能增益方面比在同一缓存行内进行非常快的cpu密集型计算产生更多。

这里有东西两个硬件线程共享,并且因此任何将产生争用限制任何收益:

  • 缓存
  • 分支预测资源
  • 取指令并解码
  • 执行单元(整数和浮点数)

另一个观察结果是操作系统必须支持SMT/HT,否则它将无法将任何内容安排到其他内核中,或者安排错误的任务。

当受操作系统支持时,在文件句柄或网络套接字等内容上仍有机会操作系统争用。更多的'尴尬平行'工作的性质,更多的机会来限制这种争论。但是,如果您的工作涉及阅读和/或写入相同的系统资源,您将获得较少的收益。

一旦你把所有这些任务为1个JVM,你并行的水平将是:

int cores = Runtime.getRuntime().availableProcessors(); 
+0

感谢您的回答是明确的问题空间。我会看看缓存未命中的情况,并尝试仅使用物理内核来运行一个想法。 – greg