设计队列的线程使用者的性能问题

时间:2012-04-27 13:25:40

标签: java connection queue rabbitmq

我真的很喜欢编程并且我的软件存在性能问题。基本上我得到一些数据并在其上运行100循环(i=0;i<100;i++)并且在该循环期间我的程序做出3个决策中的1个,保持数据处理,丢弃它或将其版本发送回队列进行处理。每个线程所做的个别工作非常小,但是有很多(这就是为什么我使用队列服务器进行水平扩展)。

我的问题是它永远不会接近我的整个cpu,我的程序每个核心运行大约40%。在分析之后,似乎大部分时间都是花费从队列发送/接收数据(在com.rabbitmq.client.impl.Frame.readFrom(DataInputStream)com.rabbitmq.client.impl.SocketFrameHandler.readFrame()的部分中大约64%,大约17%是以格式获取数据对于队列(我从之前的40%下来),其余的是花在我的程序逻辑上)。显然,我希望我的工作能够更快地完成,并希望不要在队列中花费这么多时间,我想知道是否有更好的设计我可以使用。

我的代码实际上非常大,但这里概述了它的作用:

  1. 我创建了与队列服务器(rabbitmq和java)的连接
  2. 我分叉尽可能多的线程,因为我有cpu核心(使用相同的连接)
  3. 来自线程的数据是
  4. 每个线程使用共享连接为队列服务器创建自己的通道。
  5. 有一个while循环,用于汇集服务器并获取X个没有确认的消息
  6. 收到消息后,我使用线程执行程序在我的工作正在运行时发送确认
  7. 我解析消息并运行循环
  8. 如果将数据发送回队列,我会将其发送给线程执行程序,然后将其发回,这样我的程序就可以继续处理下一个数据集了。
  9. 我做过的一个奇怪的事情,虽然我使用线程执行器进行确认并发送到队列,但我的主工作线程只是一个分叉线程(使用public void run()),因为我的程序我致力于这个单一的过程,以确保总有X个线程准备工作(并且没有关闭/重新生成它们)。其余的是在线程中,因为我认为其余的可以在我的主程序运行时等待/排队。

    我不确定如何更好地设计它,以便花费更少的时间收集/发送数据。有什么设计,rabbitmq,Java可以用来帮助吗?

1 个答案:

答案 0 :(得分:1)

如果它不是IO等待,那么我怀疑这些方法内部会发生某些锁定。

在我看来,你的线程花费了大量时间等待他们返回。有点违反直觉,你可能会通过减少线程数来提高你的性能,因为他们会花更少的时间绊倒对方,花更多的时间积极做一些事情。

试一试,看看它对个人资料的影响。