0

我有 2 个程序和 3 个 CPU。一个是做两件事的程序。首先,它将大约 60k 条消息发送到 JMS 队列 (XMLQueue)。它所做的第二件事是侦听不同的 JMS 队列 (ResultQueue) 并提取返回的数据并对其进行处理。该程序在 CPU 1 上运行。

第二个程序是验证程序。它从 XMLQueue 接收消息,进行一些验证,然后将结果发送到 ResultQueue。每次该程序接收到一条新消息时,它都会在不同的线程中处理该消息(显然最多同时运行的线程数量最多)。如果最大值正在运行,它会在接收新消息之前等待一个人死亡。为了提高性能,我试图在 2 个 CPU 上运行这个程序,计算如果每个 CPU 完成一半的工作,它应该将总处理时间从大约 3 小时减少到 1.5 小时,或者如果我让它在 3 或 4 上运行甚至更少机器。

我的问题是,当验证器程序只在一个 CPU 上时,处理 1000 条消息大约需要 200 秒。当我添加第二个 CPU 时,需要 500 秒!!我认为当我使用更多内存和更多处理器来完成这项工作时,我无法正确理解队列的某些内容。有任何想法吗?

这是完成监听的代码。会话设置为自动确认。

public void listen() {
    if(closed){
        throw new IllegalStateException("cannot listen to a closed connection");
    }
    try{
        boolean listening=true;
        while(listening){
            Message msg = mc.receive();
            System.out.println("Received message " + ++count );
            if (msg instanceof TextMessage){
                TextMessage tmsg = (TextMessage) msg;
                String xml = tmsg.getText();

                DataParser parser = new XmlParser("paths.properties");

                synchronized(tm){
                    while(tm.isFull()){
                        try{

                            tm.wait();

                        }catch(InterruptedException e){
                            e.printStackTrace();
                        }
                    }
                    new Executor(xml, tm,parser,responder);
                    tm.notifyAll();
                }
            }
            else if (msg instanceof ObjectMessage){
                closeConnection();
                closed = true;
                listening=false;
            }
        }
    }catch(Exception e){
        e.printStackTrace();
    }


}
4

2 回答 2

0

消息传递已经以某种方式“本质上”并行。

所以尝试删除你的多线程代码,并替换它

  • 使用多个程序实例,在队列上使用简单的侦听器。
  • 一个程序使用多个线程。每个线程再次监听队列。您的方法的不同之处在于预先有多个听众。

这两种方法都无需在处理期间侦听器中管理(创建/同步)线程,因为在消息到达时处理线程已经存在。

于 2013-09-25T10:43:45.180 回答
0

事实证明,发布的代码没有问题。我正在处理的验证正在调用数据库。由于我有多个线程和多台机器调用同一个数据库,因此性能显着降低。通过在每台机器上预先缓存所需的表来解决问题。

于 2014-02-09T05:08:35.030 回答