代码之家  ›  专栏  ›  技术社区  ›  greg

如何检测多核可扩展性/争用问题

  •  0
  • greg  · 技术社区  · 7 年前

    我面临多核系统的可扩展性问题。我的应用程序是在一台4个物理核、8个逻辑核的机器上并行处理科学数据,并激活超线程。我们启动了8个JVM,每个逻辑核一个(我们可能最终会切换到一个JVM,以避免JVM的开销)

    问题是,最多4个核的可扩展性几乎是线性的,但如果再增加4个“逻辑核”,我们几乎无法获得10-20%的性能。

    我通过分析应用程序分析了线程的行为,没有发现锁或线程等待太多。我还检查了pidstat,没有发现过多的上下文切换开销。更准确地说,java进程上几乎没有上下文切换。 CPU使用率超高,几乎达到100%,这似乎也没问题。

    我的问题是,在超过物理核的数量后,如何检测和分析这种糟糕的可扩展性的原因。我可以使用哪些工具和方法来检测争用在哪里,我应该在哪里查看,我可以在不改变应用程序架构的情况下以某种方式修复争用(例如,切换到每台机器一个JVM)

    谢谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   diginoise    7 年前

    请注意,超线程并没有使单核的容量翻倍。事实上,当启用“超线程”时,有些任务的性能会更差。

    收益将很大程度上取决于工作的性质——更多的管道暂停将意味着有更多机会安排另一个进程来代替暂停的进程。

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

    以下是两个硬件线程共享的东西,因此任何线程都会产生限制任何增益的争用:

    • 分支预测资源
    • 执行单元(整数和浮点)

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

    当操作系统支持时,仍然有机会 文件句柄或网络套接字。更多' 令人尴尬的并行化 “工作的性质,限制这种争论的机会就越多。然而,如果您的工作涉及对同一系统资源进行阅读和/或写作,您将获得更少的收益。

    一旦将所有这些任务放入1个JVM中,并行度将达到:

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