GlassFish v2.1の監視用カスタムMBean一式を作ってみた

感想おまちしてます!

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