GlassFishサブスクリプションのPerformance Advisorには以下の項目がある。
- 物理メモリーに関する警告
- メモリリークに関する警告
- CPU使用量の傾向に関する警告
- スループットに関する警告
- GC停止時間に関する警告
- ログエントリに関する警告
それぞれの項目がやっていることがよくわからないけど、結局、「java.lang.management」パッケージでとれる値をとっていると推測できるので、推測になるが自前で作ってみた。
概要
version 0.2.0(2009/03/15 release)の情報。最新はGoogleCodeのソースを読んで・・・。
以下の監視用カスタムMBeanを作った。
- 物理メモリー、スワップメモリー空き領域、CPU時間を監視できるOSMonitor
- スレッド数を監視できるThreadMonitor
- ヒープ、非ヒープメモリを監視できるMemoryMonitor
- GC実行後のメモリ量を監視できるGCMonitor
対するアクションは以下。
- なにもしないDummyAction
- ログを出すLoggingAction
- メールを送信するEmailAction
Loggerはlog4j 1.2.15を使っている。GF_ROOT/libとかにlog4jのjarをおいてもいいんだけど、全体に影響が出るのが嫌だったので、log4jのソースを一緒にコンパイルしてgfmon.jarに含めている。log4jの設定はgfmon.jarをアンパックして、log4j.xmlを修正して、パックしてください。
課題点は以下。
- GCの監視をもうちょっといい方法とかないかな
- GC停止時間ってどうやってとってんだろ?
- スループットの定義は何だ?
- メモリリークの定義は何だ?
- コメントを書いていない
ダウンロード
ダウンロードはこちらから。 名前はgfmonです。
ソースはGoogleCodeにおいてます。
MBean
MBeanごとに監視できる属性がことなるので、自分が監視したい属性を見つけて、管理ルールに登録する。参考は
管理ルールの登録方法。
イベントタイプはmonitorになります。
監視対象の属性がLoggingの場合
定期的に監視している属性の値をとりたかったので、全部のMBeanでLoggingという属性を監視できるようにしている。
この属性を監視対象の属性に設定すると、内部でそのMBeanで監視できる項目すべての値を、ログに出力する。
この属性の戻り値は「success」という文字列なので、監視タイプをString、トリガーをEquals、値をsuccessにすれば、粒度周期で設定した周期でログを出力してくれるようになる。(小細工ですね)
監視する属性にLoggerを選択したときはActionが必要ないと思いますので、何もしないDummyActionを設定すればいい。
ログはこんな感じになる。
2009-03-15 22:59:39,308,INFO,HeapMemoryUsage:17,NonHeapMemoryUsage:30 2009-03-15 22:59:39,323,INFO,CurrentThreadUserTime:0,CurrentThreadCpuTime:0,DaemonThreadCount:53,PeakThreadCount:74,ThreadCount:67 2009-03-15 22:59:40,836,INFO,CopyDuration:19,MarkSweepCompactDuration:768,CopyGCMemoryCutDown:-4,MarkSweepCompactCutDownInPercent:-3 2009-03-15 22:59:43,067,INFO,ProcessCpuTime:165969463900,FreePhysicalMemoryInPercent:35,FreeSwapSpaceSizeInPercent:17,SystemLoadAverage:-1.0
MBeanの登録方法
登録方法はGlassFish v2.1のOS監視用カスタムMBeanを作るを参考に。
登録時に入力する値を以下にまとめておく。
OSMonitor
実装クラス名
com.daipresents.gfmon.OSMonitor
名前
OSMonitor
監視対象のMBean
user:impl-class-name=com.daipresents.gfmon.OSMonitor,name=OSMonitor,server=server
監視対象の属性
Logging
ProcessCpuTime
FreePhysicalMemoryInPercent
FreeSwapSpaceSizeInPercent
SystemLoadAverage
ThreadMonitor
実装クラス名
com.daipresents.gfmon.ThreadMonitor
名前
ThreadMonitor
監視対象のMBean
user:impl-class-name=com.daipresents.gfmon.ThreadMonitor,name=ThreadMonitor,server=server
監視対象の属性
Logging
CurrentThreadUserTime
CurrentThreadCpuTime
DaemonThreadCount
PeakThreadCount
ThreadCount
MemoryMonitor
実装クラス名
com.daipresents.gfmon.MemoryMonitor
名前
MemoryMonitor
監視対象のMBean
user:impl-class-name=com.daipresents.gfmon.MemoryMonitor,name=MemoryMonitor,server=server
監視対象の属性
Logging
HeapMemoryUsageInPercent
NonHeapMemoryUsageInPercent
GCMonitor
実装クラス名
com.daipresents.gfmon.GCMonitor
名前
GCMonitor
監視対象のMBean
user:impl-class-name=com.daipresents.gfmon.GCMonitor,name=GCMonitor,server=server
監視対象の属性
Logging
CopyDuration
MarkSweepCompactDuration
CopyGCMemoryCutDownInPercent
MarkSweepCompactCutDownInPercent
1世代前のGCInfoから解放されたメモリを計算している。計算処理が毎回走るので1時間に一回とかの実行にしたほうがいいかも。
LoggingAction
実装クラス名
com.daipresents.gfmon.action.LoggingAction
名前
LoggingAction
EmailAction
実装クラス名
com.daipresents.gfmon.action.EmailAction
名前
EmailAction
GlassFish Performance Advisor 的なもの、自作しよう、その 2を参考にさせていただきました。すごく感謝。
DummyAction
実装クラス名
com.daipresents.gfmon.action.DummyAction
名前
DummyAction