質問

複数のプロセッサで科学的計算を行うためのJavaプログラムがあり、それを分割して各スレッドを異なるスレッドで実行します。この問題は簡単に分割できるため、スレッド間の競合や通信はありません。アクセスする一般的なデータは、アクセスを同期させる必要のない共有静的キャッシュと、ハードドライブ上のデータファイルのみです。スレッドもディスクに継続的に書き込みを行っていますが、ファイルを分離しています。

問題は、プログラムを実行すると非常に良い速度が得られることと、まったく同じことを実行すると非常に遅いことです。実行速度が遅く、Ctrl-Cを押して再起動すると、通常は再び高速で実行されます。実行の早い段階でスローモードまたはファストモードに設定されているようで、モードを切り替えることはありません。

jconsoleに接続しましたが、メモリの問題ではないようです。実行速度が遅いことがわかったとき、プロファイラーを接続しようとしましたが、プロファイラーは接続しません。 -Xprofを使用して実行しようとしましたが、スローランとファーストランのダンプはそれほど変わらないようです。また、さまざまなガベージコレクタと、メモリ空間のさまざまな部分のさまざまなサイズを使用してみました。

私のマシンは、ストライプRAIDパーティションを備えたmac proです。 CPUの使用率は、実行速度が遅くても速くても低下することはありません。スレッドがディスクからの読み取りをブロックするのに時間がかかりすぎると予想されるため、ディスク読み取りの問題になるとは思いません。

私の質問は、私のコードでどんな種類の問題がこれを引き起こす可能性があるのですか?それともOSの問題でしょうか? Windowsマシンで複製することはできませんでしたが、同様のRAIDセットアップを持つWindowsマシンはありません。

役に立ちましたか?

解決

無限ループに入ったスレッドがあるかもしれません。

VisualVMで接続して、スレッドモニターを使用してみてください。

https://visualvm.dev.java.net

問題が発生する前に接続する必要がある場合があります。

他のヒント

次に、スレッドビューでプロファイラーを使用して実行する必要があります-スレッドの数、スレッドの状態など。時々、奇妙な競合状態が発生する可能性があります。また、プロファイラーフックを使用してクラスをインスツルメントすると(スローダウンが発生する)、競合状態が整理され、プロファイラーを接続してもスローダウンは発生しません:/

この投稿をご覧くださいキャッシュ競合の問題が言及されている場合は、a>、またはむしろ答え。

毎回同じスレッドを生成していますか?その数は、プラットフォームで使用可能なスレッドの数以下ですか?その数は、かなり正確に確認またはゲスト化できます。

finidngsを投稿してください!

CPU温度を測定するツールはありますか? OSは温度の問題に対処するためにCPUを調整している可能性があります。

プログラムがディスクにページングされている可能性はありますか?この場合、プログラムだけでなく、オペレーティングシステム全体のメモリ使用量を調べる必要があります。経験から、メモリがディスクに連続的にページングされたり戻ったりすると、実行時のパフォーマンスに大きな違いがあることがわかります。

OSXについてはあまり知りませんが、Linuxでは" free"この目的にはコマンドが便利です。

この速度低下を引き起こす可能性のある別の問題はログファイルですか?ログファイルが大きくなるにつれてシステムの速度が徐々に低下する、少なくともいくつかのログコードを知っています。サイズが大きくなっているログファイルでスレッドが同期している可能性があり、その後プログラムを再起動すると別のログファイルが使用されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top