4

Tomcat 7 でホストされている Spring 3 を使用して Java Web アプリケーションに取り組んでおり、1 秒あたり 2.5k を超えるリクエストを処理する必要があります。RequestProcesseorこのメソッドですべての HTTP リクエストを処理するクラスがあります。

@Service
public class RequestProcesseor {

    public void processSomething(int value1, int value2) {
        // process something...
        // create and deep copy some object
        // some BigDecimal calculations
        // maybe some webservice calls
    }

}

同時に 2.5k を超えるリクエストがあり、processSomethingメソッドを呼び出します。このクラスをマルチスレッド化した場合。パフォーマンスは向上しますか?はいの場合、なぜですか? そして、どうすればそれを証明できますか?

サーバーには 4 コアの CPU が搭載されています。

4

5 に答える 5

3

パフォーマンスは向上しますか?

多分。1 秒間に 2.5k のリクエストがあります。各リクエストに 1 秒の CPU 時間がかかり、CPU が 1 つしかない場合は、そうではありません。2 つの CPU がある場合は、はい。各リクエストがリモート プールされたネットワーク リソースと通信する場合は、はい。各リクエストが同じネットワーク リソース (つまり、プールされていない) と通信する場合は、いいえ。

要するに、何をしているかについてより多くの情報を提供し、(最も有益なことに) 特定の環境を使用して自分でテストを実行する必要があります。

于 2013-07-05T13:30:16.457 に答える
2

簡単な答え: はい。

リクエストが来るたびに、このメソッドを実行するために 1 つのスレッドのみを使用している場合、次のリクエストは前のリクエストが処理されるまで待たなければならないことを意味します。

リクエストが来るたびに新しいスレッドを作成すると、システムでリソースが利用可能になるとすぐにすべてのリクエストを処理することになります。とにかく終了した後、スレッドはクリーンアップされます。

于 2013-07-05T13:27:51.627 に答える
1

簡単に言えば、自分で測定する必要があります。

より長い答えは次のとおりです。作業をバックグラウンドで単一のスレッドにディスパッチし、HTTP リクエスト プロセッサがそのバックグラウンド スレッドの完了を待機する場合 (他に何をしますか?)、アプリケーションにオーバーヘッドを追加しただけです。

お願いします

  • 何らかの影響があるかどうかを測定する
  • プラスの影響がある場合: 測定した影響を調べて、追加された複雑さがパフォーマンスと保守性を交換する価値があるかどうかを判断します

または、より一般的に:

  • 最適化された保守性でコードを書く
  • アプリケーションが壊れるまでストレステストを行う
  • 予想よりも早く壊れた場合:
    • ボトルネックの特定 (メモリ、CPU、I/O、その他)
    • 特定された問題#1を修正する
    • 手順 2 に進みます
  • おめでとう。アプリケーションは期待どおりの負荷を処理しコードはパフォーマンス要件を満たすために維持できる最適な状態にあります。
于 2013-07-05T19:57:39.267 に答える