現在のプロセスによって使用されるCPUを監視することにより、これを行うことは困難になるだろう。それらの数字は現実的に遅れがちで、その結果はピークと谷となるでしょう。問題はスレッドがIOによってブロックされることがほとんどで、近い将来にバイトが読み込めるかどうかを予測する良い方法がないことです。
これは、特定の最大スレッド数(1つのプロセッサでは4とします)でThreadPoolExecutor
で開始してから、10秒間ごとに負荷平均を確認することができます。負荷平均値があなたの望む値よりも低い場合は、setMaximumPoolSize(...)
と大きな値を指定して次の10秒間増やすことができます。アプリケーションのパフォーマンスを円滑にするために、各計算の間に30秒以上ポーリングする必要があります。
次のコードを使用して、すべてのスレッドの合計CPU時間を追跡できます。それは、代わりにあなたのクモのための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;
を行うための最善の方法だかどうかわからない、あなたは、スループットを最大化しようと考えるかもしれません。単位時間あたりのspideredページ数のサンプルを取り、最大化するまでExecutorService
の最大スレッド数を増減します。
考慮すべき点の1つは、常にIOを待つのではなく、スレッドが常にビジーであるように、NIOとセレクタを使用することです。ここにはgood example tutorial about NIO/Selectorsがあります。 Pyronetを使用することも考えられますが、これはNIOの優れた機能を提供するようです。
あなたは正しい道にいると思います。考慮すべきことの1つは、常にIOを待つのではなく、スレッドが常にビジーであるように、NIOとセレクタを使用することです。そうでなければピークと谷を持たずにスループットを最大化するのは難しいでしょう。 – Gray
グレイはそれに私を打つ:) IOをブロックするとRAMを無駄にし、ほとんど何も待っているスレッドのばかげた大量が必要になります。 –
自分でスレッドを作成したくないかもしれません。 'Runnable'や' Callable'タスクのためにスレッドを再利用する 'ExecutorService'を使い、破壊スレッドを作成するオーバーヘッドを減らします。 –