9.10.1 排他制御用プールの分割の概要
通常,排他制御の処理はサーバごとに一元管理されており,排他制御用プールは一つです。そのため,トランザクションの多重実行数と稼働率が高いシステムでは,排他制御処理のためのスレッド間ロック待ち数がトランザクションの常時多重実行数と同じになり,排他制御の操作に時間が掛かってしまいます。
この状態は,排他制御用プールを複数に分割して,排他制御の処理を分散させることで回避できます。排他制御用プールを分割したものを排他制御用プールパーティションといいます。
それぞれの排他資源が,異なる排他制御用プールパーティションを使用すると,排他制御処理が分散され,排他制御処理のためのスレッド間ロック待ち数が少なくなる場合があります。これによって,排他制御に掛かる時間が減るため,SQLの実行時間が短縮できます。排他制御処理の分散の例を次の図に示します。
- [説明]
-
排他制御用プールが一つの場合は,排他資源Aの排他操作が終わるまで,排他資源B及びCの排他操作は待たされます。一方,排他制御用プールが複数ある場合は,排他資源A,排他資源B,排他資源Cそれぞれの排他操作が同時に行われます。
ただし,特定の排他資源に対して処理が集中した場合は,排他制御処理は分散されません。この場合,排他制御用プールパーティションのスレッド間ロック待ち数は変わらないため,SQLの実行時間は短縮できません。
(1) 指定方法
pd_lck_pool_partitionオペランド(フロントエンドサーバの場合はpd_fes_lck_pool_partitionオペランド)に排他制御用プールの分割数を指定します。これによって,排他制御処理を分散させることができます。
pd_lck_pool_partitionオペランド及びpd_fes_lck_pool_partitionオペランドについては,マニュアル「HiRDB Version 9 システム定義」を参照してください。
指定値を決定する手順を次の図に示します。
(a) 初期構築時
pd_lck_pool_partitionオペランド(フロントエンドサーバの場合,pd_fes_lck_pool_partitionオペランド)を省略します。
また,初期構築以降にチューニングした場合,共用メモリの使用量が変わります。そのため,チューニングする可能性がある場合は,事前に共用メモリの使用量を計算して必要な物理メモリの確保,及びOSパラメタの設定をすることを推奨します。
(b) チューニング
排他制御用プールパーティション数をチューニングする場合は,次の情報が必要になります。
-
SQL実行時間(SQLトレースに出力されます)
-
サーバごとの排他制御用プールパーティションのスレッド間ロック待ち数(システムの稼働に関する統計情報に出力されます)
-
排他制御用プールパーティションごとの排他制御用プールパーティションのスレッド間ロック待ち数(pdls -d lck -Tコマンドで表示されます)
実際に業務内容を想定した多重実行数と稼働率でアプリケーションを実行し,チューニング情報を取得してください。取得したチューニング情報を基に排他制御用プールパーティション数を徐々に増加しながら,業務アプリケーション全体でSQL実行時間の合計が最も短くなる排他制御用プールパーティション数を設定してください。
ただし,次に示す場合は排他制御用プールパーティション数をチューニング前の値に戻して,ほかの方法で性能向上を図ってください。
-
排他制御用プールパーティション数を増やしたが,排他制御用プールパーティションのスレッド間ロック待ち数が減少しない場合
-
排他制御用プールパーティション数を増やしたことによって排他制御用プールパーティションのスレッド間ロック待ち数が減少したが,SQLの実行時間が短くならない場合
なお,排他制御処理を分散させた場合,ハッシュ分割によって排他資源ごとに使用する排他制御用プールパーティションを決定します。そのため,対象となる排他資源によっては,使用する排他制御用プールパーティションに偏りが発生することがあります。使用する排他制御用プールパーティションが偏ると,次の現象が発生するおそれがあります。
-
排他制御の性能が改善しない
pdls -d lck -Tコマンドを実行し,排他制御用プールパーティションごとのスレッド間ロック待ち数の平均値に偏りがあるかどうか確認してください。偏りがある場合は,pd_lck_pool_partitionオペランド(フロントエンドサーバの場合はpd_fes_lck_pool_partitionオペランド)の値を,現在の指定値より大きい素数に変更してください。これによって,ハッシュ分割の偏りを解消します。
-
排他制御用プールパーティションのサイズ不足
pdls -d lck -p -eコマンドを実行し,排他制御用プールパーティションごとに使用した排他資源の使用率の最高値が,パーティションごとに大きく異なるかどうか確認してください。大きく異なっている場合は,pd_lck_pool_partitionオペランド(フロントエンドサーバの場合はpd_fes_lck_pool_partitionオペランド)の値を,現在の指定値より大きい素数に変更してください。これによって,ハッシュ分割の偏りを解消します。又は,pd_lck_pool_sizeオペランド(フロントエンドサーバの場合はpd_fes_lck_pool_sizeオペランド)の値を増やしてください。これによって,排他資源管理テーブルの容量を増やします。
- 参考
-
排他制御用プールのサイズは,pd_lck_pool_sizeオペランドで変更します。排他制御用プールはHiRDBによって排他制御用プールパーティションに割り当てられるため,排他制御用プールパーティションのサイズは排他制御用プールのサイズに比例します。排他制御用プールパーティションの利用率は,システムの稼働に関する統計情報に出力されます。利用率が高い場合は,より多くの排他資源を必要とするトランザクションを実行すると排他制御用プールパーティションのサイズ不足が発生し,トランザクションが実行できなくなります。その場合は,pd_lck_pool_sizeオペランドの指定値を増加することを検討してください。なお,システムの稼働に関する統計情報については,マニュアル「HiRDB Version 9 コマンドリファレンス」を参照してください。
(2) 排他制御処理を分散させた場合のメリット及びデメリット
排他制御処理を分散させた場合のSQLごとのメリット及びデメリットを次の表に示します。
SQL |
排他制御用プールパーティション数を増やした場合 |
排他制御用プールパーティション数を減らした場合 |
||
---|---|---|---|---|
メリット |
デメリット |
メリット |
デメリット |
|
処理完了時にCOMMIT及びROLLBACKをしないSQL(ほとんどの操作系SQL及び制御系SQLの一部など) |
多重実行時のSQL性能が向上します。 |
SQL単体の性能が劣化します。 |
SQL単体の性能が向上します。 |
多重実行時のSQLの性能が劣化します。 |
処理完了と同時にCOMMIT又はROLLBACKをするSQL(COMMIT,ROLLBACK,定義系SQL,PURGE TABLEなど) |
− |
多重実行時のSQLの性能が劣化します。また,SQL単体の性能も劣化します。 |
多重実行時のSQLの性能が向上します。また,SQL単体での性能も向上します。 |
− |
(3) 注意事項
-
排他制御処理を分散させると,排他制御が使用する管理情報を排他制御用プールパーティション数分追加するため,ユニットコントローラ用共用メモリのサイズが増加します。ユニットコントローラが使用する共用メモリの計算式については,マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。排他制御用プールパーティション数を増やす場合は,ユニットコントローラ用共用メモリのサイズの増加によって,物理メモリやOSパラメタの指定値が不足しないよう,必要に応じてシステム構成を変更してください。
-
排他制御用プールパーティションのスレッド間ロック待ち数が0,又は0に近い値の場合でも,スレッド間ロック待ちが発生していることがあります。その場合は,「チューニング」を行っても性能が向上しないことがあります。性能が向上しないときは,次を実施してください。
・同時実行するUAP又はユティリティの数を減らす
・業務又はHiRDBシステム定義を見直して,排他要求数を減らす