ヘッダーをスキップ

Oracle Application Server パフォーマンス・ガイド
10gリリース3(10.1.3.1.0)

B31836-02
目次
目次
索引
索引

戻る 次へ

B アプリケーションへのDMSのインストルメント

Oracle Dynamic Monitoring Service(DMS)を使用すると、アプリケーション開発者、サポート・アナリスト、システム管理者およびその他のユーザーは、アプリケーション固有のパフォーマンス情報を測定できます。この章ではDMSについて説明し、DMSを使用したOracle Application Server Javaアプリケーションへのインストルメント方法について、サンプルのアプリケーションを使用して示します。


注意

Oracle Application Serverには、組込みメトリックがいくつか用意されています。DMSを使用してアプリケーションのインストルメントを行うと、この組込みメトリックのセットに新しいメトリックが追加されます。 


この章には、次の項が含まれています。

B.1 DMSパフォーマンス・メトリックについて

ダイナミック・モニタリング・サービス(DMS)APIを使用すると、Oracle Application Serverアプリケーションにパフォーマンス・インストルメントを追加できます。実行時、OC4JはDMSメトリックと呼ばれるパフォーマンス情報を収集します。開発者、システム管理者およびサポート・アナリストは、この情報を利用してシステム・パフォーマンスを分析したり、システムの状態を監視できます。

この項には、次の項目が含まれています。

B.1.1 アプリケーションへのDMSメトリックのインストルメント

DMS インストルメントとは、アプリケーション・コードにDMSコールを挿入するときに行う処理のことです。DMS APIを使用することで、アプリケーションのパフォーマンス情報を測定、収集および保存できます。

DMSメトリックを作成する場合、アプリケーション開発者は、イベントが発生するタイミング、重要な時間隔の開始と終了、および事前に処理済の値が変更されるタイミングなどをDMSに通知するDMS APIコールを追加します。実行時、DMSはメトリックをメモリーに格納し、ユーザーがそのメトリックを保存または表示できるようにします。

Oracle Application Serverには、組込みDMSメトリックが含まれています。アプリケーションにDMSコールを追加することで、この組込みメトリックのセットは拡張されます。DMSコールをアプリケーションにインストルメントする場合は、組込みメトリックで使用されているAPIと同じAPIを使用します。また、収集したメトリックを保存して表示するには、組込みメトリックで使用されているものと同じ監視ツールを使用します。

ヒント

「DMSインストルメントのJavaアプリケーションへの追加」 

B.1.2 DMSメトリックの監視

DMSメトリックの監視とは、パフォーマンス・メトリックを取得する処理のことです。アプリケーションの実行時、DMSはメトリックをメモリーに格納します。これにより、ユーザーはコンソールでメトリックを表示したり、Webブラウザを使用してメトリックを表示できます。

Oracle Application Serverには、dmstoolAggreSpyサーブレットなどの、DMSメトリックを表示したり保存するためのランタイム・ツールが用意されています。

例B-1は、dmstoolを使用して出力されるメトリックのセットを示しています。

例B-1    dmstoolを使用したdmsDemoのサンプル・メトリックのセット

 /dmsDemo [type=n/a]
  /dmsDemo/BasicBinomial [type=MathSeries]
   computeSeries.active:        0       threads
   computeSeries.avg:   21.181818181818183      msecs
   computeSeries.completed:     11      ops
   computeSeries.maxActive:     1       threads
   computeSeries.maxTime:       93      msecs
   computeSeries.minTime:       0       msecs
   computeSeries.time:  233     msecs
   lastComputed.value:  184756 
   loops.count: 604     ops

関連項目

付録A「組込みパフォーマンス・ツールを使用した監視」 

B.1.3 DMS用語の説明(NounおよびSensor)

この項では、DMSを使用するために理解する必要がある用語について説明します。図B-1は、この章で説明するデモ・アプリケーションのメトリックと例B-1に示すメトリックに対応する、DMSメトリックのセットの構成を示したものです。

この項には、次の項目が含まれています。

B.1.3.1 DMSメトリック

DMSメトリックは、開発者、システム管理者およびサポート・アナリストが、システム・パフォーマンスを分析したりシステムの状態を監視するために使用するパフォーマンス情報を追跡します。

B.1.3.2 DMS Sensor

DMS Sensorは、パフォーマンス・データを測定します。DMSはSensorによってメトリックのセットを定義および収集します。メトリックには、常にSensorに含まれるものと任意で含まれるものがあります。

B.1.3.2.1 DMS PhaseEvent Sensor

DMS PhaseEvent Sensorは、コード内の特定セクションの開始から終了までにかかる時間を測定します。PhaseEvent Sensorを使用すると、あるメソッドまたはコード・ブロックの処理にかかる時間を追跡することができます。

DMSでは、PhaseEvent Sensorの処理にかかる平均時間、最大時間および最小時間など、PhaseEventに関連するオプションのメトリックを計算できます。

表B-1は、PhaseEvent Sensorで使用可能なメトリックを説明したものです。

表B-1    DMS PhaseEvent Sensorのメトリック 
メトリック  説明 

sensor_name.time 

フェーズsensor_nameの処理にかかった合計時間を示します。

デフォルトのメトリック: timeは、PhaseEvent Sensorのデフォルトのメトリックです。 

sensor_name.completed 

プロセス開始以降、完了したフェーズsensor_nameの回数を示します。

オプションのメトリック 

sensor_name.minTime 

completedの回数分繰り返されたフェーズsensor_nameの中で、最短処理時間を示します。

オプションのメトリック 

sensor_name.maxTime 

completedの回数分繰り返されたフェーズsensor_nameの中で、最長処理時間を示します。

オプションのメトリック 

sensor_name.avg 

フェーズsensor_nameの平均処理時間を、(合計時間)/(フェーズが完了した回数)として計算します。

オプションのメトリック 

sensor_name.active 

DMS統計の収集時、フェーズsensor_name内にあったスレッド数を示します(この値は時間の経過によって異なります)。

オプションのメトリック 

sensor_name.maxActive 

プロセス開始以降、フェーズsensor_nameで処理された同時スレッドの最大数を示します。

オプションのメトリック 

B.1.3.2.2 DMS Event Sensor

DMS Event Sensorは、システム・イベントをカウントします。継続時間の短いシステム・イベントや、継続時間よりも発生ポイントが重要なシステム・イベントを追跡する場合は、DMS Event Sensorを使用します。

表B-2は、Event Sensorに関連するメトリックを説明したものです。

表B-2    DMS Event Sensorのメトリック 
メトリック  説明 

sensor_name.count 

プロセス開始以降、イベントが発生した回数を示します。sensor_nameは、DMSインストルメントAPIで指定されているEvent Sensorの名前です。

デフォルト: countは、Event Sensorのデフォルトのメトリックです。Event Sensorでは、これ以外のメトリックは使用できません。 

B.1.3.2.3 DMS State Sensor

DMS State Sensorには、事前に処理済の値を割り当てます。State Sensorは、Javaプリミティブの値またはJavaオブジェクトのコンテンツを追跡します。integer、double、longおよびobjectなどの型がサポートされています。State Sensorは、システムの状態情報を追跡したり、イベントに関係しないパフォーマンス・メトリックを収集する場合に使用します。たとえば、State Sensorを使用して、キューの長さ、プール・サイズ、バッファ・サイズまたはホスト名などを示すことができます。

表B-3は、State Sensorのメトリックを説明したものです。State Sensorは、デフォルトのメトリックvalueおよびオプションのメトリックをサポートします。minValueおよびmaxValueのオプション・メトリックは、State Sensorが(integer、doubleおよびlongなどの)数値のJavaプリミティブを表す場合にのみ、State Sensorに適用されます。

表B-3    DMS State Sensorのメトリック 
メトリック  説明 

sensor_name.value 

sensor_nameの作成時に割り当てられた型を使用して、sensor_nameのメトリック値を示します。

デフォルト: valueは、Stateのデフォルトのメトリックです。 

sensor_name.count 

sensor_nameが更新された回数を示します。

オプションのメトリック 

sensor_name.minValue 

起動後、sensor_nameに割り当てられた最小値を示します。

オプションのメトリック 

sensor_name.maxValue 

起動後、sensor_nameに割り当てられた最大値を示します。

オプションのメトリック 

B.1.3.3 DMS Noun

DMS Noun(Noun)はパフォーマンス・データを編成します。各Sensorは、関連付けられたメトリックとともに階層構造でNounに付加されます。Nounを使用すると、ファイル・システムのディレクトリ構造と同様の方法で、DMSメトリックを編成できます。たとえば、Nounは、クラス、メソッド、オブジェクト、キュー、接続、アプリケーション、データベースまたはその他のオブジェクトなど、測定の様々な対象を示すことができます。

Nounのタイプには、収集対象となるメトリックのセットを表す名前が使用されます。たとえば、組込みメトリックのNounのタイプoc4j_servletは、各J2EEアプリケーション内の各Webモジュールのサーブレットそれぞれについて収集されるメトリックを表します。またNounのタイプJVMは、サイトで現在実行されている各Javaプロセス(OC4J)に関するメトリックのセットを表します。


注意

付録C「パフォーマンス・メトリック」では、このNounのタイプはメトリック表の名前として示されます。 


Nounのネーミング計画では、階層のルートに「/」を使用し、各NounはルートNounまたは親Nounの下にあるコンテナとして動作します。

関連項目

付録C「パフォーマンス・メトリック」 

B.1.3.4 DMSロールアップNoun

DMSロールアップNounは、集計Nounのセットをリクエストするインストルメントを含めるときに、DMSによって生成されるNounです。ロールアップNounには、指定されたNounタイプの子孫Noun内のSensorのセットからのメトリックが含まれます。ロールアップNounには、サマリー情報も含まれます。

関連項目

「子孫NounのDMSデータのロールアップ」 

B.1.3.5 DMSオブジェクトの関係

この項では、DMSメトリック、SensorおよびNounそれぞれのオブジェクトの関係と属性について説明します。

表B-4は、DMSオブジェクト間の関係を説明したものです。図B-1は、サンプルのメトリックのセットを使用して表B-4に示した関係を図示したものです。

表B-4    DMSオブジェクトの関係と属性 
オブジェクト  含まれる対象  属性 

Noun 

Sensorまたはその他のNoun 

名前、Nounのタイプ、親 

Sensor 

メトリック 

名前、説明、Sensorのタイプ、親

Sensorのタイプには、PhaseEvent、EventおよびStateがあります。 

メトリック 

値 

名前、単位の指定 

B.1.4 DMSネーミング規則

DMSの名前の定義には、特定のガイドラインが適用されます。このガイドラインに従うことにより、DMSメトリック・レポートの参照ユーザーは、アプリケーション全体およびOracle Application Serverコンポーネント全体のメトリックを簡単に理解することができます。


注意

このネーミング規則はガイドラインとして使用してください。各ルールには、例外がある可能性があります。名前は、できるかぎり明確に定義してください。矛盾が存在する場合は、例外を作成する必要があります。 


この項には、次の項目が含まれています。

B.1.4.1 一般的なDMSのネーミング規則

DMSメトリックの名前は、Sensor名、「.」およびメトリックで構成されます。たとえば、computeSeries.timeloops.countおよびlastComputed.valueは有効なDMSメトリックの名前です。

Sensor名は、「.」や派生を含まない単純な文字列です。たとえば、computeSeriesloopsおよびlastComputedなどです。Sensorのフルネームは、そのSensorが関連付けられたNounの名前、区切り文字、Sensor名で構成されます。たとえば、/dmsDemo/BasicBinomial/computeSeries/dmsDemo/BasicBinomial/loopsおよび/dmsDemo/BasicBinomial/lastComputedなどです。

Noun名は、区切り文字を含まない単純な文字列です。たとえば、BasicBinomialはNoun名です。Nounのフルネームは、その親のフルネーム、区切り文字、Noun名で構成されます。たとえば、/dmsDemo/BasicBinomialなどです。

B.1.4.2 一般的なDMSのネーミング規則とキャラクタ・セット

DMSの名前はできるかぎり簡潔にしてください。また、NounやSensorの名前を定義する場合は、可能であれば特殊文字(空白、スラッシュ、ピリオド、括弧、カンマ、制御文字など)を使用しないでください。

表B-5は、DMSにおいて置換される、名前内の特殊文字を示します。

表B-5    置換されるDMSネーミングにおける特殊文字 
文字  DMSにおける置換文字 

スペース「 」またはピリオド「.」 

アンダースコア「_」 

制御文字 

アンダースコア「_」 

「<」 

「(」 

「>」 

「)」 

「&」 

「^」 

「”」(二重引用符) 

「‘」(バッククウォート)。二重引用符がバッククウォートに置き換えられます。 

「’」(一重引用符) 

「‘」(バッククウォート)。一重引用符がバッククウォートに置き換えられます。 


注意

Oracle Application Serverには、組込みメトリックがいくつか含まれています。Oracle Application Serverの組込みメトリックが、このDMSのネーミング規則に常に従っているとは限りません。 


B.1.4.3 NounおよびNounのタイプのネーミング規則

Nounには、特定のエンティティを識別する名前を付けてください。

Nounのタイプには、収集対象となるメトリックのセットを明確に表す名前を使用する必要があります。たとえば、ServletというNounのタイプは、そのNounで、特定のサーブレットに固有のメトリックを収集することを示します。

Nounのタイプの名前は、他のDMSの名前と区別するために大文字で始めてください。同じタイプのすべてのNounは、同じSensorのセットを持ちます。

B.1.4.4 Sensorのネーミング規則

次のリストは、DMS Sensorのネーミング規則の概要を示します。

  1. Sensorの名前は、簡潔で説明的なものにしてください。冗長にならないように、Sensorの名前には、Nounの名前の一部やタイプを含めないようにします。

  2. またSensorの名前には、各メトリックの単位の指定を含めないでください。

  3. Sensorを説明するために複数の単語を組み合せる必要がある場合は、最初の単語は小文字で、続く単語は大文字で始めます。たとえば、computeSeriesのようになります。

  4. 一般的にSensor名で、「/」を使用することは避けることをお薦めします。ただし、名前に「/」を使用することが道理にかなっている場合があります。NounまたはSensor名に「/」を使用した場合、DMSメソッドの文字列でSensorを使用するとき、区切り文字として、パスにまったく存在しない「,」または「_」などを「/」のかわりに使用する必要があります。これによって、「/」は区切り文字ではなく、NounまたはSensor名の一部であることが正しく認識されるようになります。

    たとえば、次のような名前の子Nounがあるとします。

    examples/jsp/num/numguess.jsp
    
    

    そして次の文字列を使用し検索することができます。

    ,oc4j,default,WEBs,defaultWebApp,JSPs,example/jsp/num/numguess.jsp,service
    
    

    ここで、区切り文字は「,」です。

  5. Event SensorやPhaseEvent Sensorの名前は、英単語を動詞+名詞という形式で組み合せて定義します。たとえば、activateInstancerunMethodのようになります。PhaseEventによって、関数、メソッドまたはコード・ブロックを監視する場合は、実行されるタスクを可能なかぎり明確に反映した名前を使用します。

  6. State Sensorの名前には名詞を使用します。場合によっては、このStateで追跡した値の内容を説明する形容詞が前に付きます。たとえば、lastComputed、totalMemoryportavailableThreads、activeInstancesのようになります。

  7. 混乱を避けるため、Sensorの名前として、「.time」、「.value」または「.avg」を使用しないでください。理由は、表B-1表B-2表B-3で示しているとおり、これらがSensorのデフォルトまたはオプションのメトリックだからです。

B.2 DMSインストルメントのJavaアプリケーションへの追加

Javaアプリケーションのパフォーマンス情報を収集するには、DMSインストルメントを既存のアプリケーションに追加するか、DMSインストルメントを含む新しいアプリケーションを作成します。

この章に示すDMSのサンプルは、次のOracle Technology NetworkのWebサイトから入手できます。

http://www.oracle.com/technology/tech/java/oc4j/demos/index.html

DMSのdemo.zipファイルには、すぐにデプロイ可能な.earファイルと、ビルド手順付きのソース・コードが含まれています。このデモには、BasicBinomial.javaおよびImprovedBinomial.javaの2つのサーブレットが含まれています。

BasicBinomialサーブレットは、DMS APIを使用してDMS Sensorを追加する方法を示します。

ImprovedBinomialサーブレットはBasicBinomialサーブレットを拡張したもので、改善されたコードをBasicBinomialと比較して示します。ImprovedBinomialサーブレットは、さらに詳細な情報を収集するための、より負荷のかかるメトリックの追加方法についても示しています。

この章に示す例の完全なコードは、サンプル・コードを参照してください。

DMSインストルメントを使用するには、次の手順を実行してDMSコールを追加します。

B.2.1 DMS importのインクルード

DMSを使用するには、DMS importを追加する必要があります。次の例は、サンプル・アプリケーションBasicBinomial.javaで必要なimportを示しています。

import oracle.dms.instrument.DMSConsole;
import oracle.dms.instrument.Event;
import oracle.dms.instrument.Noun;
import oracle.dms.instrument.PhaseEvent;
import oracle.dms.instrument.State;
import oracle.dms.instrument.Sensor;  

B.2.2 パフォーマンス・データの編成

Sensorおよび各Sensorに関連付けるメトリックを編成するには、最初にDMS Nounを定義します。DMS Nounでは、ファイル・システムのディレクトリ構造と同様に、最上位のルートNounの下にツリー階層でSensorが編成されます。

例B-2は、BasicBinomial.javaNoun.create()を使用するコードのセクションを示したものです。

例B-2MathSeriesは、このNounのタイプを示します。Nounのタイプには、収集対象となるメトリックのセットを表す名前を使用します。たとえば、MathSeriesは、二項級数の計算を含むサンプル・アプリケーションについてメトリックを収集することを示します。AggreSpyでは、同じNounタイプのSensorが一緒に表示されます。

Sensorを直接含むNounのNounタイプのみを使用するようにしてください。 Noun dmsDemoのように、Nounのみ含まれてSensorが直接含まれないNounのNounタイプは、AggreSpyでは、メトリックを含まないメトリック表として表示されます。例B-2は、Noun BasicBinomialを1つ含んでSensorは含まないdmsDemo Nounを示しています。このNounに対してNounタイプが指定されない場合、AggreSpyでは、このNounに関連付けられたメトリック表が表示されません。


注意

Nounのタイプの名前は、他のDMSの名前と区別するために大文字で始めてください。 


例B-2    Noun.createを使用したSensorの編成

private Noun binRoot;       // Container for Binomial series DMS metrics.
Noun base = Noun.create("/dmsDemo");
binRoot = Noun.create(base, "BasicBinomial", "MathSeries");

関連項目

「DMSネーミング規則」 

B.2.2.1 Nounのタイプの選択

通常、Nounのタイプは、その祖先Nounまたは子孫Nounとは異なるものにする必要があります。一般的に、これのコード化は容易で、さらには同じタイプのNounが同じレベルにある論理階層を実現します。たとえば、dmsDemoアプリケーションには、BasicBinomialサーブレットと、それを拡張した2番目のサーブレットのImprovedBinomialがあります。この場合、インストルメントでは、両方に対してMathSeriesタイプのNounを使用します。このNounは、両方のサーブレットにとって同じ階層レベルとなる/dmsDemoの下に作成されます。この規則を順守することで、生成されるメトリック表の理解がより容易になります。また、レポート処理時の情報の漏れが最小になります。

B.2.3 タイミングを計測するメトリックの定義と使用

コードのセグメントの期間を測定するメトリックを作成するには、次の手順で、PhaseEvent Sensorを定義および使用します。

B.2.3.1 PhaseEvent Sensorの定義

例B-3は、computeSeriesというPhaseEvent Sensorを宣言して作成するDMSコールを示しています。このコードは、/dmsDemo/BasicBinomial/computeSeries.timeという名前のDMSメトリックを定義します。

PhaseEvent Sensorは、デフォルトのメトリック.timePhaseEvent start()コールからPhaseEvent stop()コールまでの合計時間を示す)とともに、オプションのメトリックのセットをサポートします。 PhaseEvent Sensorのオプションのメトリックは、個別に、あるいは完全なメトリックのセットとして得ることができます。表B-1は、PhaseEvent Sensorで使用可能なメトリックを示しています。例B-3 binComp.deriveMetric(Sensor.all)コールによって、サポートされるすべてのオプションのメトリックが計算されレポートされるようになります。


注意

オプションのメトリックを追加する場合は、メソッドderiveMetric(Sensor.all)を使用することをお薦めします。Sensor.allとともにこのメソッドを使用すればすべてのメトリックを追加できます。オプションのメトリックの一覧は、今後リリースされるOracle Application Serverで変更される可能性があるので、これはよい方法です。また、このメトリックは、計算が効率的で、パフォーマンスの評価に役立ちます。 


例B-3    PhaseEvent Sensorの定義

private PhaseEvent binComp; // Time to compute Binomial series. 
.
.
.  
binComp = PhaseEvent.create(binRoot, "computeSeries",  
                                     "Time to compute a Binomial series");
binComp.deriveMetric(Sensor.all);

B.2.3.2 PhaseEvent Sensorの使用

PhaseEvent Sensorを使用するには、アプリケーションで、start()メソッドをコールしてフェーズの開始を示し、続いてstop()メソッドをコールしてフェーズの完了を示します。

例B-4は、start()メソッドおよびstop()メソッドを使用してdmsDemo/BasicBinomial/computeSeries.timeメトリックを計測する、BasicBinomial.javaのコードのセグメントを示しています。PhaseEvent start()メソッドから返されるtokenという名前のlong値は、対応するPhaseEvent stop()メソッドに渡す必要があります。この値は、開始時刻を表すタイム・スタンプです。この値をstop()メソッドに渡すことにより、DMSでPhaseEventの継続時間を計算できます。


注意

PhaseEventが停止したことを確認するには、例B-4に示すように、各PhaseEvent start()メソッドを測定コードとともにtryブロックに置き、対応するfinallyブロックにPhaseEvent stop()メソッドを置く必要があります。 


例B-4    PhaseEvent Sensorでのstart()およびstop()の使用

long token = 0; // DMS
try {
    token = binComp.start(); // DMS
    BigInteger bins[] = bin(length);
    out.println("<H2>Binomial series for " +  length + "</H2>");
    for (int i = 0; i < length; i++)
        out.println("<br>" + bins[i]);
    }
    finally {
        binComp.stop(token); // DMS
        out.close();
    }

例B-4は、Phaseが始まるたびに停止される、インストルメントされたコードを示します(finally句にstopメソッドがあるため)。これはPhase Sensorの暴走を防止します。ただし、これによって、例外をスローする時間が必要となり、Phase統計に影響する場合があります。例外処理がPhaseEventに影響を与えるのを避けるには、例B-5に示すように、abort()メソッドを使用します。

例B-5は、停止されないPhaseは中断されるサンプル・コードを示します。中断のコールが、該当のstartと対応する統計を削除します。そしてこれらの統計は、メトリックの計算に影響しません。

例B-5    PhaseEvent Sensorでのabort()の使用

PhaseEvent pe = heavyPhase(param);
    long token1 = 0;
    long token2 = 0;
    boolean stopped = false;
    try {
      token1 = binComp.start(); 
      if (pe != null) token2 = pe.start();
      BigInteger bins[] = bin(length);
      out.println("<H2>ImprovedBinomial series for " +  length + "</H2>"); 
      for (int i = 0; i < length; i++)
        out.println("<br>" + bins[i]);
      if (pe != null) pe.stop(token2);
      binComp.stop(token1);
      stopped = true;
    }
    finally {
      if (!stopped) {
        if (pe != null) pe.abort(token2);
        binComp.abort(token1); 
      }

B.2.4 カウントを計測するメトリックの定義と使用

イベントの発生をカウントするメトリックを作成するには、Event Sensorを次のように定義して使用します。

B.2.4.1 Event Sensorの定義

例B-6は、Event Sensorを定義するDMSコールを示しています。このコードは、カウンタを割り当て、/dmsDemo/BasicBinomial/loops.countという名前のDMSメトリックを定義します。

例B-6    Event Sensorの定義

private Event binLoop;   // Loops needed for Binomial series.
.
.
.
   
binLoop = Event.create(binRoot, "loops", "Iterations to compute series");

B.2.4.2 Event Sensorの使用

アプリケーションでEvent Sensorのoccurred()メソッドがコールされるたびに、DMSはカウンタを増加させます。例B-7は、/dmsDemo/BasicBinomial/loops.countメトリックを増加する、Event Sensorのoccurred()コールを示しています。

例B-7    Event Sensorでのoccurred()の使用

binLoop.occurred();

B.2.5 状態情報を記録するメトリックの定義と使用(State Sensor)

DMSは、State Sensorを使用して状態情報を取得します。State Sensorは、Javaプリミティブの値またはJavaオブジェクトのコンテンツを追跡します。create()メソッドの3番目の引数として指定しているように、integer、double、longおよびobjectなどの型がサポートされています。JavaプリミティブのState Sensorが不正な型で更新された場合、DMSは指定された値を正しい型に変換しようとします。オブジェクト型のState Sensorの場合、DMSはオブジェクトへの参照を格納し、DMS値をサンプリングする際に、そのオブジェクトに対してtoString()をコールします。

状態情報を記録するメトリックを作成するには、State Sensorを次のように定義して使用します。

B.2.5.1 State Sensorの定義

State Sensorは、デフォルトのメトリックvalueおよびオプションのメトリックをサポートします。 minValueおよびmaxValueのオプション・メトリックは、State Sensorに対し、State Sensorが(integer、double、およびlongなどの)数値のJavaプリミティブを表す場合にのみ定義できます。表B-3は、State Sensorで使用可能なメトリックを示しています。例B-3は、オプションのメトリックを有効にする方法を示しています。

例B-8は、State Sensorを宣言して作成するDMSコールを示しています。このコードは、/dmsDemo/BasicBinomial/lastComputed.valueという名前のDMSメトリックを定義します。

例B-8    State Sensorの定義

private State binLast;   // Value of the last computed element in series.
.
.
.
binLast = State.create(binRoot, "lastComputed", State.OBJECT, "", 
                           "Value of last computed series element");

State Sensorを定義するとき、State Sensorに単位が関連付けられていない場合、create()メソッドの4番目の引数に空の文字列を使用します。または、適切な単位の文字列を使用します(例B-8を参照)。State Sensorは、初期値なしで作成されます。State Sensorが初期化されたかどうかを確認したい場合は、isInitialized()メソッドを使用します。

オブジェクトへの参照ではなく、オブジェクトの文字列の値をState Sensorが格納するようにするには、値をTRUEとし、setCopy()メソッドを使用します。これによって、State Sensorは、メトリック値としてオブジェクトへの参照を使用するのではなく、toString()をコールした結果をオブジェクトに格納します。

B.2.5.2 State Sensorの使用

アプリケーションでState Sensorのupdate()メソッドがコールされると、DMSはState Sensorの値を更新します。例B-9は、/dmsDemo/BasicBinomial/lastComputed.valueメトリックを更新する、State Sensorのupdate()コールを示しています。

例B-9    State Sensorでのupdate()の使用

binLast.update(bins[k-1].toString());

B.3 DMSメトリックを使用したアプリケーションの検証とテスト

Javaアプリケーションに追加するメトリックは、その精度をテストして検証する必要があります。

この項には、次の項目が含まれています。

B.3.1 DMSメトリックの検証

新しいメトリックを検証してテストするには、dmstoolおよびその他の使用可能なDMS監視ツールを使用します。

新しいメトリックについて、次のことを検証してください。

B.3.2 DMSメトリックの効率性のテスト

DMSメトリックの使用は、アプリケーションのパフォーマンスに少なからず影響を与えます。メトリックを追加する場合は、次のことに注意してください。

B.4 DMSのセキュリティの考慮事項

DMSメトリックは、DMSレポートへのユーザー・ベースのアクセスをサポートしません。DMSメトリックを定義して使用する場合、DMSメトリックにアクセスできる管理者であれば誰でもそのメトリックを使用できます。DMSメトリックを追加する場合は、顧客の機密情報をメトリックに配置しないよう注意してください。

DMSインストルメントを追加する場合、そのDMSメトリックにアクセスできるユーザーは次のとおりです。

B.5 DMS Sensor Weightを使用した条件付きインストルメント

条件付きでインストルメントを制限するには、DMS Sensor Weight機能を使用します。Sensor Weight機能を使用すると、Sensor Weightに特定の値が設定されている場合のみ、負荷のかかるインストルメントを実行するようにアプリケーションを指定できます。この機能を使用すれば、デバッグのみに必要とされるような、負荷のかかるメトリックの収集を制御することができます。

例B-10は、DMSConsole.getSensorWeight()を使用してSensor Weightの値をテストし、その結果によってメトリックを定義および使用する方法を示しています。

Sensor Weightは、コマンドラインでoracle.dms.sensorsプロパティを使用してグローバルに設定します。このプロパティは、OC4Jスタートアップ・オプションを使用して設定します。このプロパティでサポートされる値には、nonenormalheavyおよびallがあります。

例B-10    Sensor Weightを使用した条件付きインストルメント

 /* DMS Method
   *
   * If the SensorWeight is high enough, return a phase with the
   * parameter in the name. Otherwise, return null.
   */
PhaseEvent heavyPhase(String param) {
PhaseEvent pe = null;
if (DMSConsole.getSensorWeight() > DMSConsole.NORMAL) {
   Noun base = Noun.create(binRoot, param, "MathSeries");
   pe = PhaseEvent.create(base, "computeSeries",
                                   "Time to compute a Binomial series");
   pe.deriveMetric(Sensor.all);
   }
return pe;

B.6 DMSメトリックのファイルへのダンプ

Javaアプリケーションでは、次のメソッドを使用してDMSメトリックをファイルへダンプします。

次のコードを使用すると、指定したファイルに現行のメトリックを追加したり、そのファイルの内容を現行のメトリックで置き換えることができます。

DMSConsole cons2 = new DMSConsole();
DMSConsole.dump("dmsmathseries.log", true, true);

最初の引数にはファイルのパス名、2番目の引数には出力形式を指定します。3番目の引数には、この出力をファイルに追加するか、あるいは出力によってファイルの内容を置き換えるかを指定します。

B.7 Sensorのリセットと破棄

Sensorの抽象クラスは、PhaseEvent、EventおよびState Sensorを制御するためのメソッドを提供します。reset()メソッドは、Sensorのメトリックを初期値にリセットします。getResetTime()メソッドは、Sensorがリセットされたかどうか判断します。destroy()メソッドは、SensorをDMSから削除して、その基礎となるリソースへの参照を解放します。


注意

このメソッドを、組込みメトリックをリセットまたは破棄するために使用しないでください。reset()およびdestroy()メソッドは、作成したメトリックで使用するためにあります。これらのメソッドを、内部の組込みメトリックで使用すると、Application Server Controlコンソールおよび他のOracle Application Server管理機能が、予期しない値をレポートしたり、予期しない動作をすることがあります。 


B.8 DMSコーディングの推奨事項

DMSでのコーディングの推奨事項を次に示します。

  1. DMSメトリックにはグローバルな名前領域があります。新しいNoun Sensor(PhaseEvent、EventあるいはState)を作成する場合は、そのフルネームが、Oracleの組込みメトリックまたはその他のアプリケーションで使用される名前と競合しないようにします。そのため、アプリケーションのフルネームを含むアプリケーションのルートNounを用意することをお薦めします。これによって、名前領域の競合を回避できます。

    関連項目

    「一般的なDMSのネーミング規則」 

  2. すべてのPhaseEventが停止していることを確認します。測定対象のコード・ブロックがtryブロック内にない場合は、これをPhaseEventのstart()を含むtryブロックに置きます。また、PhaseEventのstop()finallyブロックに置きます。または、例B-5のように、finallyブロックのabort()メソッドを使用します。

    関連項目

    「PhaseEvent Sensorの使用」 

  3. DMSネーミング規則を使用します。

    関連項目

    「DMSネーミング規則」 

  4. DMS SensorやNounは2つ以上作成しないでください。DMS APIを複数作成して、オブジェクトは複数作成しないようにしてください。DMSでは、後にこれらを作成しようとすると、参照が実行されます。つまり、可能なかぎり、静的初期化によってSensorとNounを定義するか、サーブレットの場合はinit()メソッドで定義する必要があります。

  5. Sensorを含むそれぞれのNounにタイプを割り当てます。タイプが割り当てられない場合は、値「n/a」(使用不可)が割り当てられます。タイプに「n/a」が指定されたNounは、AggreSpyでは表示されません。

  6. PhaseEventは、特定の状況において実行にかなりの時間がかかり、負荷のかかるコードのセクションを測定する場合にのみ使用します。コードの実行に著しく時間がかかることがない場合、Eventメトリックを使用するか、PhaseEventを削除します。

  7. DMS APIのコールはスレッドセーフであり、競合やアクセスの不具合を回避するための十分な同期を提供します。

B.8.1 PhaseEventメトリックを使用した、過負荷な時間隔の分離

DMSインストルメントを追加する場合、新しいメトリックの要件は慎重に考慮してください。作成したコードが予測したとおりに動作していることを検証するには、十分な数のメトリックを追加することが重要です。

DMSメトリックを追加する場合、次のガイドラインに注意してください。

  1. 目的のコード・ブロックまたはモジュールについて、システムでの処理に要した時間の概要のみを提供するPhaseEvent Sensorを追加します。すべてのメソッド・コール、または検証の対象となるコードやモジュールのすべての個別フェーズについてパフォーマンス・データを収集する必要はありません。

  2. 目的のコード内から制御対象外の外部コードをコールし、その外部コードの処理に長時間かかることが予測される場合は、PhaseEvent Sensorを追加して、その外部コードの開始と完了を追跡します。

これらのガイドラインに従って、PhaseEventメトリックを追加すると、次のメリットがあります。

B.9 DMSの精度を上げるための高分解能クロックの使用

PhaseEventの間、時間間隔を測定するために、DMSはデフォルトでシステム・クロックを使用します。デフォルトのクロックは、ApacheなどのCプロセスではマイクロ秒の単位で、OC4JなどのJavaプロセスではミリ秒の単位で精度をレポートします。パフォーマンス測定の精度向上のために、DMSは、オプションで高分解能クロックをサポートしています。これにより、レポートする時間間隔の単位を選択できます。デフォルトのクロックを使用する場合よりも正確にPhaseEventを測る必要があるとき、またはシステムのデフォルトのクロックが分解能の要件に満たないとき、高分解能クロックを使用できます。


注意

デフォルトのクロックおよび高分解能クロックの分解能は、システムに依存します。システムによっては、デフォルトのクロックが提供する分解能では、タイミングの要件を満たさない場合があります。 特にWindowsプラットフォームでは、デフォルトのクロックでは15ミリ秒ごとに1度しか進みません。そのため、それよりも高い精度を要求するユーザーが多くいます。これらのシステムで短時間のイベントについてレポートされるDMS メトリックは、注意深く分析する必要があります。この問題を解決するには、高分解能のクロックの使用を検討してください。 


この項には、次の項目が含まれています。

B.9.1 OC4J(Java)での時間のレポートのためのDMSクロックの構成

Javaプロセスでは、デフォルトのクロックは、java.lang.System.currentTimeMillis()を使用します。高分解能クロックを選択すると、クロックが変更されたプロセスで実行されているすべてのアプリケーションに対する、このコールが変更されます。プロセスのスタートアップ・オプションを制御するoracle.dms.clockおよびoracle.dms.clock.unitsプロパティを使用し、グローバルにDMSクロックとレポートの単位を設定します。

たとえば、デフォルトの単位で高分解能クロックを使用するには、OC4JのJavaコマンドラインで、次のプロパティを設定します。

-Doracle.dms.clock=highres


注意

高分解能クロックを使用しているとき、Application Server Controlコンソールが予期している値(ミリ秒)とデフォルトの単位は異なります。高分解能クロックを使用しているときにApplication Server Controlコンソールの表示を適切にする必要がある場合は、単位のプロパティを次のように設定します。

-Doracle.dms.clock.units=msecs
 

表B-6は、oracle.dms.clockプロパティでサポートされる値を示しています。

表B-7は、oracle.dms.clock.unitsプロパティでサポートされる値を示しています。

表B-6    oracle.dms.clockのプロパティ値 
  説明 

DEFAULT 

DMSでデフォルトのクロックを使用することを指定します。デフォルトのクロックでは、DMSはPhaseEventで時間を取得するために、Javaコールjava.lang.System.currentTimeMillis()を使用します。

デフォルトのクロックの単位のデフォルト値は、MSECSです。 

HIGHRES 

DMSで高分解能クロックを使用することを指定します。DMSはJNI(JNIコールは、オペレーティング・システムで使用可能なクロックに依存します)を使用し、高分解能クロックにアクセスします。

HIGHRESクロックの単位のデフォルト値は、NSECSです。 


注意

Pentiumプロセッサを搭載したWindowsプラットフォームでは、高分解能クロック(HIGHRES)にタイミングを提供するために、DMSはQueryPerformanceCounter関数を使用します。Pentiumプロセッサを搭載していないWindowsプラットフォームで実行する場合は、高分解能クロックにタイミングを提供するために、DMSはDMS Cクロックを使用します。DMS Cクロックにはマイクロ秒の精度があり、System.currentTimeMillis()で使用可能なデフォルトのクロックより、精度はかなり向上します。 


表B-7    oracle.dms.clock.unitsのプロパティ値 
  説明 

MSECS 

時間がミリ秒に変換され、「msecs」でレポートされることを指定します。

注意: これがデフォルトのクロックのデフォルト値です。 

NSECS 

時間がナノ秒に変換され、「nsecs」でレポートされることを指定します。

注意: これが高分解能クロックのデフォルト値です。 

USECS 

時間がマイクロ秒に変換され、「usecs」でレポートされることを指定します。 

高分解能DMSクロックを使用するときは、次に注意してください。

表B-8は、サポートされている各プラットフォームに固有の環境変数の設定を示します。高分解能DMSクロックを使用するには、環境変数を適切に設定する必要があります。高分解能クロックは、DMS Cライブラリを使用します。UNIXシステムでは、指定する環境変数のパスにlibdms2.soを含める必要があります。Windowsシステムでは、PATH環境変数にyod.dllを含める必要があります。ナノ秒のクロックが使用不可能な場合には、高分解能のタイミングでミリ秒のクロックを使用します。

表B-8    サポートされているプラットフォームのライブラリ・パスの環境変数 
プラットフォーム  環境変数 

AIX 

LIBPATH

パスに$ORACLE_HOME/lib/libdms2.soを含める必要があります。

LD_LIBRARY_PATH

パスに$ORACLE_HOME/lib/libdms2.soを含める必要があります。 

HP-UX 

SHLIB_PATH

パスに$ORACLE_HOME/lib/libdms2.soを含める必要があります。

LD_LIBRARY_PATH

パスに$ORACLE_HOME/lib/libdms2.soを含める必要があります。 

Linux 

LD_LIBRARY_PATH

パスに$ORACLE_HOME/lib/libdms2.soを含める必要があります。 

Tru64 UNIX 

LD_LIBRARY_PATH

パスに$ORACLE_HOME/lib/libdms2.soを含める必要があります。 

Solaris 

LD_LIBRARY_PATH

パスに$ORACLE_HOME/lib/libdms2.soを含める必要があります。 

Windows 2000 

パスに%ORACLE_HOME%¥Apache¥Apache¥yod.dllを含める必要があります。 

Windows 2003 

パスに%ORACLE_HOME%¥Apache¥Apache¥yod.dllを含める必要があります。 

Windows XP 

パスに%ORACLE_HOME%¥Apache¥Apache¥yod.dllを含める必要があります。 

B.9.2 Oracle HTTP Serverでの時間のレポートのためのDMSクロックの構成

Oracle HTTP Serverのパフォーマンスを測定するデフォルトのクロックの分解能はマイクロ秒(usecs)です。Oracle HTTP Serverで実行されているCプロセスの監視には、オプションで、より高分解能のクロックを選択できます。Oracle HTTP Serverで高分解能クロックを使用するには、httpd.confで構成オプションを設定するか、コマンドラインで環境変数を指定する必要があります。

表B-9は、Oracle HTTP ServerのDMSクロックを制御する環境変数を示します。表B-10では、Oracle HTTP ServerのDMSクロックを制御するhttpd.confの構成オプションを示します。コマンドライン・オプションとhttpd.conf構成オプションの両方を設定した場合、コマンドラインよりも構成オプションで設定した値が優先されます。

表B-9    OHSのDMSクロック環境変数 
環境変数  説明 

DMS_CLOCK 

DMSタイミングに使用するクロックを指定します。値はoracle.dms.clockと同じように解釈されます。

有効値: DEFAULT、HIGHRES 

DMS_CLOCK_UNITS 

DMSタイミング値をレポートする単位を指定します。値はoracle.dms.clock.unitsと同じように解釈されます。

有効値: MSECS、NSECS、USECS

デフォルト値: USECS 

表B-10    OHSのDMSクロック構成パラメータ 
パラメータ  説明 

DmsClock 

Javaプロセスに対するoracle.dms.clockプロパティのように、OHSによって開始されるHTTPリスナー・プロセスに対するクロックを指定します。

有効値: DEFAULT、HIGHRES 

DmsClockUnits 

Javaプロセスに対するoracle.dms.clock.unitsプロパティとまったく同様に、OHSによって開始されるHTTPリスナー・プロセスに対する時間単位を指定します。

有効値: MSECS、NSECS、USECS

デフォルト値: USECS 


注意

Pentiumプロセッサを搭載したWindowsプラットフォームでは、高分解能クロック(HIGHRES)にタイミングを提供するために、DMSはQueryPerformanceCounter関数を使用します。Pentiumプロセッサを搭載していないWindowsプラットフォームで実行する場合は、高分解能クロックにタイミングを提供するために、DMSはDMS Cクロックを使用します。DMS Cクロックにはマイクロ秒の精度があり、System.currentTimeMillis()で使用可能なデフォルトのクロックより、精度はかなり向上します。 


たとえば、高分解能クロックを使用して、OC4Jで実行されているJavaプロセスとOracle HTTP Serverで実行されているmod_oc4jの時間を表示するために同じ単位を使用する場合、次のパラメータおよび値が含まれるよう、Oracle HTTP Serverのhttpd.confファイルを更新します。

DmsClock=HIGHRES
DmsClockUnits=MSECS

また、OC4Jプロセスのスタートアップ・オプションとして次の値も含めます。

-Doracle.dms.clock=HIGHRES
-Doracle.dms.clock.units=MSECS

これらのオプションを使用して、DMSは、監視するすべてのOracle HTTP ServerプロセスおよびJava OC4Jプロセスに対して高分解能クロックを使用します。そして、DMSはミリ秒(msecs)単位で値をレポートします。


注意

Oracle HTTP Serverで高分解能クロックを使用するとき、多くのプラットフォームで、デフォルトの単位はNSECSです。Application Server Controlコンソールを使用する必要がある場合、単位はUSECSが要求されます。高分解能クロックを使用しているときにApplication Server Controlコンソールの表示を適切にする必要がある場合は、単位のプロパティを次のように設定します。

DmsClock=HIGHRES
DmsClockUnits=USECS
 

B.10 子孫NounのDMSデータのロールアップ

Oracle Application Server 10gリリース3(10.1.3.1.0)には、メトリックの集計を指定できるDMSロールアップ機能が用意されています。このロールアップ機能を使用することで、DMSのインストルメント時にメトリックの集計を指定できます。ロールアップの適用は、特定のNounタイプの子孫に対して指定します。ロールアップは、直接の子孫のみに適用することも、すべての子孫に適用することもできます。例B-11は、図B-2に示すDMSツリーを生成するコードを示しています。myContainerタイプの各Nounには、percentageFullcloseおよびopen Sensorが含まれます(図B-3を参照)。


注意

例B-11のコードでは、「Nounのタイプの選択」に説明されている推奨事項に違反するNounのツリー階層が生成されます。この例では、一部のNounが同じタイプの子孫および祖先Nounを持つことが道理にかなっています。この項で説明するロールアップ機能では、他の方法では失われる可能性があるデータを収集できます。 


例B-11    メトリックのNoun階層を作成するDMSサンプル・コード

// Create DMS Noun hierarchy for metrics.
Noun home = Noun.create(Noun.getRoot(), "Home", "myContainer");
Noun containers = Noun.create(home, "Containers", "myContainer");
Noun closets = Noun.create(containers, "Closets", "myContainer");
Noun bedrooms = Noun.create(closets, "Bedrooms", "myContainer");
Noun br1 = Noun.create(bedrooms, "BR1", "myContainer");

// Create a closet Noun and create Sensors for it.
Noun c1 = Noun.create(br1, "C1", "myContainer");
State percent = State.create(br1, "percentageFull", State.INTEGER, "percent", 
"percentage full");
Event close = Event.create(br1, "close", "container closed");
PhaseEvent open = PhaseEvent.create(br1, "open", "open container");

// Derive metrics for State and PhaseEvent Sensors
percent.deriveMetric(Sensor.all);
open.deriveMetric(Sensor.all);


図B-2    ツリー内にメトリックがあるDMSコンテナ階層


画像の説明

図B-2は、子孫コンテナを持つツリーを示しています。Bedrooms BR1BR2の下にあるC1およびC2 Nounは、myContainerタイプです(myContainerメトリックの説明は図B-3を参照)。

図B-3    サンプルSensorを示すNoun myContainer


画像の説明

DMSでは、ロールアップ機能を使用して、子孫Nounのサマリーを集計できます。たとえば、Bedrooms Nounに対して、例B-11に示されているロールアップ・コールを追加できます。BR1下にあるmyContainerタイプ・メトリックを集計するには、次のコールを使用します。

br1.rollup("myContainer", Noun.DIRECT);

このコールによって、/Home/Containers/Closets/Bedrooms/BR1の下にmyContainer_rollupという名前のロールアップNounが作成されます。ロールアップNounには、percentageFullcloseopenなどの、関連付けられているNounと同じSensorが含まれます。

DMSロールアップ・メトリックでは、特定タイプのすべての子孫Noun内にあるSensorをロールアップすることも、直接の子孫Noun内にあるSensorのみをロールアップすることもできます。ロールアップ・コールにNoun.DIRECTを指定すると、指定されたタイプの直接の子孫Nounのみが集計されます。myContainerタイプのすべての子孫Nounからのメトリックを集計するには、次に示すようにNoun.ALLを使用してコールします。

closets.rollup("myContainer", Noun.ALL);

ロールアップ・メトリックには、その内容を集計するサマリー情報があります。表B-11に、各Sensorのタイプで使用できる派生のロールアップ・メトリックを示します。

表B-11    ロールアップ・メトリックとその派生メトリック 
メトリック  説明 

PhaseEvent 

PhaseEventロールアップ・メトリックの派生メトリックには、次のものがあります。

  • time: timeメトリックの合計値

  • completed: completedメトリックの合計値

  • maxTime: maxTimeメトリックの最大値

  • minTime: minTimeメトリックの最小値

  • avg: すべてのSensorに対して計算された平均時間

  • active: activeメトリックの合計値

 

Event 

Eventロールアップ・メトリックの派生メトリックには、次のものがあります。

  • sum: すべてのcountメトリックの合計値

  • avg: すべてのcountメトリックの平均値

 

State 

Stateロールアップ・メトリックの派生メトリックには、次のものがあります。

  • sum: すべてのvalueメトリックの合計値

  • avg: すべてのvalueメトリックの平均値

  • maxValue: maxValueメトリックの最大値

  • minValue: minValueメトリックの最小値

 

descendents 

ロールアップNounには、ロールアップの対象が直接の子孫のみかすべての子孫かを報告するdescendents State Sensorがあります。 

rolled 

ロールアップNounには、ロールアップされているNounの数を報告するrolled State Sensorがあります。 

refresh 

ロールアップNounには、このロールアップNounのメトリックの集計に要した時間を報告するrefresh PhaseEventがあります。 

例B-12に、/Home/Containers/Closets下のmyContainer ロールアップNounに対して作成されたサンプル・メトリックを示します。

例B-12    テスト

myContainer_rollup
  descendent.value: all  
  percentageFull.sum 40 percent
  percentageFull.avg 10.0 percent
  percentageFull.min 1 percent
  percentageFull.max 29 percent
  close.sum: 3 
  close.avg: 0.75
  open.time: 871 msecs 
  open.completed: 4 ops 
  open.maxTime: 722 msecs 
  open.minTime: 23 msecs 
  open.avg: 217.7 msecs 
  open.active: 0 
  rolled.value: 4 nouns
  refresh.maxActive:   1 threads
  refresh.active:      0 threads
  refresh.avg: 0.2857142857142857 msecs
  refresh.maxTime:     1 msecs
  refresh.minTime:     0 msecs
  refresh.completed:   7 ops
  refresh.time:        2 msecs

このメトリックはmyContainerメトリックと類似していることに注意してください。ロールアップ・メトリックの場合、主に次のような違いがあります。

  1. ロールアップNounには、descendentrolledおよびrefreshメトリックがあります(詳細は表B-11を参照)。

  2. percentageFull Stateには、valueメトリックではなく、sumおよびavgメトリックがあります。各メトリックの名前は、その内容を示しています。

  3. close Eventには、countメトリックではなく、sumおよびavgメトリックが含まれます。各メトリックの名前は、その内容を示しています。

  4. open PhaseEventには、maxActiveメトリックは含まれません。このコンテキストでは意味を持たないためです。

    関連項目

    『Oracle Application Server DMS API Reference』のJavadoc 


戻る 次へ
Oracle
Copyright © 2001, 2008, Oracle.

All Rights Reserved.
目次
目次
索引
索引