【问题标题】:What is a good ratio of Java threads to CPUs on Solaris?Solaris 上 Java 线程与 CPU 的良好比率是多少?
【发布时间】:2010-06-30 12:09:51
【问题描述】:

我有一个 Java 应用程序,它有 15 个固定线程池,机器 Solaris 10 SPARC 有 16 个 CPU。添加池大大提高了性能,但我想知道池中是否有太多线程。线程越少性能越好吗?或者 Solaris 在线程调度方面做得很好。

假设池大量使用 15 个 CPU,那么其他应用程序线程由于各种原因需要 CPU,并发垃圾回收就是一个很好的例子。现在,池和其他应用程序线程之间共享五个 CPU。然后 CPU 1 到 7 空闲,Solaris 会将繁忙 CPU 上的线程共享时间转移到空闲 CPU 上吗?

如果没有,是否最好保持池大小更小,以便始终有空闲 CPU 用于其他应用程序线程?使问题更加复杂的是,应用程序中的 CPU 使用率非常零星。

【问题讨论】:

  • @paxdiablo:哦,是的,感谢您的编辑,我一直在摸索“Solaris 10 Spark”是什么……@KaizenSoze:每个 CPU 有多少个内核? @SO 社区:线程到内核的数量与性能分析的相关性是否较低?
  • 感谢伟大的 cmets。我应该在原始问题中添加,不涉及 IO,这是一个非常占用 CPU 的过程。

标签: java multithreading


【解决方案1】:

如果您只执行 CPU 密集型任务(无 IO),N+1 线程(其中 N 是内核数)将为您提供最佳的处理器利用率。
+1,因为您可能会遇到页面错误,因此可以在同步期间因任何原因或一小段等待时间暂停 therad。

对于执行 IO 的线程来说,这并不容易,您必须测试最佳大小。
本书Java concurrency in practice建议将此算法作为起点:

N = number of CPUs
U = target CPU utilization (0 <= U <= 1)
W/C = ration of wait time to cpu time (measured through profiling)

threads = N * U * (1 + W/C)

IBM 在他们的文章 Java theory and practice: Thread pools and work queues 中使用了相同的算法,固定的 U=1。 N+1 事实也可以在 IBM 文章中阅读,以提供这两个论点的来源。

【讨论】:

    【解决方案2】:

    线程数通常比 CPU 多一些,这实际上可以提高整体吞吐量。

    这样做的原因是多个线程可能在 IO 上被阻塞或在任何给定时间休眠。所以多准备几个线程来执行永远不会有什么坏处。

    【讨论】:

    • 附注另一点是,如今线程开销如此之小,除了轻微的缓存一致性影响之外,保持线程计数减少几乎没有真正的优势。
    • 使用线程的主要成本是软件的复杂性,因为突然之间你不得不考虑并发性。
    • @samoz - 是的,但无论您使用的是 2、16 还是 1000 个线程,“思想复杂性”成本大致相同。几乎所有的线程安全问题都是一个简单的二进制问题,它依赖于多个线程。这是一个不寻常的问题,它总是适用于 32 个线程,但会(可能)中断 33 个或更多线程......
    【解决方案3】:

    一般来说,如果您可以在线程和 CPU 之间建立 1 对 1 的映射,您将获得最佳性能。这是假设用户线程与内核线程一对一映射。如果我没记错的话,Solaris 允许多个内核线程以及用户线程,所以在这方面你应该没问题。当多个线程使用同一个 CPU 时,您会遇到瓶颈。

    与往常一样,对于减少线程池大小的问题,最好的建议是:“尝试并对其进行基准测试。” (但我怀疑在这种情况下更多会更好。)

    至于您关于正在运行的其他应用程序的问题,Solaris 将使用 CPU 在您的线程池和其他应用程序之间交替。但是,如果 CPU 空闲,Solaris 会将一些线程移至空闲 CPU。

    编辑:Here 是 Sun 提供的关于 Solaris 和 Java 线程模型如何交互的链接。

    【讨论】:

    • -1:与看到由于线程过多导致的实际性能瓶颈相比,有时执行阻塞 IO 的应用程序更常见,每个 CPU 有超过 1 个线程可以提高性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多