0

在我们的多线程 java 应用程序中,我们为每个线程使用 LinkedBlockingDeque 单独的实例,假设线程 (c1, c2, .... c200)

线程 T1 和 T2 从套接字接收数据并将对象添加到 c1 到 c200 之间的特定使用者 Q。

run() 内部的无限循环,它调用 LinkedBlockingDeque.take()

在负载运行中,javae.exe 本身的 CPU 使用率为 40%。当我们总结系统中的其他进程时,整体 CPU 使用率达到 90%。

通过使用 JavaVisualVM,run() 占用了更多 CPU,我们怀疑 LinkedBlockingDeque.take()

所以尝试了像 thread.wait 和 notify 和 thread.sleep(0) 这样的替代方案,但没有改变。

每个消费者有单独 Q 的原因有两个,1.可能有多个来自 T1 或 T2 的消费者 c1 的请求 2.如果我们将所有请求转储到单个 q 中,c1 到 c200 的搜索时间会更多并且搜索条件将扩展。3.让消费者有单独的Q来处理他们的请求

试图减少 CPU 使用率并需要您的输入...

标清

4

1 回答 1

0
  1. 进行分析并确保队列方法占用相对较多的 CPU 时间。您的消息处理与放入/取出队列相比如此简单吗?每秒处理多少条消息?有多少个 CPU?如果每个 CPU 每秒处理的消息少于 100K,那么原因可能不是对队列的访问,而是消息处理本身。

  2. 放入 LinkedBlockingDeque 会创建一个辅助对象的实例。而且我怀疑,每条新消息都是从堆中分配的,因此每条消息创建 2 次。尝试使用预先分配的消息池和循环缓冲区。

  3. 200 个线程太多了。这意味着,太多的上下文切换。尝试使用 actor 库和线程池,例如https://github.com/rfqu/df4j(是的,这是我的)。

  4. 检查http://code.google.com/p/disruptor/是否适合您的需求。

于 2012-07-11T08:56:17.903 回答