gpt4 book ai didi

java - 设计队列线程消费者的性能问题

转载 作者:行者123 更新时间:2023-11-30 11:45:22 25 4
gpt4 key购买 nike

我真的是编程新手,我的软件有性能问题。基本上我得到一些数据并在其上运行 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 内核就 fork 多少线程(使用相同的连接)
  3. 来自线程的数据是
  4. 每个线程使用共享连接创建自己的到队列服务器的 channel 。
  5. 有一个 while 循环池服务器并获取 X 条没有确认的消息
  6. 收到消息后,我会在作业运行时使用线程执行器发送确认
  7. 我解析消息并运行我的循环
  8. 如果数据被发送回队列,我将它发送给一个线程执行器,线程执行器将它发回,这样我的程序就可以继续处理下一个数据集。

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

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

最佳答案

如果不是 IO 等待,那么我怀疑是因为这些方法内部进行了一些锁定。

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

试一试,看看它对配置文件有什么影响。

关于java - 设计队列线程消费者的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10351486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com