【问题标题】:Why does Java App take less overall CPU when running multiple instances of app instead of one instance?为什么 Java 应用程序在运行多个应用程序实例而不是一个实例时占用更少的整体 CPU?
【发布时间】:2014-02-14 03:28:25
【问题描述】:

我有一个在 Ubuntu 上运行的 Java 应用程序,该应用程序在套接字上侦听传入连接,并创建一个新线程来处理每个连接。应用程序在每个连接上接收传入数据处理数据,并将处理后的数据发送回客户端。很简单。

如果只运行一个应用程序实例和多达 70 个并发线程,该应用程序的 CPU 将运行到 150% 以上......并且无法跟上处理传入的数据。这是在戴尔 24 核系统上运行的。

现在,如果我创建我的应用程序的 3 个实例,并将传入数据拆分到同一台机器上的 3 个实例中,那么同一台机器上的最大整体 cpu 可能仅达到 25%。

问题是为什么应用程序的一个实例使用的 CPU 量是同一台机器上的 3 个实例每个处理三分之一的数据量使用量的 6 倍?

我不是 linux 专家,但谁能推荐一个工具来监控系统资源以尝试找出瓶颈发生在哪里?关于为什么 3 个实例处理与 1 个实例相同数量的数据会使用如此少的整体系统 CPU 的任何线索?

【问题讨论】:

  • 我没用过,但是DTrace 是一个著名的监控系统行为的工具。 linux似乎也有。 github.com/dtrace4linux/linux
  • 70 个线程在 24 核机器上 150% 负载时无响应?你的程序有问题,一些共享资源争用什么的。

标签: java linux multithreading cpu-usage


【解决方案1】:

一般情况下不应如此。也许您读错了 CPU 使用率。试试tophtoppsvmstat 命令看看发生了什么。

我可以想象这种行为的原因之一 - 资源争用。如果您有某种锁定或繁忙循环,它仅在一个实例(最大连接数或最大线程数)上表现出来,那么您的系统可能无法以最佳方式并行处理并等待资源。我建议将 jconsole 之类的东西连接到您的 java 进程,看看发生了什么。

一般建议检查每个 JVM 有多少 线程 可用,以及您是否正确使用它们。也许你没有足够的 内存 分配给 JVM,所以它过于频繁地进行垃圾收集。如果您使用数据库操作,那么也要检查那里的瓶颈。 配置文件并找到它花费最多时间的地方,并比较 1 到 3 个实例在该函数中花费的时间百分比。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    相关资源
    最近更新 更多