10

スクリプトを作成することを検討しています

  1. 1 分に 1 回 (または 5 分ごとに) 実行する
  2. 本番環境で実行中の JVM に対して jstack を実行する
  3. jstack の出力を解析し、興味のあることを集計する
  4. 別のサーバーに一元化された Cacti インストールによって 24/365 のグラフ作成の結果をエクスポートします

しかし、実行中の JVM で jstack がどれほど高価で侵略的であるかについては、私にはわかりません。実行中の JVM で jstack を実行するとコストがかかりますか? 私は傷ついた世界に身を置いていますか?

4

3 に答える 3

5

私はこの答えがパーティーに遅れていることを知っていますが、jstackの高価な部分は、重要な例外を除いて、一般にスタックトレースを生成しないデバッガーインターフェイスに接続することから来ています(そしてヒープサイズはまったく問題ではありません):

任意のスタックトレースは、安全なポイントでのみ、またはスレッドが待機している間(つまり、Javaスコープ外)に生成できます。スレッドが待機中/Javaスコープ外の場合、スタック要求スレッドは、それ自体でスタックウォークを実行することによってタスクを実行します。ただし、スレッドがロックを保持している間(またはビジーウェイトを実行している間)は、スレッドを「中断」して独自のスタックをウォークしたくない場合があります。安全なポイントを制御する方法がないので、それはリスクを考慮する必要があります。

デバッグインターフェイスへの接続を回避するjstackと比較した別のオプション:Thread.getAllStackTraces()またはThreadMXBeanを使用して、プロセスで実行し、ファイルに保存し、外部ツールを使用してそのファイルをポーリングします。

最後の注意:私はjstackが大好きです、それは本番システムで計り知れません。

于 2012-06-11T20:36:38.253 に答える
3

測定。バリアントの 1 つtime(/usr/bin/time だと思います) には -p オプションがあり、使用されている CPU リソースを確認できます。

ravn:~ ravn$ /usr/bin/time -p echo Hello World
Hello World
real         0.32
user         0.00
sys          0.00
ravn:~ ravn$ 

これは、ユーザー空間で 0.00 秒の CPU 時間を使用し、カーネル空間で 0.00 秒の CPU 時間を使用して、0.32 秒の壁時間がかかったことを意味します。

プログラムを実行しているが何もしていないテスト シナリオを作成し、jstack を接続する場合と使用しない場合を比較してみてください (例: 毎秒)。次に、具体的な数値が得られ、妥当なオーバーヘッドを与えるものを実験して確認できます。

私の推測では、5 分に 1 回は無視できる程度です。

于 2010-09-10T05:49:06.047 に答える
0

スレッドの数とヒープのサイズによっては、jstackはかなり高価になる可能性があります。JStackはトラブルシューティングを目的としており、統計収集用には設計されていません。スタックトレースを解析するよりも、インストルメンテーションで何らかのフォームを使用するか、JMXインターフェースを公開して、必要な情報を直接取得する方がよい場合があります。

于 2010-09-09T18:08:45.987 に答える