2012-06-02 9 views
6

私はVisualVMでアプリケーションをプロファイリングしていました。VisualVM socket.read

私はMySQLのやりとりについてホットスポットを打ちました。私の最初の考えは、ホットスポットは、私のアプリケーションがIO後に待っていた時間を示していたということでした。しかし、プロファイリングレポートでは、VisualVMには2つの列「時間」と「時間(cpu)」があります。たぶん用語が間違って使用されるかもしれませんが、私は自分の時間(CPU)の列はIO時間を除いていると仮定しました。より多くのデバッグを行った後、私たちは、ホットスポットがMySQLドライバのjava.net.SocketInputStream.read()と他のIOのもの(CPUを必要としないはず)のため、仮定が間違っていてIO時間を表示していると結論付けました。

私の疑問は、なぜvisualvmがSocketInputStream.read()をCPU時間として報告するのでしょうか?

Screnshot

+0

多分、忙しく待っています。ループ内で 'available()'を呼び出す? –

+0

私の間違い申し訳ありません。それはjava.net.SocketInputStream.read()にありました – plcstpierre

答えて

4

ネイティブコールは、スレッドアクティビティを監視している間、常にRUNNABLE状態にあります。これは、JVMがネイティブコールがスリープ状態か実際に何かをしているかどうかを知る手段がないためです。 したがって、RUNNABLE状態で経過した時間は、CPU時間としてカウントされます。

+1

ありがとう!それは私が探していたものです。 – plcstpierre

0

SocketInputStream.read()ブロックの他の側から利用可能なデータがありますまで。したがって、データベースからの応答が遅くなる可能性があります。

+0

私はそれを知っています。それは私の質問ではありません。私の質問はなぜビジュアルVMはCPU使用法としてそれをフラグですか? – plcstpierre

1

This very long threadは、小さな書き込みによって問題が発生する可能性があると主張しています。読んでみる価値はありますが、私はあなたがそれについて何ができるか分かりません。何をすることができますか?あなたは小さいfetch sizeを使用していないことを確認するかもしれません。これはあなたに小さな書き込みを与えることはありませんが、小さな問題は同じ問題につながります。クライアントまたはサーバー用に異なるプラットフォームを試すことがあります。読み込みthis bug内のコメントがあります:

を「私たちは)大幅異なるI/OバッファはSolarisとLinuxの間に充填されますどのように迅速に行動(とReadAheadInputStream.fill(への呼び出しのため、数を見てきましたが、利用可能なものを読み取るので、利用可能なものを超えるものを読み取る必要がなければブロックされません)。

+0

ありがとう、それは洞察力があったが、それは私が探していた答えではなかった:( – plcstpierre

関連する問題