この章では、Oracle B2Bのパフォーマンスをチューニングする方法について説明します。内容は次のとおりです。
Oracle B2B (Business to Business)は、企業と取引パートナ間におけるセキュアで信頼性の高いビジネス・ドキュメントの交信を可能にするE-Commerceゲートウェイです。Oracle B2Bは、Business-to-Businessのドキュメント標準、セキュリティ、トランスポート、メッセージング・サービス、および取引パートナ管理をサポートしています。Oracle B2BをOracle SOA Suiteコンポジット・アプリケーション内でバインディング・コンポーネントとして使用すると、エンドツーエンドのビジネス・プロセスを実装できます。
Oracle SOA Suiteの詳細は、『Oracle Fusion Middleware Oracle SOA Suite開発者ガイド』を参照してください。
次の項では、チューニング中にも考慮する必要がある、基本的なチューニング構成について説明します。
B2B_DATA_STORAGE表属性をチューニングすると、一部のデプロイメントでパフォーマンスを向上できます。ユースケース・シナリオを確認し、パフォーマンスを向上させるために次のことを検討します。
B2B_DATA_STORAGE表のロギング属性がNOLOGGING
に設定されている場合は、LOGGING
への変更を検討してください。
NOLOGGING
オプションを使用するDML操作の実行中に、制御ファイルに回復不可能なシステム変更番号(SCN)が記録され、データの負荷が高い場合に制御ファイルの競合が発生する場合があります。
B2B_DATA_STORAGE表のLOB列をSecureFilesに移行させることを検討してください。
128パーティションのHASH(ID)を使用してB2B_DATA_STORAGE表をパーティション化します。
64パーティションのグローバルHASH(ID)を使用してPK索引をパーティション化します。
メタデータ・サービス(MDS)インスタンスのキャッシュ・サイズの値を変更すると、パフォーマンスを改善できます。xmx-to-mdsCache
値の比率として5:1をお薦めします。たとえば、xmx
サイズが1024の場合、mdsCache
に200MBを維持します。
Oracle Enterprise Manager Fusion Middleware Controlを使用して、これらの設定を変更できます。詳細は、『Oracle Fusion Middleware Oracle SOA SuiteおよびOracle Business Process Management Suite管理者ガイド』のOracle B2Bの構成に関する項を参照してください。
B2Bはマルチスレッド化されたメッセージ処理エンジンで、インバウンド処理およびアウトバウンド処理の機能が明確に分離されています。
b2b.inboundThreadCount
およびb2b.outboundThreadCount
の値を変更すると、Oracle B2Bメッセージ処理を向上できます。推奨値は、使用しているシステムによって異なります。たとえば、2GBのコンピュータの場合、3から5の間の設定をお薦めします。b2b.inboundThreadSleepTime
およびb2b.outboundThreadSleepTime
プロパティは、メッセージ処理後にスレッドをスリープします。10から1000(ミリ秒)の間の設定をお薦めします。
Oracle Enterprise Manager Fusion Middleware Controlを使用して、これらの設定を変更できます。詳細は、『Oracle Fusion Middleware Oracle SOA SuiteおよびOracle Business Process Management Suite管理者ガイド』のOracle B2Bの構成に関する項を参照してください。
JMSアウト・キュー・コンポーネントは、B2BでJMSキューからデータを受け取れるようにする要素です。パフォーマンスを最大化するには、複数のJMSOUTQUEUESを有効にすることを検討し、対応するリスニング・チャネルをB2Bに作成してください。
Oracle HTTP Server (OHS)またはデータベースをチューニングすることで、B2Bのパフォーマンスを向上できます。この項では、次の内容について説明します。
Oracle HTTP Server (OHS)は、Oracle Fusion MiddlewareのWebサーバー・コンポーネントです。Oracle WebLogic Serverのリスナーを提供し、WebLogic Serverを通じて管理される様々なB2Bインスタンスに渡るHTTPのロード・バランシングに使用されます。このコンポーネントの詳細は、第6章「Oracle HTTP Serverのパフォーマンス・チューニング」を参照してください。
この項では、B2Bパフォーマンスを向上できるOHS構成をいくつか説明します。
構成ファイルmod_wl_oh.confは、エンド・ユーザーが受信リクエスト・パターンを構成するのに役立ちます。ロード・バランシングの一環として、受信リクエストはクラスタで指定されたサーバーにリダイレクトされます。
一致式は、「b2b/httpReceiver」の形式で受信HTTPリクエストを識別します。次に、リクエストは構成されたWebLogicクラスタで使用できる任意のサーバーに転送されます。
この構成スニペットは、次に示すようなものになります。
mod_wl_ohs.conf <IfModule weblogic_module> # WebLogicHost <WEBLOGIC_HOST> # WebLogicPort <WEBLOGIC_PORT> # Debug ON # WLLogFile /tmp/weblogic.log # MatchExpression *.jsp WeblogicCluster host.your.site:8000 MatchExpression /b2b/httpReceiver </IfModule>
httpd.conf構成ファイルには、同時に処理可能なHTTPリクエストの最大数、ロギング詳細、特定の制限およびタイムアウトが指定されています。ORACLE_INSTANCE/config/OHSComponent/<ohsname>/httpd.confにあります。
OHSリスニング・ポートを構成するには、httpd.confに次の変更を加えます。
OHSリッスン・ポートをリッスン7777に設定します。
次の接続プロパティを、示している値に設定します。
Timeout 600
MaxKeepAliveRequests 1000
KeepAliveTimeout 5
Worker Multi-Processing Module(MPM)は、マルチプロセス-マルチスレッド・モデルを採用しており、Microsoft Windowsプラットフォームを除くすべてのプラットフォームのデフォルトMPMです。マルチスレッド・サポートは少ないシステム・リソースの使用量で高いスケーラビリティを実現し、一方マルチプロセス・サポートは高い安定性を実現します。
次のWorker MPMパラメータのチューニングを検討してください。
このパラメータは、起動時に作成される子サーバー・プロセスの数を指定します。再起動後に急激な負荷が予想される場合は、必要な子サーバーの数に基づいてこの値を設定してください。デフォルト値は12です。
このパラメータは稼働するサーバーの総数を制限、つまり同時に接続可能なクライアントの数を制限します。クライアントの接続数がこの制限に到達すると、後続のリクエストはキューに入れられます。デフォルト値は1500です。
この項では、特定の問題を解決するために検討できるいくつかのチューニング構成を説明します。
20メッセージ/秒を超えるスケーリングの問題がある場合、B2B_DATA_STORAGEに別の表領域を作成することおよびブロック・サイズを16Kに変更することを検討してください。
この解決策は、次の例に示すようなものになります。
CREATE TABLE "PS121_SOAINFRA"."B2B_DATA_STORAGE" ( "VALUE_SELECTOR" VARCHAR2(256), "CLOB_VALUE" CLOB, "BLOB_VALUE" BLOB, "DATA_SIZE" NUMBER(10,0), "ATTRIBUTE1" VARCHAR2(256), "ATTRIBUTE2" VARCHAR2(256), "LABEL" VARCHAR2(256), "DOCUMENT_ID" VARCHAR2(200), "JOB_ID" VARCHAR2(128), "ID" VARCHAR2(256) NOT NULL ENABLE, CONSTRAINT "B2B_DATA_STORAGE_PK" PRIMARY KEY ("ID") USING INDEX PCTFREE 50 INITRANS 85 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "B2B_DATA_STORAGE_TABLE" ENABLE, CONSTRAINT "B2B_DS_DOC_ID_FK" FOREIGN KEY ("DOCUMENT_ID") REFERENCES "PS121_SOAINFRA"."XML_DOCUMENT" ("DOCUMENT_ID") ENABLE ) PCTFREE 10 PCTUSED 40 INITRANS 75 MAXTRANS 255 NOCOMPRESS NOLOGGING STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "B2B_DATA_STORAGE_TABLE" LOB ("CLOB_VALUE") STORE AS BASICFILE ( TABLESPACE "B2B_DATA_STORAGE_TABLE" ENABLE STORAGE IN ROW CHUNK 16384 NOCACHE NOLOGGING STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)) LOB ("BLOB_VALUE") STORE AS BASICFILE "BASICFILE1"( TABLESPACE "B2B_DATA_STORAGE_TABLE" ENABLE STORAGE IN ROW CHUNK 16384 NOCACHE NOLOGGING STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)) REM END PS121_SOAINFRA B2B_DATA_STORAGE REM START PS121_SOAINFRA B2B_IDX_DS_DOC CREATE INDEX "PS121_SOAINFRA"."B2B_IDX_DS_DOC" ON "PS121_SOAINFRA"."B2B_DATA_STORAGE" ("DOCUMENT_ID") PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "PS121_SOAINFRA" REM END PS121_SOAINFRA B2B_IDX_DS_DOC
CPU使用を効率よくして1秒当たりのメッセージの最大スループットを増やすために、統計を収集することができます。これを実現するには、次の手順を実行する必要があります。
すべての重要な表の自動統計を有効にします。
すべての重要な表の表統計をロック解除します。
変更したすべての表の表統計を収集します。
すべての重要な表の表統計をロックします。
自動統計を無効にします。
次にコードの例を示します。
自動統計の有効化
EXEC DBMS_SCHEDULER.ENABLE('SYS.BSLN_MAINTAIN_STATS_JOB');
自動統計のロック解除
exec DBMS_STATS.UNLOCK_Table_Stats(ownname=>'PS121_SOAINFRA',tabname=>'B2B_BUSINESS_MESSAGE'); exec DBMS_STATS.UNLOCK_Table_Stats(ownname=>'PS121_SOAINFRA',tabname=>'B2B_EXT_BUSINESS_MESSAGE'); exec DBMS_STATS.UNLOCK_Table_Stats(ownname=>'PS121_SOAINFRA',tabname=>'B2B_WIRE_MESSAGE'); exec DBMS_STATS.UNLOCK_Table_Stats(ownname=>'PS121_SOAINFRA',tabname=>'B2B_DATA_STORAGE'); exec DBMS_STATS.UNLOCK_Table_Stats(ownname=>'PS121_SOAINFRA',tabname=>'B2B_APP_MESSAGE'); exec DBMS_STATS.UNLOCK_Table_Stats(ownname=>'PS121_SOAINFRA',tabname=>'B2B_BUSINESS_MESSAGE_RETRY'); exec DBMS_STATS.UNLOCK_Table_Stats(ownname=>'PS121_SOAINFRA',tabname=>'B2B_HA_REGISTRY'); exec DBMS_STATS.UNLOCK_Table_Stats(ownname=>'PS121_SOAINFRA',tabname=>'B2B_LIFECYCLE');
すべての重要な表からの統計の収集
exec DBMS_STATS.Gather_Table_Stats(ownname=>'PS121_SOAINFRA', tabname => 'B2B_BUSINESS_MESSAGE', estimate_percent=>100, cascade=>TRUE, method_opt=>'FOR ALL COLUMNS SIZE 254', degree =>DBMS_STATS.AUTO_DEGREE); exec DBMS_STATS.Gather_Table_Stats(ownname=>'PS121_SOAINFRA', tabname => 'B2B_EXT_BUSINESS_MESSAGE', estimate_percent=>100, cascade=>TRUE, method_opt=>'FOR ALL COLUMNS SIZE 254', degree =>DBMS_STATS.AUTO_DEGREE); exec DBMS_STATS.Gather_Table_Stats(ownname=>'PS121_SOAINFRA', tabname => 'B2B_WIRE_MESSAGE', estimate_percent=>100, cascade=>TRUE, method_opt=>'FOR ALL COLUMNS SIZE 254', degree =>DBMS_STATS.AUTO_DEGREE); exec DBMS_STATS.Gather_Table_Stats(ownname=>'PS121_SOAINFRA', tabname => 'B2B_DATA_STORAGE', estimate_percent=>100, cascade=>TRUE, method_opt=>'FOR ALL COLUMNS SIZE 254', degree =>DBMS_STATS.AUTO_DEGREE); exec DBMS_STATS.Gather_Table_Stats(ownname=>'PS121_SOAINFRA', tabname => 'B2B_APP_MESSAGE', estimate_percent=>100, cascade=>TRUE, method_opt=>'FOR ALL COLUMNS SIZE 254', degree =>DBMS_STATS.AUTO_DEGREE); exec DBMS_STATS.Gather_Table_Stats(ownname=>'PS121_SOAINFRA', tabname => 'B2B_BUSINESS_MESSAGE_RETRY', estimate_percent=>100, cascade=>TRUE, method_opt=>'FOR ALL COLUMNS SIZE 254', degree =>DBMS_STATS.AUTO_DEGREE); exec DBMS_STATS.Gather_Table_Stats(ownname=>'PS121_SOAINFRA', tabname => 'B2B_HA_REGISTRY', estimate_percent=>100, cascade=>TRUE, method_opt=>'FOR ALL COLUMNS SIZE 254', degree =>DBMS_STATS.AUTO_DEGREE); exec DBMS_STATS.Gather_Table_Stats(ownname=>'PS121_SOAINFRA', tabname => 'B2B_LIFECYCLE', estimate_percent=>100, cascade=>TRUE, method_opt=>'FOR ALL COLUMNS SIZE 254', degree =>DBMS_STATS.AUTO_DEGREE);
表のロック
exec DBMS_STATS.Lock_Table_Stats(ownname=>'PS121_SOAINFRA',tabname=>'B2B_BUSINESS_MESSAGE'); exec DBMS_STATS.Lock_Table_Stats(ownname=>'PS121_SOAINFRA',tabname=>'B2B_EXT_BUSINESS_MESSAGE'); exec DBMS_STATS.Lock_Table_Stats(ownname=>'PS121_SOAINFRA',tabname=>'B2B_WIRE_MESSAGE'); exec DBMS_STATS.Lock_Table_Stats(ownname=>'PS121_SOAINFRA',tabname=>'B2B_DATA_STORAGE'); exec DBMS_STATS.Lock_Table_Stats(ownname=>'PS121_SOAINFRA',tabname=>'B2B_APP_MESSAGE'); exec DBMS_STATS.Lock_Table_Stats(ownname=>'PS121_SOAINFRA',tabname=>'B2B_BUSINESS_MESSAGE_RETRY'); exec DBMS_STATS.Lock_Table_Stats(ownname=>'PS121_SOAINFRA',tabname=>'B2B_HA_REGISTRY'); exec DBMS_STATS.Lock_Table_Stats(ownname=>'PS121_SOAINFRA',tabname=>'B2B_LIFECYCLE');
自動統計の無効化
EXEC DBMS_SCHEDULER.DISABLE('SYS.BSLN_MAINTAIN_STATS_JOB');
挿入の数が多いためにI/O競合が発生した場合、表領域をパーティション化してください。
次に示すように、表を作成する必要があります。
DROP TABLE B2B_DATA_STORAGE;
CREATE TABLE B2B_DATA_STORAGE ( "VALUE_SELECTOR" VARCHAR2(256), "CLOB_VALUE" CLOB, BLOB_VALUE BLOB, DATA_SIZE NUMBER(10,0), ATTRIBUTE1 VARCHAR2(256), ATTRIBUTE2 VARCHAR2(256), LABEL VARCHAR2(256), DOCUMENT_ID VARCHAR2(200), JOB_ID VARCHAR2(128), "CPST_INST_CREATED_TIME" TIMESTAMP (6) DEFAULT systimestamp-30, ID VARCHAR2(256) NOT NULL ) TABLESPACE B2B_DATA_STORAGE_TABLE LOB (CLOB_VALUE) STORE AS SECUREFILE (TABLESPACE B2B_DATA_STORAGE_TABLE) LOB (BLOB_VALUE) STORE AS SECUREFILE BASICFILE1(TABLESPACE B2B_DATA_STORAGE_TABLE) partition by hash(id) partitions 100 store in(B2B_DATA_STORAGE_TABLE); ALTER TABLE B2B_DATA_STORAGE ADD CONSTRAINT B2B_DATA_STORAGE_PK PRIMARY KEY (ID) USING INDEX (CREATE UNIQUE INDEX B2B_DATA_STORAGE_PK ON B2B_DATA_STORAGE (ID) TABLESPACE B2B_DATA_STORAGE_TABLE REVERSE); CREATE INDEX B2B_IDX_DS_DOC ON B2B_DATA_STORAGE (DOCUMENT_ID) TABLESPACE B2B_DATA_STORAGE_TABLE; ALTER TABLE B2B_DATA_STORAGE ADD CONSTRAINT B2B_DS_DOC_ID_FK FOREIGN KEY (DOCUMENT_ID) REFERENCES XML_DOCUMENT (DOCUMENT_ID);
次に、表に次のような制約を追加する必要があります。
ALTER TABLE B2B_WIRE_MESSAGE ADD CONSTRAINT B2B_WM_DS_FK FOREIGN KEY(PACKED_MESSAGE) REFERENCES B2B_DATA_STORAGE (ID) ON DELETE CASCADE ENABLE; ALTER TABLE B2B_WIRE_MESSAGE ADD CONSTRAINT B2B_WM_PS_FK FOREIGN KEY(PAYLOAD_STORAGE) REFERENCES B2B_DATA_STORAGE (ID) ON DELETE CASCADE ENABLE; ALTER TABLE B2B_BUSINESS_MESSAGE ADD CONSTRAINT B2B_BM_NDS_FK FOREIGN KEY (NATIVE_DATA_STORAGE) REFERENCES B2B_DATA_STORAGE (ID) ON DELETE CASCADE ENABLE; ALTER TABLE B2B_BUSINESS_MESSAGE ADD CONSTRAINT B2B_BM_TDS_FK FOREIGN KEY (TRANSLATED_DATA_STORAGE) REFERENCES B2B_DATA_STORAGE (ID) ON DELETE CASCADE ENABLE; ALTER TABLE B2B_BUSINESS_MESSAGE ADD CONSTRAINT B2B_BM_AS_FK FOREIGN KEY (ATTACHMENT_STORAGE) REFERENCES B2B_DATA_STORAGE (ID) ON DELETE CASCADE ENABLE; ALTER TABLE B2B_BUSINESS_MESSAGE ADD CONSTRAINT B2B_BM_PS_FK FOREIGN KEY (PAYLOAD_STORAGE) REFERENCES B2B_DATA_STORAGE (ID) ON DELETE CASCADE ENABLE; ALTER TABLE B2B_APP_MESSAGE ADD CONSTRAINT B2B_AM_PAYLOAD_FK FOREIGN KEY (PAYLOAD) REFERENCES B2B_DATA_STORAGE (ID) ON DELETE CASCADE ENABLE; ALTER TABLE B2B_APP_MESSAGE ADD CONSTRAINT B2B_AM_AS_FK FOREIGN KEY (ATTACHMENT_STORAGE) REFERENCES B2B_DATA_STORAGE (ID) ON DELETE CASCADE ENABLE;