我有 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();
}
}