2011-10-14 9 views
5


私は、新しいリクエストのためにデータベースをポーリングするサーバープログラムを持っています。このポーリングを1分間隔で実行したいので、Thread.sleep whileループ中にプログラム内の()を呼び出します。
問題は、このプログラムが "スリープ"すると仮定すると、CPU消費量が急激に増加することです(約25〜30%)。
逆に、プログラムが休止状態でなく、要求を処理中である場合、CPU消費量は0.4%に低下します。
オンラインで、thread.sleepに関連するパフォーマンスヒットがあることがわかりましたが、実行可能な代替手段が見つかりませんでした(Thread.waitはオブジェクトに関する通知が必要ですが、私のシナリオでは役に立たないと感じます)Thread.sleepを使用してスレッドがスリープ状態になっているときのCPU消費

>世論調査
- - >新しいレコードが

メインループ(新しい要求がない場合)ここで、何もしないではすべてのことの骨格がCPUの消費量が25%

ときに行われているのですか?
- >スリープ
- > repeat

+0

あなたはどのくらい寝ていますか? 'while'ループの残りの部分は何をしていますか? – EJP

+2

それは変です。記述したように動作し、ここに投稿する小さなプログラムに縮小できますか?少なくとも、スリープループのスケルトンを実際のコードを使って表示してください。 – NPE

+0

実際に寝るコードセクションを入力してください。 –

答えて

6

個々のCPUコアのCPU消費量を確認します。 4つのコアマシンを使用している場合、たぶん1つのスレッドが不正になり、コア(25%)を一度食べてしまいます。これは通常、スレッドがタイトなループにあるときに発生します。

Thread.waitとタイムアウト(実際にはTimerクラスがあります)を使用することができますが、私の賭けは何の違いもありません。 Thread.sleepThread.waitは両方ともスレッドの状態をnot runnableに変更します。あなたのJVM実装などに依存しますが、そのような状況ではスレッドはそのCPUを消費してはなりません。だから私の賭けは、仕事にいくつかのバグがあるということです。

スレッドダンプを取って、スレッドが何をしているのかを確認することもできます。 Linuxの場合はkill -3を、Windowsの場合はjavaコンソールウィンドウでctrl + breakを使用してください。次に、標準出力にダンプされているスレッドダンプを調べます。スレッドが実際に眠っていたのか、何か他のことをしていたのかどうかを確認できます。

3

多くの人が指摘しているように、Thread.sleepはCPU使用率を大幅に低下させる必要があります。
私はそれらが関連していないと思ったので私の元の質問から特定の事実を省いた。
メインスレッドはプロデューサでしたが、消費者であった非同期で実行される別のスレッドがありました。このスレッドの「スリープ」は、適切にトリガーされなかった奇妙な状態の中にあったことが判明しました。そのスレッドのループは決して眠っていませんでした。
睡眠の問題が解消されたら、私は先に進み、問題を実現するためにそれを詳しく分析しました。

関連する問題