7

スレッドとして同じプログラムを複数回実行しているシングルコアマシンで新しいスレッドの作成をいつ停止するかを決定するための最良の方法は何でしょうか。

スレッドはWebコンテンツをフェッチし、少しの処理を行っています。つまり、スレッドが終了するまで、各スレッドの負荷は一定ではありません。

CPU / RAMの負荷を監視し、負荷が特定のしきい値に達した場合はスレッドの作成を停止し、特定のスレッド数に達した場合はスレッドの作成を停止して、CPUが負荷をかけないようにすることを考えています。過負荷になります。

これを達成するためにどのような技術がありますか?

どうもありがとう、ウラジミール

4

2 に答える 2

1

現在のプロセスで使用されているCPUを監視することによってこれを行うことは困難になります。これらの数値は現実に遅れをとる傾向があり、その結果、大部分が山と谷になります。問題は、スレッドがほとんどIOによってブロックされ、バイトが近い将来に読み取れるようになる時期を予測する良い方法がないことです。

とは言うものの、特定の最大スレッド数(単一のプロセッサの場合は4など)から始めて、ThreadPoolExecutor10秒ごとに負荷平均をチェックすることができます。setMaximumPoolSize(...)負荷の平均が必要な値を下回っている場合は、より大きな値で呼び出して、次の10秒間それを増やすことができます。アプリケーションのパフォーマンスをスムーズにするために、各計算の間に30秒以上ポーリングする必要がある場合があります。

次のコードを使用して、すべてのスレッドの合計CPU時間を追跡できます。それが最善の方法かどうかわからない

    long total = 0;
    for (long id : threadMxBean.getAllThreadIds()) {
        long cpuTime = threadMxBean.getThreadCpuTime(id);
        if (cpuTime > 0) {
            total += cpuTime;
        }
    }
    // since is in nano-seconds
    long currentCpuMillis = total / 1000000;

スパイダーのCPUレベルを最大化する代わりに、スループットを最大化することを検討してください。単位時間あたりにスパイダリングされたページ数のサンプルを取得し、これが最大になるまでスレッドの最大数を増減しますExecutorService

考慮すべきことの1つは、NIOとセレクターを使用して、スレッドが常にIOを待機するのではなく、常にビジーになるようにすることです。これは、 NIO/Selectorsに関する優れたチュートリアルの例です。また、NIOの周りにいくつかの優れた機能を提供しているように見えるPyronetの使用を検討することもできます。

于 2013-02-25T19:20:28.847 に答える
1

非同期I/Oが適切でない場合は、ThreadPoolExecutorなどのスレッドプールの使用を検討します。これにより、スレッドの作成、破棄、および再作成のオーバーヘッドが発生しなくなります。

次に、パフォーマンステストを実行して、スレッドの最大数を微調整すると、最高のパフォーマンスが得られます。

10スレッドから始めて、最適な値に磨きをかけるまで20スレッドでパフォーマンステストを再実行できます。同時に、システムツール(OSによって異なります)を使用して、スレッド実行キュー、JVMなどを監視します。

パフォーマンステストでは、テストが再現可能であり(つまり、同じ入力を使用している)、プログラムが使用する実際の入力を表していることを確認する必要があります。

于 2013-02-25T19:21:06.863 に答える