Cloud Software Group, Inc. EBX®
ドキュメント > リファレンスマニュアル > その他
ナビゲーションモードドキュメント > リファレンスマニュアル > その他

パフォーマンスとチューニング

環境

メモリ管理

アプリケーションサーバーに割り当てられたメモリ

クエリエンジンは永続ストレージから必要な情報を取得するため、Java 仮想マシンに割り当てられるメモリ (通常は -Xmx パラメータで指定) を低く抑えることができます。この数値は、OS で使用可能な合計メモリの 1/3 未満に設定することをお勧めします。また、32 GB 未満に抑えることをお勧めします。これは、すべての合理的なユースケースに適合し、圧縮された通常のオブジェクトポインター機能を利用できるようにする必要があります。

オペレーティングシステムに割り当てられたメモリ

アプリケーションサーバーを実行している OS では、OS キャッシュに十分なスペースを残して、永続的な Lucene インデックスへのアクセスを最適化できるようにすることが重要です。実際、これらがファイルシステムからロードされると、OS はメモリキャッシュを使用して、この同じデータへの後続のアクセスを高速化し、ディスクから毎回リロードすることを回避します。これは、この目的のために十分な RAM が残っている場合にのみ可能です。

また、JVM プロセスが多数のメモリマップトファイルに必要なリソースを予約できるように OS を構成する必要があります (詳細については、この記事を参照してください)。Linux OS では、これは次のコマンドを発行することで実行できます。

ulimit -n 512000
sysctl vm.max_map_count=262144

メモリ監視

EBX® ロードアクティビティの兆候は、基盤となるデータベースを監視することによって、また「監視」ログカテゴリによって提供されます。

cleared および built オブジェクトの数が長期間高いままである場合、これは EBX® がアプリケーションサーバーでスワップしていることを示しています。その場合、アプリケーションサーバーに割り当てるメモリを増やす必要があります。

ガベージコレクター

ガベージコレクターを調整すると、全体的なパフォーマンスにもメリットがあります。このチューニングは、使用するユースケースと特定の Java ランタイム環境に適合させる必要があります。

ディスク

EBX® リポジトリデータは Lucene インデックスにインデックス付けされ、ルートディレクトリの下のディスクに保存されます。

ディスク容量:ディスクサイズの経験則では、リレーショナルデータベースのテーブル G_BLK が占める容量の 10 倍を計画します。

ディスク遅延:全体的なパフォーマンスを良好に維持するには、Lucene インデックスを格納するディスクの遅延時間を短くすることが重要です。

以下も参照してください。

CPU

アプリケーションサーバーで使用可能な CPU の数は、処理される同時 HTTP 要求の数、暗黙のタスクの複雑さ (CPU コスト)、および Java ガベージコレクションを含むバックグラウンドアクティビティを考慮して定義する必要があります。

サーバーの負荷と使用可能なプロセッサの数の違いにより、トランザクション内でインデックス作成を効率的に並行して実行できる場合、大規模なインポート、およびより一般的には多くの作成、更新、削除を伴う大規模なトランザクションがより速く完了します。永続性ログカテゴリには、次のエントリが含まれます。

上記の違いは 10 秒ごとに評価され、Java クラス java.lang.management.OperatingSystemMXBean のメソッド getSystemLoadAverage() および getAvailableProcessors() を使用して計算されます。両方の数値は、上記のログエントリの最後に書き込まれます。

ネイティブ LZ4 ライブラリの使用

LZ4 ライブラリは、データベースへのデータの保存とデータベースからのデータの取得に使用されます。データアクセスを高速化するには、ebx-lz4.jar ネイティブインストールを実行する必要があります。

詳細については、データ圧縮ライブラリを参照してください。

サーバー起動時のスキャン

Web アプリケーションサーバーの起動を高速化するには、JAR ファイルスキャナーを構成する必要があります。

データベース

データベーステーブルの再編成

他のデータベースと同様に、大量のデータを挿入および削除すると、データが断片化され、時間の経過とともにパフォーマンスが低下する可能性があります。この問題を解決するには、影響を受けるデータベーステーブルを再編成する必要があります。リレーショナルデータベースの監視とクリーンアップを参照してください。

EBX® の特徴は、データスペースとスナップショットを作成すると、テーブル GRS_DTRGRS_SHR に新しいエントリが追加されることです。パフォーマンスが低下した場合、多くのデータスペースが作成および削除される大規模なリポジトリでは、これらのテーブルの再編成をスケジュールする必要がある場合があります。

データモデリング

集約リスト

データモデルでは、エレメントのカーディナリティ制約 maxOccurs が 1 より大きく、このエレメントで osd:table が宣言されていない場合、Java リストとして実装されます。このタイプのエレメントは、テーブルではなく、集約リストと呼ばれます。

反復、ユーザーインターフェイスの表示などの観点から、集約リストにアクセスする際に特定の最適化がないことを考慮することが重要です。パフォーマンスの問題に加えて、集約リストは、テーブルでサポートされる多くの機能に関して制限されます。これらの機能のリストについては、テーブルの概要を参照してください。

注意

上記の理由により、集約リストは、小規模な単純データ (1 ダースまたは 2 ダースのレコード) にのみ使用する必要があり、識別、ルックアップ、アクセス許可などの高度な要件はありません。大規模なデータ (またはより高度な機能) の場合、osd:table 宣言を使用することをお勧めします。

データ検証

内部検証フレームワークは、データセットまたはテーブルの検証レポートを更新するための連続したリクエスト中に必要な作業を最適化します。インクリメンタル検証プロセスは次のように動作します。

最後の検証以降に更新が発生していなくても、特定の制約は体系的に再検証されます。これらは、不明な依存関係の制約です。次の場合、エレメントには不明な依存関係があります。

したがって、大規模なテーブルでは、次のことをお勧めします。

次のプロパティを使用して、検証レポートをログに記録するときのパフォーマンスへの影響を最小限に抑えることができます。

テーブルへのアクセス

機能

テーブルには通常、EBX® UI、データサービス、リクエストクエリ API を介してアクセスされます。このアクセスには、動的解決プロセスを含む独自の機能セットが含まれます。このプロセスは次のように動作します。

テーブルのクエリ

アーキテクチャとデザイン

テーブルの操作速度を向上させるために、永続的な Lucene インデックスは EBX® エンジンによって管理されます。

注意

インデックスの準備ができて OS メモリキャッシュに保持されている場合は、テーブルへのより高速なアクセスが保証されます。上記で述べたように、OS には十分なスペースが割り当てられていることが重要です。

パフォーマンスの考慮事項

クエリオプティマイザーは、リクエスト結果を計算するときにインデックスの使用を優先します。クエリがインデックスを利用できない場合、Java メモリで解決され、大容量でパフォーマンスが低下します。次のガイドラインが適用されます。

注意

  • インデックスの最適化の恩恵を受けることができるのは、XPath 述語と SQL クエリだけです。

  • 制限事項のセクションで説明されているように、一部のフィールドと一部のデータセットはインデックスに登録できません。

  • osd:label 関数を使用する XPath 述語は、インデックスの最適化の恩恵を受けることができません。

インデックスがまだ作成されていない場合は、テーブルへの最初のアクセス時に、インデックスを作成して永続化するために追加の時間が必要です。

テーブルデータブロックへのアクセスは、クエリをインデックスに対して計算できない場合 (ルールの解決、フィルター、または並べ替えのいずれの場合でも)、およびインデックスの構築に必要です。テーブルブロックがメモリに存在しない場合、データベースからそれらを取得するために追加の時間が必要です。

それとは別に、リクエスト/クエリのパフォーマンスに影響を与える可能性があるその他の考慮事項があります。

メモリ監視を介して情報を取得し、ログカテゴリを要求することができます。

テーブルへのアクセスと変更

次のアクセスはパフォーマンスの低下につながるため、回避する必要があります。

テーブルに対するその他の操作

新しいレコードの作成またはレコードの挿入は、主キーインデックスによって異なります。したがって、このインデックスがすでにロードされている場合、作成はほぼ即時になります。

履歴テーブルへの REST アクセス

履歴テーブル (merge_info フィールド) のマージ情報は、アクセスコストが高くなる可能性があります。パフォーマンスを向上させるために、クライアントコードがこのフィールドを必要としない場合は、includeMergeInfo パラメーターを false に設定する必要があります。

詳細については、履歴を参照してください。

フェッチサイズの設定

パフォーマンスを向上させるには、テーブルに対するリクエストの結果の予想サイズに応じてフェッチサイズを設定する必要があります。フェッチサイズが設定されていない場合は、デフォルト値が使用されます。

以下も参照してください。

他の Java カスタマイズのパフォーマンスチェックリスト

TIBCO EBX® は大量のデータをサポートするように設計されていますが、いくつかの一般的な要因によりパフォーマンスが低下する可能性があります。このセクションで説明する重要なポイントに対処することで、通常のパフォーマンスのボトルネックを解決できます。

高度なプログラム拡張

参考までに、次の表に、実装できるプログラム拡張機能の詳細を示します。

ユースケース

関与する可能性のあるプログラム拡張機能

検証

テーブルアクセス

EBX® コンテンツ表示

データの更新

大量のデータの場合、計算が非常に複雑なアルゴリズムを使用すると、パフォーマンスに深刻な影響を及ぼします。たとえば、制約のアルゴリズムの複雑さは O (n 2) です。データサイズが 100 の場合、結果のコストは 10000 に比例します (これにより、通常、すぐに結果が得られます)。ただし、データサイズが 10000 の場合、結果のコストは 10000000 に比例します。

パフォーマンスが低下するもう 1 つの理由は、外部リソースの呼び出しです。ローカルキャッシングは通常、このタイプの問題を解決します。

上記のユースケースの 1 つでパフォーマンスが低下する場合は、コード分析または Java プロファイリングツールを使用して問題を追跡することをお勧めします。

不要なインデックスの更新

Lucene インデックスの更新には時間がかかります。可能な限り避ける必要があります。

更新のタイミング

トランザクションのコンテキストでは、テーブルが変更され、次のいずれかの条件が発生すると、インデックスの更新が発生します。

  1. 主キーによるルックアップの場合、検索されたキーが現在のプロシージャ (または TableTrigger) で「タッチ」 (作成、変更、または削除) された場合、常に更新がトリガーされます。

  2. 標準のクエリ (またはリクエスト) の場合、現在のプロシージャ (または TableTrigger) でテーブルが変更されていると、インデックスの更新が常に実行されます)。

コーディングの推奨事項

  1. 主キーによるルックアップによる更新のトリガーを回避するには、開発者は、doCreateOccurrence または doModifyContent への最後の呼び出しから返された Adaptation オブジェクトを登録する必要があります。ルックアップを実行する代わりに、このオブジェクトを再利用します。

  2. 現在のプロシージャで削除されたレコードの主キーによるルックアップは避けてください。

  3. 更新をトリガーするクエリの場合、開発者はこのクエリをプロシージャで回避できるかどうかを検討する必要があります。

一括更新のトランザクションしきい値

通常、トランザクション内のアトミック更新の数が 10 5 のオーダーを超える場合は、単一のトランザクションを使用することはお勧めしません。大規模なトランザクションには、EBX® および基盤となるデータベースからの多くのリソース、特にメモリが必要です。

トランザクションサイズを減らすために、次のことが可能です。

一方、非常に小さいトランザクションサイズを指定すると、コミットごとに実行する必要のある永続的なタスクが原因で、パフォーマンスが低下する可能性もあります。

注意

トランザクションのアトミック性が保証されなくなったために中間コミットが問題になる場合は、専用のデータスペース内で一括更新を実行することをお勧めします。このデータスペースは、一括更新の直前に作成されます。更新が正常に完了しない場合は、データスペースを閉じて、最初の失敗の理由を修正した後、更新を再試行する必要があります。成功すると、データスペースを元のデータスペースに安全にマージできます。

トリガー

必要に応じて、メソッド ProcedureContext.setTriggerActivation を使用してトリガーを非アクティブ化できます。

ディレクトリ統合

認証と権限の管理には、ユーザーとロールのディレクトリが含まれます。

特定のディレクトリ実装が展開され、外部ディレクトリにアクセスする場合、ローカルキャッシュが確実に実行されるようにすると便利です。特に、最も頻繁に呼び出されるメソッドの 1 つは、Directory.isUserInRole です。

ドキュメント > リファレンスマニュアル > その他