2.11 JMXを使用したアプリケーションの管理
この項の内容は、次のとおりです。
2.11.1 JMXの概要
JMX(Java Management Extensions)は、アプリケーション、システム・オブジェクト、デバイス、サービス指向のネットワーク、JVM(Java仮想マシン)を管理および監視するツールを提供するJavaテクノロジです。このAPIを使用すると、そのクラスの動的な作成と変更が可能です。そのため、リソースが作成、インストールおよび実装されると、このテクノロジを使用してリソースを監視および管理できます。また、JMX APIにはリモート・アクセスが含まれているため、リモート管理プログラムはこのような目的で実行中のアプリケーションと対話できます。
JMXでは、特定のリソースは、MBean(マネージドBean)と呼ばれる1つ以上のJavaオブジェクトで構成されます。これらのMBeanは、MBeanサーバーと呼ばれるコアの管理対象オブジェクト・サーバーに登録されます。MBeanサーバーは管理エージェントとして動作し、Javaプログラミング言語を使用できるほとんどのデバイス上で実行できます。JMXエージェントは、MBeanが登録されているMBeanサーバーと、MBeanを処理する一連のサービスで構成されます。
2.11.2 セッションでのJMXの有効化と起動
Javaを実行しているセッションでJMXサービスを有効化および実行するために、JMXSERVER
ロールおよびdbms_java.start_jmx_agent
プロシージャが提供されています。JMXSERVER
ロールには、セッションでMBeanServerとJMXエージェントを起動および実行できる特定のJavaパーミッションが付与されます。プロシージャdbms_java.start_jmx_agent
は、特定のセッションで、セッションの期間内は通常アクティブのままのエージェントを起動します。JMXを有効にして起動するには、次の操作を実行します。
関連トピック
2.11.3 Oracle JVM JMXのデフォルトと構成可能性の設定
dbms_java.start_jmx_agent
をアクティブにする場合、プロパティcom.sun.management.jmxremote
はtrue
に設定されます。start_jmx_agent
を起動する前に、JMXSERVER権限のユーザーは、次の方法で様々な管理プロパティを初期設定できます。
-
PL/SQLファンクション
dbms_java.set_property
を使用します。 -
メソッド
java.lang.System.setProperty
を起動します
JMXSERVER
ロールのユーザーは、Javaプロパティcom.sun.management.config.file
で指定されたデータベース常駐Javaリソースのプロパティも初期設定できます。com.sun.management.config.file
が設定されていない場合、このリソースのデフォルト名はlib.management.management.properties
です。このリソース・メカニズムは、標準のファイルベースのJMX構成管理のOracle JVM拡張機能です。これは、セキュリティの向上とスキーマごとの管理を提供するため、Oracle JVMにとって優れたメカニズムです。リソースがスキーマに存在しない場合、ファイルの読取りはフォールバックとして行われます。com.sun.management.config.file
が設定されていない場合、デフォルトのファイル・パスは$(java.home)/lib/management/management.properties
です。Oracle Database 12cでは、このファイルに次の初期設定が含まれています。
com.sun.management.jmxremote.ssl.need.client.auth = true com.sun.management.jmxremote.authenticate = false
プロパティcom.sun.management.jmxremote.ssl.need.client.auth
とcom.sun.management.jmxremote.ssl
を併用すると、クライアントおよびサーバー証明書を使用する、双方向暗号化SSL認証のJMXが設定されます。com.sun.management.jmxremote.ssl
のデフォルト値はtrue
です。この構成はデフォルトであり、JAASパスワード認証よりも好まれます。
注意:
詳細は、次の場所にアクセスしてください。
注意:
パスワードのファイルベース・ストアを提供するデフォルトのJMXログイン・モジュールは、セキュリティ上の理由からOracle JVMでサポートされていません。そのため、SSLクライアント認証のかわりにJAASパスワード認証を使用する必要がある場合、この項で示すように、一時的なJAAS資格証明をauth
パラメータとしてdbms_java.start_jmx_agent
に安全に渡すか、または安全なカスタムLDAPログイン・モジュールを使用するようにJMXを構成します。
2.11.4 dbms_java.start_jmx_agentへのSQLコールの例
JMXサーバーの起動例を次に示します。
-
前述の項で説明したようなデフォルトの設定、または同じセッションの以前に設定された値を使用してJMXサーバーおよびリスナーを起動します。
call dbms_java.start_jmx_agent();
-
前述の項で説明したようなデフォルトの設定、または同じセッションの以前に設定された値を使用してJMXサーバーおよびリスナーを起動します。
call dbms_java.start_jmx_agent(null, null, null);
-
JMXサーバーおよびリスナーをポート9999で起動します。他のJMX設定は、デフォルト値または同じセッションで以前に設定された値です。
call dbms_java.start_jmx_agent('9999');
-
JMXサーバーおよびリスナーをポート9999で起動します。他のJMX設定は、デフォルト値または同じセッションで以前に設定された値です。
call dbms_java.start_jmx_agent('9999', null, null);
-
JMXサーバーおよびリスナーを起動します。JMX設定は、デフォルト値または同じセッションで以前に設定された値です。JAAS資格証明
monitorRole/1z2x
およびcontrolRole/2p3o
を使用します。call dbms_java.start_jmx_agent(null, null, 'monitorRole/1z2x;controlRole/2p3o');
これらの資格証明は一時的なものです。プロパティ
com.sun.management.jmxremote.authenticate
はtrue
に設定されています。 -
JMXリスナーを、SSLやJAAS認証は使用せず、ポート9999で起動します。開発またはデモンストレーションの場合にのみ使用します。
call dbms_java.start_jmx_agent('9999', 'false', 'false');
関連トピック
2.11.5 JConsoleを使用したOracle JVMの監視および制御
この項では、JConsole(標準のJMXクライアント・ツール)を使用して、Oracle JVMを監視および制御する方法について説明します。JConsoleは、標準のJava JDKの構成要素です。
このセクションのトピックは次のとおりです:
注意:
JConsoleを使用してデータベース内のJavaを監視するには、サーバー側のJavaセッションでJMXエージェントが実行されている必要があります。
関連トピック
2.11.5.1 jconsoleコマンドの使用
JConsoleを起動するにはjconsole
コマンド構文を使用します。JConsoleツールを開始する最も簡単な書式は次のようになります。
jconsole [hostName:portNum]
説明:
-
hostname
は、アプリケーションを実行しているシステムの名前です。 -
portNum
は、JMXリスナーのポート番号です。
次の例では、デフォルトのポート9999を使用してexample.com
という名前のホストに接続します。このモードでは、認証や暗号化は行われません。このモードは、デモやテストの場合のみに適しており、このモードを使用して、次のコマンドで開始するOracle JVMのJMXセッションに接続できます。
call dbms_java.start_jmx_agent(portNum, false, false);
サーバーのデーモン・スレッドが実行中で休止していない場合にのみ、JConsoleからOracle JVMに接続し対話できます。つまり、指定されたポートでJMXサーバーを実行するセッションに、アクティブなJavaコールが存在する必要があります。後続のJavaコール間の時間間隔中にJMXサーバーはその状態と統計情報を保持しますが、JConsoleと通信できません。
関連トピック
2.11.5.2 JConsoleインタフェースの使用について
JConsoleインタフェースは、次のタブで構成されています。
-
「サマリー」タブ
Oracle JVMに関する概要情報と、JMXで監視される値が表示されます。
-
「メモリー」タブ
メモリーの使用量に関する情報が表示されます。
-
「スレッド」タブ
スレッドの使用状況に関する情報が表示されます。
-
「クラス」タブ
クラスのロードに関する情報が表示されます。
-
「MBeans」タブ
MBeanに関する情報が表示されます。
-
「VM」タブ
Oracle JVMに関する情報が表示されます。
注意:
Oracle Database 12cリリース1 (12.1)では、収集されてJConsoleに渡されるデータは、JMXエージェントを実行するOracle JVMセッションに限定されます。このデータには、Oracle JVMで実行している他のセッションの属性は含まれません。OracleRuntime
MBeanは例外で、WholeJVM_ AttributesおよびOracle JVMの操作についての情報を多数提供します。
関連トピック
2.11.5.3 Oracle JVMの概要情報の表示について
JConsoleインタフェースの「Summary」タブを使用して、Oracle JVMの概要情報を表示できます。このタブには、スレッドの使用状況、メモリー使用量、クラスのロード、VMやオペレーティング・システムのその他の仕様に関する主な監視情報が表示されます。
JMXエージェントを実行するOracle JVMセッションとJConsoleとの接続が成功すると、次の図のような「概要」タブが表示されます。
表2-10で、「Overview」タブに表示されるフィールドについて説明します。
表2-10 JConsoleインタフェースの「Overview」タブのフィールドの説明
フィールド | 説明 |
---|---|
稼働時間 |
Oracle JVMセッションの実行時間。 |
プロセスCPU時間 |
Oracle Database 12cリリース1 (12.1)では、Oracle JVMセッションに関するこの情報は収集されません。 |
実行中のスレッド |
有効なデーモン・スレッドと非デーモン・スレッドの現在の数。 |
ピーク |
Oracle JVMの起動以降の有効なスレッドの最大数。 |
デーモン・スレッド |
有効なデーモン・スレッドの現在の数。 |
開始合計 |
Oracle JVMを起動してから開始したスレッドの合計数。デーモン・スレッド、非デーモン・スレッド、終了したスレッドが含まれます。 |
現在のヒープ・サイズ |
現在ヒープで占められているKB数。 |
コミット済メモリー |
ヒープで使用するために割り当てられるメモリーの合計。 |
最大ヒープ・サイズ |
ヒープで占められる最大KB数。 |
ファイナライズを保留中のオブジェクト |
最終段階に向けて保留中のオブジェクトの数。 |
ガベージ・コレクタ情報 |
ガベージ・コレクタに関する情報。名前、実行したコレクションの数、ガベージ・コレクションの実行に費やす合計時間などです。 |
ロード済の現在のクラス |
実行するために、現在メモリーにロードされているクラスの数。 |
ロード済クラス合計 |
セッションを開始してから、セッション・メモリーにロードされたクラスの合計数。 |
アンロード済クラス合計 |
メモリーからアンロードされたクラスの数。Oracle Database 12cリリース1 (12.1)の場合、通常はゼロになります。 |
合計物理メモリー |
Oracle Database 12cリリース1 (12.1)では、Oracle JVMセッションに関するこの情報は収集されません。そのため、表示される値はゼロになります。 |
空き物理メモリー |
Oracle Database 12cリリース1 (12.1)では、Oracle JVMセッションに関するこの情報は収集されません。そのため、表示される値はゼロになります。 |
コミット済仮想メモリー |
Oracle Database 12cリリース1 (12.1)では、Oracle JVMセッションに関するこの情報は収集されません。そのため、表示される値はゼロになります。 |
2.11.5.4 メモリー消費の監視について
JConsoleインタフェースの「Memory」タブを使用して、メモリー使用量を監視できます。このタブには、メモリー使用量とメモリー・プールに関する情報が表示されます。図2-7に「Memory」タブを示します。
「Memory」タブのグラフには、メモリー領域全体だけでなく特定のメモリー・プールに関するOracle JVMのメモリー使用量と時間が示されます。Oracle JVMに使用可能なメモリー・プールは、Oracle JVMの内部組織を反映し、Oracle JVMのメモリー・マネージャのオブジェクト・メモリーに対応しています。このリリースのOracle Databaseで使用可能なメモリー・プールは次のとおりです。
-
New Generation領域
大部分のオブジェクトに対してメモリーが最初に割り当てられるメモリー・プールです。Eden領域とも呼ばれます。
-
Old Generation領域
このメモリー・プールには、Eden領域にガベージ・コレクション・プロセスが残ったオブジェクトが含まれます。Survival領域とも呼ばれます。
-
Malloc/Free領域
このメモリー・プールには、メモリーがmallocで割り当てられ、freeで解放されるオブジェクトが含まれます。
-
End of Migration領域
このメモリー・プールには、セッション終了時の移行を残すオブジェクトが含まれます。
-
Dedicated Session領域
このメモリー・プールは、Oracle Dedicated Sessionsモードでセッション・オブジェクトにメモリーを割り当てる場合に使用します。
-
Paged Session領域
このメモリー・プールは、大きなサイズのセッション・オブジェクトが呼び出される場合、そのオブジェクトへのメモリーの割当てに使用します。
-
Run領域
このメモリー・プールは、一時オブジェクトおよび補助オブジェクトにメモリーを割り当てる場合に使用します。
-
Stack領域
このメモリー・プールは、スタックに似た方式でメモリーの割当てと解放が行われる一時オブジェクトにメモリーを割り当てる場合に使用します。
「Memory」タブの「Details」領域には、次の内容で現在のメモリーのマトリクスが表示されます。
-
使用済
セッションを実行するプロセスで現在使用されているメモリー量を示します。
-
コミット済
メモリーがすでに割り当てられているかのように、Oracle JVMでの使用が保証されたメモリー量を示します。コミットされるメモリーの量は、時間の経過とともに変わります。ただし、コミットされるメモリーは、必ず使用済メモリー以上になります。
-
最大
メモリーの管理に使用できる最大メモリー量を示します。通常は、Oracle JVMの初期構成に対応しています。
「Memory」タブの右下隅にある棒グラフは、各メモリー・プールで消費されたメモリーを示します。使用済のメモリーがメモリー使用量のしきい値を超えると、棒グラフは赤に変わります。メモリー使用量しきい値は、MemoryMXBean
の属性で設定できます。
関連トピック
2.11.5.5 スレッドの使用の監視について
JConsoleインタフェースの「Threads」タブを使用して、スレッドの使用状況を監視できます。
「Threads」タブのグラフには、有効なスレッドの数と時間が表示されます。特定のタイプのスレッドが特定の色で示されています。
-
マゼンタは、スレッドの合計数を表します。
-
赤は、スレッドの最大数を表します。
-
青は、有効なスレッドの数を表します。
このタブのスレッドのリストには、有効なスレッドが表示されます。リストのスレッドを選択すると、そのスレッドに関する情報が右側のペインに表示されます。スレッドの名前、状態、スタック・トレースなどの情報があります。
「Filter」フィールドは、スレッドの絞込みに役立ちます。
2.11.5.6 クラスのロードの監視について
JConsoleインタフェースの「Classes」タブを使用して、クラスのロードを監視できます。このタブのグラフには、ロードされたクラスの数と時間が描画されます。
2.11.5.7 MBeanの監視および管理について
「MBeans」タブを使用して、MBeanを監視および管理できます。このタブには、プラットフォームMBeanサーバーに登録されたすべてのMBeanに関する情報が表示されます。
「MBeans」タブの左ペインのツリーはMBeanツリーと呼ばれ、オブジェクト名に従って体系化されたすべてのMBeanが表示されます。MBeanツリーでMBeanを選択すると、その属性、操作、通知、その他の情報が右側のペインに表示されます。たとえば、図2-10では、左側のMBeanツリーでOld Generation
MemoryPool MBeanを選択しており、Old Generation
MemoryPool MBeanの属性が右側に表示されています。
属性の値は、書込み可能な場合は設定できます。書込み可能な値は青で表示されています。たとえば、図2-10では、属性CollectionUaageThreshold
およびUsageThreshold
が書込み可能です。
属性の値をダブルクリックすると、属性の値と時間を示すグラフも表示されます。たとえば、GCManager
MBeanのCollectionTime
プロパティの値をクリックすると、図2-11のようなグラフが表示されます。
属性をクリックすると、複雑な属性の詳細を表示できます。たとえば、図2-12に示すように、メモリー・プールの属性Usage
およびPeakUsage
の詳細を表示できます。
MBeanの「Operations」タブには管理機能のインタフェースがあります。たとえば、「Perform Garbage Collection」をクリックすると、メモリー・プールまたはメモリー・マネージャに対してガベージ・コレクションを開始できます。Oracle JVMのJMXデモ(javavm/demo/jmx/
)には、Oracle JVMにロードされる追加のカスタムMBeanが複数用意されています。次の例で、DBProps
MbeanのgetProp
操作の結果を示します。
2.11.5.9 OracleRuntime MBean
Oracle Database 11gリリース2(11.2)以降では、dbms_java.start_jmx_agent
プロシージャをコールすると、新規のMBean(OracleRuntime
)がOracle JVMプラットフォームMBeanのリストに追加されます。このMBeanはOracle JVMに固有のものです。
OracleRuntime
MBeanの「Attributes」タブには、oracle.aurora.vm.OracleRuntime
クラスによって操作されるほとんどのパラメータが公開されます。図2-15に、OracleRuntime
MBeanの「Attributes」タブを示します。
黒で表示されるパラメータは読取り専用のため、変更できません。たとえば、JavaPoolSize
、Platform
などです。青の値は読取り/書込みで、値が変更できることを表します。OracleRuntime
MBeanのほとんどの属性は、現在のセッションに対してローカルです。
OracleRuntime
MBeanのWholeJVM_
属性はグローバルです。これらの属性は、パフォーマンス・ビューv$session
およびv$sesstat
からの収集に従って、データベース・インスタンス内のすべてのJava対応セッションにおけるOracle JVMのメモリー使用量統計の合計を反映します。図2-16に、OracleRuntime
MBeanのWholeJVM_
属性を示します。
OracleRuntime
MBeanの「Operations」タブには、oracle.aurora.vm.OracleRuntime
クラスの操作の多くが公開されます。
さらに、図2-17と図2-18に示すように、sessionsRunningJava
操作およびsessionDetailsBySID
操作を使用して、Javaが有効な特定のデータベース・セッションの各メモリー使用量の統計を監視できます。
2.11.5.10 メモリーのしきい値
使用量のしきい値は、メモリー・プールの管理可能な属性です。コレクション使用量のしきい値は、ガベージ・コレクションされた一部のメモリー・プールの管理可能な属性です。プールの対応するしきい値のチェックを有効にするには、各属性を正の値に設定します。しきい値をゼロに設定すると、メモリー・プールのしきい値のチェックが無効になります。デフォルトでは、Oracle JVMのすべてのプールのしきい値のチェックは無効になっています。
使用量のしきい値とコレクション使用量のしきい値は、「MBeans」タブで設定されます。たとえば、左ペインのツリーからメモリー・プール「Old Generation」を選択し、このメモリー・プールの使用量のしきい値を20MBに設定して、コレクションのしきい値を1MBに設定した場合、しばらくすると、図2-19に示すように、しきい値交差イベントの数がカウントに表示されます。
メモリー・プール「Old Generation」のメモリー使用量が20MBを超えると、JConsoleインタフェースのメモリー・プール「Old Generation」を表すグラフの一部が赤に変わります。赤い部分は、使用済メモリーの一部が使用量のしきい値を超えたことを示します。図2-20に示すように、ヒープ・メモリーを表すグラフも赤に変わります。
図2-20 使用済メモリーが使用量のしきい値を超えた場合のJConsoleインタフェースの「Memory」タブ
「図2-20 使用済メモリーが使用量のしきい値を超えた場合のJConsoleインタフェースの「Memory」タブ」の説明
2.11.6 セキュリティに関する重要な注意点
SSLと認証を無効にしてリモート・リスナーを起動すると、一般的なセキュリティのガイドラインに違反するため、攻撃に対してサーバーが脆弱になります。そのため、本番環境ではこのようなモードを常に使用しないことをお薦めします。このモードは、JDKとの互換性や開発に対してサポートされます。Oracle JVMでJMXを本番で使用する場合は、安全なJMX接続を使用する必要があります。
セキュリティ関連のプロパティ値をdbms_java.set_property
、System.setProperty
またはdbms_java.start_jmx_agent
に指定する場合、非エコー・リスナーを使用するか、またはOracle Application Serverなどの安全なアプリケーション層から暗号化されたJDBC接続によってこれらを起動します。パスワードは、クリアテキスト・ファイルで保存しないでください。Oracleウォレットを使用して、証明書を作成および管理します。セキュリティを向上させるには、SSL認証のクライアント証明書を使用します。
2.11.7 JMXの共有サーバーの制限事項
専用モード・サーバーでは、セッションの継続期間中のJMX接続がサポートされています。共有サーバーのJMX接続は、通常は単一のコールに限定されます。この制限は、JMX接続が本質的にスレッドやソケットなどのオペレーティング・システム・リソースに依存していることに主に起因しています。これらのリソースは、共有サーバーのコールの境界を越えて存続することはありません。したがって、単一のコールの存続期間中のみのJMX接続が完全にサポートされています。
注意:
この制限はエージェント接続にのみ影響し、それに登録されているMBeanSrverやMbeansの状態には影響しません。MBeanSrverとMbeansの状態、および特にその統計は、共有サーバーのコールの境界を越えて保持されます。
専用サーバー・モードを使用できない場合でも、次のガイドラインに従って、JMX接続を確立し、共有サーバーを監視できます。
-
JMXの管理アクティビティと監視アクティビティがすべて1つのJavaコールで行われるように計画します。
-
DBMS_JAVA.set_property
ファンクションをコールしてcom.sun.management.jmxremote.port
プロパティを設定したり、DBMS_JAVA.start_jmx_agent
メソッドを使用しないでください(これらのコールによってJMXがアクティブ化され、共有サーバーのコール境界が生成されるためです)。そのかわりに、監視対象のJavaコードから直接oracle.aurora.rdbms.JMXAgent.startOJVMAgent
メソッドをコールして、JMXエージェントを起動してください。com.sun.management.jmxremote.port
プロパティの値をstartOJVMAgent
メソッドに渡す必要があります。com.sun.management.jmxremote.port
プロパティ以外のJMX関連プロパティはJMXエージェントを起動するものでなく、任意の方法を使用して設定できます。
関連トピック