現在のプロセスで使用されているCPUを監視することによってこれを行うことは困難になります。これらの数値は現実に遅れをとる傾向があり、その結果、大部分が山と谷になります。問題は、スレッドがほとんどIOによってブロックされ、バイトが近い将来に読み取れるようになる時期を予測する良い方法がないことです。
とは言うものの、特定の最大スレッド数(単一のプロセッサの場合は4など)から始めて、ThreadPoolExecutor
10秒ごとに負荷平均をチェックすることができます。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の使用を検討することもできます。