ここでは、次のような配備環境のチューニングについて説明します。
ここでは、Java プラットフォームである Enterprise Edition (Java EE プラットフォーム) 環境の最適化に使用できるチューニング案をいくつか説明します。
これらのチューニング案は、一連の実験結果のうち、ユースケースのテストにおいてスループットにかなりの増加が確認されたものを基にしています。この向上は、JVM のサイズ変更と、ガベージコレクタの動作に影響を及ぼすスイッチによるものです。
Java、JConsole、または JVM のチューニングの詳細は、表 4–1 および 表 4–2 に記載されている Web サイトをご覧ください。
次の節では、Java EE 環境で Java と JVM をチューニングする方法について説明します。
Java パフォーマンスのチューニングの詳細、ベストプラクティス、および用例については、次の『Java Tuning White Paper』を参照してください。
http://java.sun.com/performance/reference/whitepapers/tuning.html
この節に記載したチューニング案は、次のチューニングスクリプトを基にしています。これらのスクリプトは、Sun Java System Application Server の domain.xml ファイル (ドメイン設定ディレクトリにあり、通常は domain-dir/config です。) に追加されました。
PrintGCStats – データマイニングのシェルスクリプト。verbose:gc ログからデータを収集し、ユーザーが指定した間隔でデータのサンプルを抽出して、ガーベジコレクションの中断時間、パラメータの算出、アプリケーションの実行時に渡るタイムラインの解析などの情報を表示します。
このスクリプトとガベージコレクション統計を使用して JVM チューニングを最適なものにする方法については、次の Web サイトを参照してください。
http://java.sun.com/developer/technicalArticles/Programming/turbo/#PrintGCStats
PrintGCDetails – より詳細なガベージコレクション統計が得られるシェルスクリプト。
PrintGCTimeStamps – PrintGCDetails スクリプトを使用して収集したガベージコレクション統計にタイムスタンプ情報を追加するシェルスクリプト。
最良の JVM パフォーマンスを得られるようにするには、次の点を確認してください。
『Sun Identity Manager 8.1 リリースノート』の「サポートされているソフトウェアと環境」節に記載されている必須の Java バージョンを使用し、最新の機能、バグの修正、およびパフォーマンス拡張機能を使用していること。
ガベージコレクションの最新バージョンを使用していること。
アプリケーションサーバーをインストールしたときのデフォルトのガベージコレクションスキームである旧バージョンを削除していないことがよくあります。Identity Manager で旧バージョンのガベージコレクタを実行すると、多数のオブジェクトが生成されるため、JVM が絶え間なくガベージを収集することになります。
Identity Manager を Sun Java System Application Server に配備している場合は、配備した Identity Manager インスタンスの server.xml ファイルにガベージコレクションの要素を追加すれば、スループットを高めることができます。
最大負荷に 300 人以上のユーザーが見込まれる場合は、次の設定を修正してパフォーマンスを高めます。
配備した Identity Manager インスタンスに HTTP リスナーを設定している場合は、server.xml ファイル内のリスナー定義要素を編集し、「ホスト上のアクティブ CPU 数」を「ホスト上のアクティブ HTTP リスナー数」で割った数をアクセプタスレッド数に設定します。
たとえば、次のようにします。
<HTTP リスナー ID=”HTTP リスナー-1” \アドレス=”0.0.0.0” ポート=”80” \アクセプタスレッド=”アクセプタスレッドの算出結果” ...>
大部分の Identity Manager 配備の静的コンテンツは頻繁に変更されるように設計されていないため、(「ファイルキャッシュ設定」ページにある) 静的コンテンツのファイルキャッシュ設定を編集しても構いません。コンテンツが再読み込みされる前のファイルキャッシュ内のコンテンツ最大有効期間に、大きな数値を指定します (24 時間単位の秒数など)。
「ファイルキャッシュ設定」ページにアクセスするには、HTTP サーバーノード用の Web ベース管理者コンソールから「ファイルキャッシュ」タブをクリックします。(詳細な手順については、最新の『Sun Java System Web Server Administrator’s Guide』を参照してください。)
Sun Application Server では、チューニング可能なものを公開しています。これによって、HTTP コンテナで確保される各種スレッドプールと接続キューのサイズが変わります。
デフォルトでは、チューニング可能なものの大半は同時接続ユーザー数 300 人以下の負荷とされています。
アプリケーションサーバーのチューニングには、次のガイドラインが役立ちます。
ヒープサイズ以外にも、大半のアプリケーションサーバーにはデフォルトのパラメータ設定が使用できます。ご使用中のリリースに応じて、サーバーのヒープサイズを変更してください。
最新の『Sun Java System Application Server パフォーマンスのチューニングガイド』の「アプリケーションサーバーのチューニング」の章では、Sun Java System Application Server のチューニング方法について説明しています。このドキュメントは、次の URL から入手できます。http://docs.sun.com/app/docs
また、Sun Application Server 8.2 Enterprise Edition をお使いの場合は、次のように変更すれば「並列モードのエラー」が解決され、パフォーマンスが改善され予測しやすくなるはずです。
古い世代のコレクションを常に実行している場合は、アプリケーションのヒープ面積を見直し、このサイズを増やしてみてください。たとえば、次のようにします。
500M バイトは小さめなサイズですので、この値を 3G バイトに増やせば向上する場合があります。
若い世代コレクションが 2G バイトの場合、スカベンジするたびに約 70M バイトをプロモートします。スカベンジを少なくとも 1 回行うと 70M バイトをプロモートするということを念頭に置いてください。たとえば、次の SurvivorRatio が必要になることがあります。
2 G バイト/70 M バイト X 2 = 4096/70 = 55
ここで、次のように設定します。
-XX:SurvivorRatio=32 -XX:MaxTenuringThreshold=1
この比率に設定すれば、早すぎるプロモートを防ぐことができ、またスカベンジパフォーマンスの低下の原因となりうる「偏り」も防ぐことができます。
-XX:CMSInitiatingOccupancyFraction=60 と設定しておけば、CMS コレクションがこのしきい値に達するまで起動したままになります。たとえば、次のようにします。
56402.647: [GC [1 CMS-initial-mark: 265707K(1048576K)] 1729560K(3129600K), 3.4141523 secs]
-XX:CMSInitiatingOccupancy=60 を削除し (デフォルト値の 69% を使用)、次の行を加えます。
-XX:UseCMSInitiatingOccupancyOnly
若い世代のコレクションが 2G バイトで、古い世代のコレクションが 1G バイトの場合でも、早すぎる CMS コレクションが行われてしまうことがあります。この比率を逆転してみてください。次のように、若い世代のコレクションを 1 G バイト、古い世代のコレクションを 2 G バイトに設定します。
-Xms3G -Xmx3G -Xmn1G
また、-XX:NewRatio を削除します。若い世代と全体のヒープサイズを明示的に指定していた場合は、この比率は余分です。
Java 開発キット (JDKTM ソフトウェア) の 5uXX バージョンを使用していて、過度に長すぎる「abortable preclean」サイクルがある場合は、一時的な回避策として -XX:CMSMaxAbortablePrecleanLoops=5 を使用することができます。
この値は、さらに調整する必要があります。
ガベージコレクタのパフォーマンスの詳細を表示するには、次の行を追加します。
-XX:+PrintHeapAtGC
冗長的なガベージコレクションデータの生成量が増えるので、このコマンドは慎重に使用してください。ガベージコレクタの出力の保存先に十分なディスク空き容量があることを確認してください。
Sun FireTM T2000 サーバーを使用している場合は、DTLB (Data Translation Look-aside Buffer) のヒープが大きいとリソースが不足してしまうことがあります。Java ヒープに大きなページを使用することでパフォーマンスに役立つことがよくあります。たとえば、次のようにします。
-XX:+UseLargePages
IBM WebSphere ® アプリケーションサーバーに搭載した Identity Manager をチューニングする場合、ヒープメモリーはスレッドに使用するメモリーに影響するため、ヒープに割り当てるメモリー量を制限するようにしてください。
多数のスレッドが同時に作成されてヒープサイズが増えると、アプリケーションのディスク空き容量限度を直ちに超えて、次のエラーが返されます。
JVMCI015:OutOfMemoryError
Identity Manager は、ID と構成データの保存と管理にリポジトリデータベースを基にしています。このため、データベースのパフォーマンスが Identity Manager のパフォーマンスに大きく影響することがあります。
データベースのパフォーマンスチューニングと管理の詳細は、データセットやベンダーによって異なるので、このドキュメントでは説明しません。また、データベース管理者 (DBA) は、すでにお使いのデータベースに精通している必要があります。
ここでは、データベースの計画、チューニング、および管理に役立つよう、Identity Manager アプリケーションの特徴を説明し、Identity Manager のデータとその典型的な使用法パターンの概要を説明します。
この情報は、次の節で構成されています。
Identity Manager のリポジトリには、3 種類のテーブルがあり、テーブルごとに使用方法の特徴が多少異なります。このテーブルについての情報は、次の節で構成されています。
属性テーブルを使用すると、定義済みの単一値または複数値のオブジェクト属性を照会できます。
大半のオブジェクト型のストアド属性はハードコードされます。
User オブジェクト型と Role オブジェクト型は、この規則における例外です。User と Role オブジェクトテーブルに格納されるインライン属性は構成可能なため、追加のカスタム属性をクエリー可能として設定できます。
属性状態を基にオブジェクトを検索すると、Identity Manager は対応するオブジェクトテーブルを使用して結合内の属性テーブルにアクセスします。結合の形式 (JOIN、EXISTS 述語、SUB-SELECT など) によっては、属性の状態ごとに発生するものもあります。
属性テーブルの行数は、対応するオブジェクトテーブルの行数に比例しています。この値は傾斜 (スキュー) の形に分布することがあります。複数値の属性には値ごとに行があります。オブジェクトの中にはほかと比べて属性や属性値が多いものもあります。通常、属性テーブルの行とオブジェクトテーブルの行には、多対 1 の関係があります。
属性テーブルのテーブル名は ATTR です。
Identity Manager では、対応するオブジェクトテーブルに加えた変更内容の履歴を追跡するのに変更テーブルを使用します。これらのテーブルのサイズは、オブジェクトの変更率に比例しますが、際限なく増えることはありません。Identity Manager は、自動的に変更テーブルを切り捨てます。
変更テーブルは、行の有効期間が比較的短く新しい行が頻繁に作成されるため、変動率が高くなることがあります。
変更テーブルへのアクセスは、通常、タイムスタンプフィールドの範囲スキャンで実行されます。
変更テーブルのテーブル名は CHANGE です。
Identity Manager のリポジトリは、オブジェクトテーブルを使用してラージオブジェクト (LOB) などの直列化データオブジェクトを保持します。オブジェクトテーブルでは、よく問い合わされる単一値のオブジェクト属性も保持できます。
大半のオブジェクト型のストアド属性はハードコードされます。
User オブジェクト型と Role オブジェクト型は、この規則における例外です。オブジェクトテーブルに格納されるインライン属性は構成可能なため、User と Role は、追加のカスタム属性をクエリー可能として設定できます。
オブジェクトテーブル内の行数と、格納されるオブジェクト数は一致します。オブジェクトテーブルごとに格納されるオブジェクト数は、そのテーブルに格納されるオブジェクト型によって決まります。オブジェクト型によっては多数のものもあれば、少数のものもあります。
Identity Manager は通常、オブジェクト ID またはオブジェクト名を使ってオブジェクトテーブルにアクセスしますが、テーブル内に格納されている属性のうちの 1 つを使ってアクセスすることもできます。オブジェクト ID とオブジェクト名は単一のオブジェクト型をとおして一意ですが、属性値は一意ではなかったり均等に分布されていたりします。属性によっては値が多いものもあれば、比較的少ないものもあります。さらに、複数のオブジェクト型で同じ属性を使用することもあります。属性の中には、あるオブジェクト型に対する値は多く、別のオブジェクト型に対する値は少ないものもあります。値の分布が均一でないと、インデックスページの分布も均一でなくなり、スキューと呼ばれる状態になります。
オブジェクトテーブルは、テーブル名に ATTR または CHANGE 接尾辞が付かないテーブルです。
オブジェクトテーブルにはそれぞれ 1 つの XML 列があり、LOG テーブルセットを除く各直列化オブジェクトを格納するのに使用されます。特定の LOG テーブルセットのオプションの属性は、それが存在する場合には XML 列に格納されます。たとえば、デジタル署名が有効に設定されている場合などがあります。
Identity Manager のデータは、アクセスパターン、カーディナリティー、有効期間、データの変更頻度などの点で類似したプロパティーを持つクラスにほぼ分類できます。リポジトリのテーブルセットに対応しているクラスは、次のとおりです。
エクスポートキューデータ「エクスポートキューデータ」
ユーザーデータは、ユーザーオブジェクトから構成されます。
管理対象 ID ごとにオブジェクトがあるため、このデータはかなり大きくなることが予想されます。大部分の演算は既存オブジェクトを更新したものになるため、最初に生成してからは、作成されるものはあまりないはずです。
ユーザーオブジェクトは有効期間が長いものが多く、削除される確率は比較的低くなります。
ユーザーデータは、USEROBJ テーブル、USERATTR テーブル、および USERCHANGE テーブルに格納されます。
ロールデータは、ビジネスロール、IT ロール、アプリケーション、アセットなどのロールのサブタイプを含む Role オブジェクトから構成されます。
ロールデータは組織データと似ており、お客様が Identity Manager を配備した後、このオブジェクトは比較的固定されます。
ただし、権限ロールセットがある外部ソースと一体化した配備は例外です。たとえば、一体化型にすると Identity Manager にロール変更の入力が必要になり、Identity Manager の Role データが変動しやすくなります。
(複数のユーザーが各ロールを共有しているとすれば) ロールオブジェクト数は、ユーザーなどの ID オブジェクト数よりも少ないと言えますが、これは企業のロール定義の仕方によって異なります。
ロールデータは、ROLEOBJ テーブル、ROLEATTR テーブル、および ROLECHANGE テーブルに格納されます。
アカウントデータは、Account Index のアカウントオブジェクトからのみ構成されます。
ユーザーデータと同様、既知のリソースアカウントごとにオブジェクトがあるため、アカウントデータは大きくなりがちです。アカウントオブジェクトは、一般的に有効期間が長く、削除される確率は比較的低く、最初に生成されてからは、作成されることはあまりありません。ネイティブアカウントの追加や削除を頻繁に行わない限り、またはネイティブ変更の検出を有効に設定しない限り、アカウントオブジェクトの変化はあまり発生しません。
Identity Manager は、アカウントデータを ACCOUNT テーブル、 ACCTATTR テーブル、および ACCTCHANGE テーブルに格納します。
コンプライアンス違反データには、監査ポリシーの評価に失敗した時期を表す違反レコードが記載されます。この違反レコードは、同じユーザーに対して同じ監査ポリシーが評価され、評価に合格するまで保持されます。違反レコードは、監査ポリシーのスキャンまたはアクセスレビューの一環として作成、変更、または削除されます。
違反レコードの数は、スキャンで使用される監査ポリシー数とユーザー数に比例します。インストールユーザー数が 5000、監査ポリシー数が 10 とすると、違反レコードは 500 (5000 x 10 x 0.01) と考えられます。この乗数 0.01 は、ポリシーの厳密度とユーザーアカウントの変更の仕方によって変わります。
Identity Manager は、コンプライアンス違反レコードを OBJECT テーブル、ATTRIBUTE テーブル、および OBJCHANGE テーブルに格納します。
権限付与データは、コンプライアンスのアクセスレビューを実行する場合にのみ作成される、ユーザー権限付与オブジェクトから主に構成されます。
権限付与レコードは大きなバッチに作成され、最初の作成から (何日もかけて) ゆっくりと変更され、その後は手つかずのままになります。このレコードは、アクセスレビューが削除されてから削除されます。
Identity Manager は、権限付与データをENTITLE テーブル、ENTATTR テーブル、および ENTCHANGE テーブルに格納します。
組織データは、オブジェクトグループまたは組織オブジェクトから構成されます。
オブジェクトグループデータは構成データと似ており、このデータは配備された後は比較的固定されます。一般的に、タスクオブジェクトと比べたり、ユーザーやアカウントなどの ID オブジェクトと比べるとオブジェクト数は (定義されている組織を単位とすると) 少ないですが、ほかの構成オブジェクトと比べるとこの数の方が多くなることがあります。
組織データは、ORG, ORGATTR テーブルと ORGCHANGE テーブルに格納されます。
タスクデータは、状態と結果データを含むタスクとワークフローに関するオブジェクトから構成されます。
オブジェクトが高速で作成、変更、および削除されるため、これらのテーブルにあるこのデータの有効期間は、ほかのクラスと比べると短いです。このテーブルのデータ量は、使用システムの動作量に比例します。
タスクデータは、TASK テーブル、TASKATTR テーブル、TASKCHANGE およびテーブルに格納されます。
構成データは、フォーム、ロール、ルールなどの Identity Manager のシステム構成に関するオブジェクトから構成されます。
構成データの特徴は、一般的に次のとおりです。
ほかのクラスと比べると比較的小さい。
変更は配備中とアップグレード中にのみ、大きいバッチで行われる。
配備された後は、あまり変更されることがない。
Identity Manager は、構成データを ATTRIBUTE テーブル、OBJCHANGE テーブル、および OBJECT テーブルに格納します。
データのエクスポートを有効に設定すると、レコードの中には、エクスポートタスクがレコードをデータウェアハウスに書き込むまで、Identity Manager のキューに入れられるものがあります。キューに入れられるレコードの数は、データエクスポートの構成と、キューの中のすべての型に対するエクスポート間隔と相関関係にあります。
デフォルトでキューに入れられるデータ型は次のとおりです。これ以外のデータ型はすべてキューに入れられません。
ResourceAccount
WorkflowActivity
TaskInstace
WorkItem
これらのテーブルのレコード数は、エクスポートタスクがキューを排出するまで増えます。最新のテーブルサイズは、JMX TM Bean から表示できます。
このテーブルに追加されたレコードは、変更されることがありません。これらのレコードは、調整、プロビジョニング、ワークフローの実行など、ほかの Identity Manager 動作中に書き込まれます。このデータエクスポータがタスク実行をエクスポートすると、タスクがテーブルを排出します。
Identity Manager は、エクスポートキューデータレコードを QUEUE テーブル、QATTR テーブル、および QCHANGE テーブルに格納します。
ログデータは、監査オブジェクトとエラーログオブジェクトから構成されます。ログデータは 1 度限り書き込めるので、新規の監査オブジェクトとエラーログオブジェクトは作成できても、これらのオブジェクトを変更することはできません。
ログデータは明示的要求によってのみ消去できるため、ログデータの有効期間は非常に大きくなりがちです。ログデータに頻繁にアクセスするかどうかは、属性テーブル内ではなくオブジェクトテーブル内に格納されている属性によって決まります。ログに対する属性値の分布もクエリーも、具体的には Identity Manager の使い方によって決まります。
たとえば、ログテーブル内の属性値の分布は、次によって決まります。
どの種類の変更が加えられたか。
どちらの Identity Manager インタフェースから変更が加えられたか。
どのオブジェクト型が変更されたか。
ログテーブルに対するクエリーのパターンは、お客様がそのログテーブルに対して実行する Identity Manager レポート、カスタムレポート、または外部データマイニングのクエリーによっても異なります。
Identity Manager は、監査ログレコードを LOG テーブルと LOGATTR テーブルに、そしてエラーログレコードを SYSLOG テーブルと SLOGATTR テーブルに格納します。このデータには、対応する変更テーブルがありません。
Identity Manager は、JDK ソフトウェアに用意されている VMID クラスでオブジェクトにグローバル一意識別子 (GUID) を生成します。
これらの GUID 値は、オブジェクトが作成された順に基づいて、格納されたプロパティーを文字列表現で表します。たとえば、Identity Manager でオブジェクトを新規作成すると、古い方のオブジェクトより新しい方のオブジェクトに大きいオブジェクト ID が付きます。このため、Identity Manager がデータベースに複数の新しいオブジェクトを挿入すると、オブジェクト ID に基づいたインデックスが同じブロックを競合することがあります。
Identity Manager は、準備済み文を動作 (データベース行の挿入や更新など) に使用することはあっても、クエリーに使用することは通常ありません。
Oracle® を使用している場合は、この動作のためにライブラリキャッシュに問題が生じることがあります。特に、文のバージョンが多数存在するとライブラリキャッシュのラッチに競合が起こることがあります。
この競合を解決するには、Oracle CURSOR_SHARING パラメータ値を EXACT から SIMILAR に変更します。この値を変更すると、SQL 文のリテラルが Oracle によってバインド変数に置き換えられるため、バージョンの数が減ります。
Identity Manager はバイトよりも文字データを通常読み書きする Java アプリケーションのため、データベースが用いるエンコーディングは制限されません。
Identity Manager は、データが正しく送信および返信されることだけを要求します。たとえば、書き込み時と再読み取り時にデータが破損することはありません。複数バイト文字をサポートし、データに合ったエンコーディングを使用してください。通常は UTF-8 エンコーディングで十分ですが、日本語やアラビア語などの真の複数バイト文字を多数用いる企業では、UTF-16 の方が良いかもしれません。
大多数のデータベース管理者が複数バイト文字をサポートしているエンコーディングの方を望む理由は、次のとおりです。
配備が拡張され、国際文字セットのサポートが必要になることが多い。
ASCII のように見えるが実際には全角ダッシュ (—) のような複数バイトを含んだ Microsoft アプリケーションのテキストをカット&ペーストすることがある。
ここでは、リポジトリデータベースをチューニングする際のガイドラインをいくつか説明します。
データベース管理者は、統計を頻繁に実行してリポジトリデータベースの現状を監視する必要があります。
データソースを使用している場合は、RepositoryConfiguration オブジェクトの connectionPoolDisable 属性を true に設定して、Identity Manager リポジトリの内部接続プールの自動化を無効に設定します。
たとえば、<RepositoryConfiguration connectionPoolDisable=’true’> と設定すると (Identity Manager 用とアプリケーションサーバー用に) 接続プールが 2 つにならないようにできます。
RepostioryConfiguration オブジェクトを編集して、固有の単一値属性に対する検索パフォーマンスを向上させることもできます。たとえば、このオブジェクトを編集して、ユーザー検索に使用したり相関キーとして使用する employeeID などの拡張属性を追加してください。
デフォルトの RepositoryConfiguration オブジェクトは、次の例のようになります。
<RepositoryConfiguration ... > <TypeDataStore Type="User" ... attr1="MemberObjectGroups", attr2="lastname" attr3="firstname" attr4="" attr5=""> </TypeDataStore> </RepositoryConfiguration> |
省略符号は、ここには無関係の XML 属性を表しています。
attr1、attr2、attr3 、attr4、および attr5 の XML 属性はそれぞれ、waveset.userobj テーブルにコピーすべき単一値属性を示しています。waveset.userobj テーブルは、最大 5 つまでのインライン属性を格納できます。RepositoryConfiguration 内の attr1 という属性値は、このテーブルの "attr1" データベース列にコピーされます。
インライン属性は、(子の attribute テーブル列としてではなく) Type の基本 object テーブルに格納されます。
インライン属性を使用すると、属性に対するリポジトリのクエリーのパフォーマンスが向上します。(インライン属性はメインの「object」テーブルにあるため、インライン属性に対するクエリーの方が、子の「attribute」テーブルに格納されているインライン属性以外に対するクエリーよりも高速です。インライン属性以外に対するクエリー条件には、属性テーブルに「結合」が必要になります。)
デフォルトでは、Identity Manager が MemberObjectGroups、lastname、および firstname のインライン属性を使用します。
クエリーに使用できる属性であれば、検索を高速化するためにもう 2 つ属性を追加しても構いません。
たとえば、配備に employeeID の拡張属性がある場合、この属性インラインを追加すれば、その属性に対するリポジトリ検索のパフォーマンスが向上します。
lastname や firstname が不要な場合は、削除したりほかの属性と代えても構いません。
MemberObjectGroups は削除しないでください。Identity Manager は、承認チェックの高速化にこの属性を内部で使用します。
各テーブルセットに格納されるオブジェクト型の詳細は、「データクラス」を参照してください。
ここでは、Oracle と SQL Server のリポジトリデータベースをチューニング際のベンダー固有のガイドラインについていくつか説明します。
現在、開発とデモ用にサポートされているのは、MySQLTM データベースだけです。
ここでは、Oracle リポジトリデータベースをチューニングする際のガイドラインについて説明します。
Identity Manager アプリケーションは、Oracle データベースの機能やオプションを必要としません。
Oracle リポジトリデータベースと Identity Manager サービスプロバイダ や Identity Manager を使用する場合、Identity Manager は LOB データ型ではなく LONG データ型をデフォルトで使用するため、オブジェクトテーブルの断片化の問題に遭遇するかもしれません。LONG データ型を使用すると、使用可能スペースに作成できないエクステントスペースの「未割り当て」量が増えることがあります。
この問題を抑制するには、次の項目を実行します。
Object テーブルの EXPORT をダンプし、インポートし直して未割り当てのエクステントスペースを解放します。インポートしたら、データベースを終了して再起動する必要があります。
LOB データ型と、Oracle に標準の LOB 実装を提供する DataDirect Technologies の Merant ドライバを使用します。
自動的に空きスペースを管理するローカルマネージメントテーブルスペース (LMT) を使用します。この LMT は、Oracle 8.1.5 で使用できます。
Identity Manager は、SGA サイズ変更、バッファサイズ変更、オープンカーソル、プロセスなどに Oracle の init.ora パラメータ設定を必要としません。
Identity Manager リポジトリは汎用的なデータベースでありながら、まさにオブジェクトデータベースと言えます。
Identity Manager テーブルのうち、TASK テーブルセットが最もトランザクション処理の特徴を備えています。LOG と SYSLOG テーブルセットは直列化オブジェクトを格納しないため、これらも例外です。
テーブルの説明、各テーブルに格納されるオブジェクト型、および各テーブルの一般的なアクセス方式については、「リポジトリテーブルの種類」と「データクラス」を参照してください。
Oracle データベースにパフォーマンスの問題がある場合は、Identity Manager では比較的効率がよいと思われるクエリーに対して選択されているクエリー計画に問題がないか調べてください。
たとえば、インデックスが使用可能な場合、Identity Manager はテーブルの完全スキャンが実行されるように設定されています。こういった問題は、自動ワークロードリポジトリ (AWR) レポートにある SQL の buffer gets テーブルによく見られます。この問題は、Enterprise Manager ツールでも表示することができます。
パフォーマンス問題は、データベーステーブルの統計が不良か紛失した場合によく起こります。この問題を解決すれば、データベースと Identity Manager の両方のパフォーマンスを向上させることができます。
次の記事は Oracle から入手でき、Oracle のコストベースオプティマイザ (CBO) を調べるのに役立ちます。
『Oracle MetaLink: Note:114671.1: Gathering Statistics for the Cost Based Optimizer』
最適なクエリー計画を選択するもう一つの方法として、SQL プロファイルを用いた調査も行えます。パフォーマンスの悪い SQL を特定する際には、Enterprise Manager から SQL Advisor を使用してこれらのプロファイルを作成します。
Oracle 再実行ログに予想外の増加が検出された場合は、手動操作で無限ループに陥っているワークフローがあるかもしれません。ループによってリポジトリが絶えず更新され、その結果 TaskInstance ごとのサイズが大幅に増加してしまいます。ワークフローのエラーは、WF_ACTION_TIMEOUT を不適切に取り扱ったり、ワークフローの途中でブラウザを閉じたりすると起こります。
問題のあるワークフローを回避するには、本番稼動前に各手動操作のプレビューを行い、次の点を検証します。
タイムアウトを設定しているか。
手動操作で用いる動作に、タイムアウトの処理に合った遷移ロジックを作成しているか。
TaskInstance に大量のデータがある場合、手動操作に公開変数タグを使用しているか。
CURSOR_SHARING パラメータ値を EXACT から SIMILAR に変更すると、Identity Manager のパフォーマンスを大幅に向上できることがよくあります。
Identity Manager は、準備済み文をいくつかの動作 (データベース行の挿入や更新など) に使用することはあっても、これらの文をクエリーに使用することはほぼありません。
Oracle を使用するとき、この動作によってライブラリキャッシュに問題が生じることがあります。特に、文のバージョンが多数存在するとライブラリキャッシュのラッチに競合が生じることがあります。CURSOR_SHARING を SIMILAR に変更すると、Oracle が SQL 文内のリテラルをバインド変数に置き換えるため、バージョンの数を大幅に減少できます。
詳細は、「準備済み文」を参照してください。
SQL Server 2000 データベースをリポジトリとして使用している顧客より、並行処理が増加するときに SQL Server の内部で悲観的 (Pessimistic) ロックを使用すること (主にロックエスカレーション) によるデッドロックの問題が SQL Server 2000 に発生するという報告がありました。
これらのデッドロックエラーは、次の形で表示されます。
com.waveset.util.IOException: ==> com.microsoft.sqlserver.jdbc.SQLServerException: Transaction (Process ID 51) was deadlocked on lock | communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction. |
このデッドロック問題を回避または解決するには、次の項目を実行します。
SQL Server 2005 データベースを使用します。
次のようにコマンドを初期化して、READ_COMMITTED_SNAPSHOT パラメータを設定します。
ALTER DATABASE waveset SET READ_COMMITTED_SNAPSHOT ON
READ_COMMITTED_SNAPSHOT パラメータを有効にすると、次のようになります。
SELECT 文の実行中にブロックの原因となりうる競合がなくなります。そのため、SQL Server 内部へのデッドロックの危険性が大幅に減少します。
不確実なデータが読まれなくなります。そのため、SELECT 文が確実なデータの一貫したビューを受信できるようになります。
READ_COMMITTED_SNAPSHOT パラメータの詳細は、http://msdn2.microsoft.com/en-us/library/ms188277.aspx を参照してください。