5

私は HTTP 経由で音楽をストリーミングする Java アプリケーションを開発しています。私が直面した問題の 1 つは、アプリがディスクからオーディオ ファイルを読み取ってクライアントに送信しているときに、通常は CPU が 90 ~ 100 で最大になることです。 % (これにより、ユーザーが他のアプリを実行する際に問題が発生する可能性があります)。

この作業を行うスレッドを制御して CPU の使用を減らすことは可能ですか、それとも OS によって制御する必要がありますか? 現在、アプリケーションの負荷を管理するためのテクニックはありますか?

高/低優先度でスレッドを開始できることは知っていますが、このシナリオではこれは私には何の影響もないようです。

(「コンピューターに何かをするように頼んだので、明らかにできる限り速くそれを行うだろう...」を通り過ぎることができません。)

ありがとう!

ロッド。

4

9 に答える 9

6

そのタスク (ディスクからファイルを読み取り、HTTP 経由で送信する) は、特に音楽ストリーミングに必要なビットレートで、大量の CPU を使用するべきではありません(マルチチャンネルの非圧縮 PCM などについて話している場合を除きますが、それでも、I/O バウンドであり、多くの CPU を使用しないようにする必要があります)。

あなたはおそらく非常に非効率的な方法で読み書きを行っています。各バイトを個別に読み書きしますか、それとも何らかのバッファを使用していますか?

于 2009-01-21T08:20:27.017 に答える
2

Thread のメソッドを使用して (必要に応じて Thread.currentThread() を介して) 優先順位を下げることができます。

処理ループ (Thread.sleep()) に遅延を入れることもできます。

それ以外はO/Sにお任せください。プログラムが 100% の CPU を使用でき、他に何も CPU を必要としない場合、アプリは O/S アイドル タスクに CPU を持たせるのではなく、CPU を使用することができます。

ストリーミング データは I/O バウンドであるべきであることも事実であるため、データの読み取りと送信の間に何が行われているかを確認する必要があります。たとえば、バッファリングされていないバイトごとに読み取り/送信していますか?

編集: marr75のコメントに応えて、 CPU リソースを浪費する貧弱で非効率的なコードを書くことを私は絶対に主張していません。むしろ、私が言いたいのは、あなたのコードが合法的に CPU を必要としていて、ユーザーが他のことをしたい場合に適切に動作するように CPU を優先した場合、ペギングを避けるためだけに人為的に結果を遅らせることにまったく意味がないということです。 CPU-これは、ユーザーが最終結果をより長く待たせるという不利益をユーザーに与えるだけであり、おそらくユーザーはできるだけ早くそれを望んでいます。

于 2009-01-21T08:03:19.330 に答える
2

使用しているバッファリングの量を確認します。一度に 1 バイトずつ読み書きすると、大量の CPU を消費します。ただし、たとえば 4 kB のブロックを読み書きする場合は、CPU をまったく使用しないはずです。ネットワークがインターネットの場合、CPU は単一のクライアントの 10% を大きく超えてはなりません。

バッファ サイズの近似値の 1 つは、帯域幅 * 遅延です。たとえば、ユーザーが 500 KB/秒でストリーミングすると予想され、最大 0.1 秒のネットワーク遅延がある場合、バッファ サイズは約 50 KB にする必要があります。

于 2009-01-21T21:40:55.857 に答える
1

次のものが1つ以上ありますか。

  • ソフトウェアRAID
  • 圧縮フォルダー
  • 侵入型ウイルスチェッカー
  • ループバックファイルシステム
于 2009-01-21T20:09:50.347 に答える
0

VisualVMは、JavaアプリケーションにCPU時間が費やされている場所を見つけるのに非常に簡単に使用でき、最新バージョンのJDK(Windowsではjvisualvm.exeという名前)に含まれています。

于 2009-01-21T20:13:18.063 に答える
0

わかりました、アドバイスをありがとう!アプリのストリーミング方法の効率を改善するために調査する必要があるようです(ただし、基本的にディスクからファイルを読み取って書き込みを行うだけなので、これがうまくいくかどうかはわかりません。クライアント...)。

于 2009-01-21T20:04:34.443 に答える
0

上記の情報に加えて、JVMはOSスレッドの使用方法に自由があります。Javaアプリケーションのスレッドは、別のOSスレッドで実行される場合もあれば、そのスレッドを他のスレッドと共有する場合もあります。追加情報については、使用しているJVMのドキュメントを確認してください。

于 2009-01-21T09:14:05.880 に答える