2 つのプログラムと 3 つの CPU があります。1 つは 2 つのことを行うプログラムです。まず、約 60k のメッセージを JMS キュー (XMLQueue) に送信します。次に、別の JMS キュー (ResultQueue) をリッスンし、返されたデータを抽出して処理します。このプログラムは CPU 1 で実行されます。
2 番目のプログラムはバリデータ プログラムです。XMLQueue からメッセージを受信し、いくつかの検証を行ってから、結果を ResultQueue に送信します。このプログラムは、新しいメッセージを受信するたびに、そのメッセージを別のスレッドで処理します (同時に実行されるスレッドの最大数まで)。最大数が実行されている場合は、新しいメッセージを受信する前に 1 つが終了するのを待ちます。パフォーマンスを向上させるために、このプログラムを 2 つの CPU で実行しようとしています。各 CPU が半分の作業を行う場合、合計処理時間が約 3 時間から 1.5 時間に削減され、3 または 4 で実行するとさらに少なくなるはずです。マシン。
私の問題は、検証プログラムが 1 つの CPU のみで実行される場合、1000 メッセージを処理するのに約 200 秒かかることです。2 番目の 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();
}
}