2

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

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

我的代码实际上相当大,但这里是它的功能概述:

  1. 我创建到队列服务器的连接(rabbitmq 和 java)
  2. 我分叉尽可能多的线程,因为我有 cpu 核心(使用相同的连接)
  3. 来自线程的数据是
  4. 每个线程使用共享连接创建自己的到队列服务器的通道。
  5. 有一个 while 循环池化服务器并在没有确认的情况下获取 X 条消息
  6. 收到消息后,我使用线程执行器在我的作业运行时发送确认
  7. 我解析消息并运行我的循环
  8. 如果数据被发送回队列,我将它发送给一个线程执行器,该线程执行器将它发送回来,这样我的程序就可以继续处理下一个数据集。

我做了一件奇怪的事情,虽然我使用线程执行器来确认并发送到队列,但我的主工作线程只是一个分叉线程(使用public void run()),因为我的程序专用于这个单一进程,我这样做是为了确保总是有X 准备工作的线程数(并且没有关闭/重生它们)。其余的在线程中,因为我认为其余的可以在我的主程序运行时等待/排队。

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

4

1 回答 1

1

如果不是 IO 等待,那么我怀疑这是由于这些方法内部发生了一些锁定。

在我看来,您的线程正在花费大量时间等待它们返回。有点违反直觉,您很可能可以通过减少线程数量来提高性能,因为它们将花费更少的时间相互绊倒,而有更多的时间积极地做某事。

试一试,看看它对个人资料有什么影响。

于 2012-04-27T14:21:43.810 回答