在我们的多线程java应用程序中,我们为每个线程使用LinkedBlockingDeque单独的实例,假设线程(c1,c2,.... c200)
线程T1& T2从socket&amp ;;接收数据将对象添加到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中转储所有req,c1到c200的搜索时间将更长,搜索条件将延长。 3.让消费者有单独的Q来处理他们的请求
尝试降低CPU使用率并需要输入......
SD
答案 0 :(得分:0)
进行性能分析并确保队列方法占用相对较多的CPU时间。您的邮件处理是否如此简单,以及与放入/收集队列相比? 每秒处理多少条消息?有多少CPU?如果每个CPU每秒处理的消息少于100K,那么原因可能不是对队列的访问,而是消息处理本身。
放入LinkedBlockingDeque会创建一个辅助对象的实例。我怀疑,每个新消息都是从堆中分配的,因此每个消息创建2个。尝试使用预分配消息池和循环缓冲区。
200个线程太多了。这意味着上下文切换太多。尝试使用actor库和线程池,例如https://github.com/rfqu/df4j(是的,它是我的)。
检查http://code.google.com/p/disruptor/是否符合您的需求。