0

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


}
4

2 に答える 2

0

メッセージングは​​、どういうわけか「本質的に」すでに並列です。

したがって、マルチスレッドコードを削除して置き換えてみてください

  • 複数のプログラムインスタンスで、キューで単純なリスナーを使用する。
  • 複数のスレッドを使用する 1 つのプログラムで。ここでも、各スレッドはキューをリッスンします。あなたのアプローチとの違いは、複数のリスナーが前もって存在することです。

どちらのアプローチでも、処理中リスナーでスレッドを管理 (作成/同期) する必要がなくなります。これは、メッセージが到着したときに処理スレッドが既に存在するためです。

于 2013-09-25T10:43:45.180 に答える
0

投稿されたコードに問題はなかったことがわかりました。私が処理していた検証は、データベースへの呼び出しを行っていました。複数のスレッドと複数のマシンが同じデータベースを呼び出すため、パフォーマンスが大幅に低下しました。各マシンで必要なテーブルを事前にキャッシュすることで問題を修正しました。

于 2014-02-09T05:08:35.030 に答える