【问题标题】:Thread number and Java application performance线程数和 Java 应用程序性能
【发布时间】:2011-10-07 14:56:58
【问题描述】:

嗨:我有一个多线程 Java 应用程序。当前线程大小已经是 100。我们目前使用的是 4 核 CPU。但正如人们在不久的将来所看到的,CPU 内核将翻倍,甚至达到 32 个内核。为了充分利用内核,我们需要增加我们的线程池大小。但是您可能知道(也许我错了),当有 10000 个线程时,Java 是好的,但是当线程是 200、500、1000 个线程时,可能会出现性能问题。那么我们是否应该使用其他编程语言,例如scala。我的担心合理吗?

【问题讨论】:

  • 由于 Scala 编译为与 Java 相同的字节码,我认为您不会看到任何改进。你会想要切换到像 Erlang 这样的非 JVM 语言。
  • @TMN:最近的一个测试将 Akka (Scala) 与 Erlang 正面交锋,以获得进程内性能。 plus.google.com/u/0/112820434312193778084/posts/HdKFx4VQtJj
  • @Viktor Klang:你看到original benchmark 的后续行动了吗?在调整 Scala 和 Erlang 代码后,Erlang 的速度提高了 6.2 倍。我会查看您发布的文章,应该也有后续文章,应该显示 Scala 的改进。有趣的东西!
  • @TMN:确实很有趣! :-) 但最初的基准测试是 Erlang 与 Scala Actors,而不是 Akka Actors。
  • 在对线程数如何影响 IMO 性能做出任何假设之前,您确实需要测量性能。您可能会感到惊讶,即质疑为什么您认为首先需要更多线程...

标签: java multithreading performance scala


【解决方案1】:

使用现代 JVM,Java 进程可以创建操作系统允许的尽可能多的线程。您的应用程序是否能够充分利用这些线程取决于您的应用程序的设计。

如果关注可伸缩性,我建议您首先关注应用程序的架构(数据结构、同步等)。无论使用哪种编程语言,都需要考虑这些问题,Java 本身并不适合大量多线程的应用程序。

【讨论】:

    【解决方案2】:

    我曾经对线程进行过实验,以了解 Linux 和 Windows 之间是否存在显着差异,并且在两个平台上大约 2000 个线程时遇到了一种障碍。测试有些年头了,我没有重复,后来发现别人提到的同一个号码,但是我没有保存链接。

    如果不对其进行测试,我认为您对 scala 的看法是正确的。那里使用的技术 - Actors - 适用于较小的对象,afaik,但我不能给你数字。

    【讨论】:

      【解决方案3】:

      如果您有 4 个内核,则最佳线程池大小可能是 4,因为这是保持所有 CPU 忙碌所需的最小线程数。但是,您可以拥有最多约 10K 的任意数量的空闲/等待线程。这是 JVM 线程库的临界点,因此切换到 Scala 不会有任何区别。注意:你可以有更多的线程,我不推荐它。

      如果您有 10K 线程并且想要更多,我建议您购买另一台服务器。您可以花 1000 美元左右购买很多服务器。

      我在 Ubuntu 11 上使用 Java 6 更新 26、32 位和 64 位在我的机器上运行了一个测试,创建了大量线程。前 1000 个线程的创建花费了 72 毫秒,从 31K 变为 32K,花费了 3,861毫秒来创建。在大约 32K 线程时,我收到了这个错误

      Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
      at java.lang.Thread.start0(Native Method)
      at java.lang.Thread.start(Thread.java:640)
      

      【讨论】:

        【解决方案4】:

        @user84592:不确定我的答案,只是头脑风暴。 在这台机器上安装虚拟机软件,给它们分配 CPU 内核怎么样,它会制造很多机器而不是一台物理机器,然后你可以将 java 应用程序的工作负载切片到每台机器上......

        【讨论】:

          猜你喜欢
          • 2011-05-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-25
          • 1970-01-01
          • 2017-07-12
          • 1970-01-01
          • 2011-07-09
          • 1970-01-01
          相关资源
          最近更新 更多