【发布时间】: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