グループコミットは、OBKVの単一操作リクエストを対象とするパフォーマンス最適化機能です。サーバー側で複数のリクエストをまとめ、バッチとして計算・書き込み・読み取りを実行することで、トランザクション処理やストレージへの呼び出し回数を減らします。
サポート範囲
現在のグループコミットは、Tableモデルで以下の単一操作をサポートしています:
- get
- put
- insert
- delete
- replace
- update
- insert_or_update
- increment
- append
Tableモデルの単一操作に関する詳細は、OBKV-Table Javaクライアントがサポートするインターフェースを参照してください。
使用方法
使用方法は、サーバー側で対応するパラメータを設定して有効にするだけです。グループコミットが有効になると、インターフェースの動作や使い方は従来と変わりませんが、パフォーマンスが向上することが期待されます。
グループコミット機能では、kv_group_commit_batch_size と kv_group_commit_rw_mode の2つのパラメータを提供し、その有効化と無効化を制御します。具体的な説明は以下の通りです:
パラメータ
kv_group_commit_batch_size1回のバッチにまとめるリクエスト数を指定します。デフォルト値の
1ではグループコミットが無効になり、1より大きい値で有効になります。設定値は、グループコミットを利用する単一操作のパフォーマンスに影響します。パラメータkv_group_commit_batch_sizeの詳細については、kv_group_commit_batch_sizeを参照してください。設定方法は以下の通りです:
// デフォルト値で、グループコミット操作を無効にします alter system set kv_group_commit_batch_size = 1 tenant=<tenant_name>; // グループコミットのbatch_sizeを10に設定します alter system set kv_group_commit_batch_size = 10 tenant=<tenant_name>;パラメータ
kv_group_commit_rw_mode特定のシナリオでは、ユーザーは特定の操作でのみグループコミット機能を有効にし、他の操作では無効にしたい場合があります。例えば、読み書きトラフィックが均等でないシナリオでは、読み取りが少なく書き込みが多い場合、読み取りリクエストがバッチにまとまるまでの待ち時間が長くなり、結果として読み取りリクエストの応答遅延が生じることがあります。このような場合、書き込み操作のみをグループコミットで行うことができます。
kv_group_commit_rw_modeはグループコミットが有効な場合にのみ適用され、デフォルトでは ALL が指定されており、すべての操作がグループコミットをサポートすることを意味します。READ は読み取り操作のみがグループコミットをサポートすることを意味し、WRITE は書き込み操作のみがグループコミットをサポートすることを意味します。パラメータkv_group_commit_rw_modeの詳細については、kv_group_commit_rw_modeを参照してください。設定方法は以下の通りです:
// デフォルト値で、すべての操作タイプがグループコミットをサポートすることを意味します alter system set kv_group_commit_rw_mode = 'ALL' tenant=<tenant_name>; // 読み取り操作のみがグループコミットをサポートすることを意味します alter system set kv_group_commit_rw_mode = 'READ' tenant=<tenant_name>;パラメータ
kv_group_commit_rw_modeの各値が表す操作は以下の通りです:- ALL が表す操作:Tableモデルのすべての単一操作。
- WRITE が表す操作:get を除く操作。
- READ が表す操作:get。
モニタリング
グループコミットには、対応するモニタリングビュー (G)V$OB_KV_GROUP_COMMIT_STATUS が提供されています。有効な場合、グループコミット関連のビューをクエリすることで、該当するリクエストのグループコミット状態情報を確認できます。グループコミットでは、異なるタイプの操作が異なるグループに分類され、各グループにはKV操作リクエストを格納するためのリクエストキューがあります。ワーカースレッドはリクエストキューから指定された batch_size のリクエストを取り出し、バッチ操作を構成して一括実行した後、応答を返します。
- システムテナントでは、
GV$OB_KV_GROUP_COMMIT_STATUSはすべてのOBKVテナントのグループコミット状態情報にアクセスできます。ビューGV$OB_KV_GROUP_COMMIT_STATUSの詳細については、GV$OB_KV_GROUP_COMMIT_STATUS を参照してください。V$OB_KV_GROUP_COMMIT_STATUSは、現在のobserverノード上のすべてのテナントのグループコミット状態情報を記録します。ビューV$OB_KV_GROUP_COMMIT_STATUSの詳細については、V$OB_KV_GROUP_COMMIT_STATUS を参照してください。 - 通常テナントでは、
GV$OB_KV_GROUP_COMMIT_STATUSは自身のテナントのグループコミット状態情報のみにアクセスできます。ビューGV$OB_KV_GROUP_COMMIT_STATUSの詳細については、GV$OB_KV_GROUP_COMMIT_STATUS を参照してください。V$OB_KV_GROUP_COMMIT_STATUSは、現在のobserverノード上の自身のテナントのグループコミット状態情報のみにアクセスできます。ビューV$OB_KV_GROUP_COMMIT_STATUSの詳細については、V$OB_KV_GROUP_COMMIT_STATUS を参照してください。
制限事項
マイナーコンパクションが発生する場合、グループコミットの性能はディスクのI/O性能に制約されます。ディスクI/Oがボトルネックになると、グループコミットの性能が低下します。
負荷が低いシナリオでは、グループコミット機能を有効にすることは推奨されません。例えば、16C32Gのテナント仕様では、CPU負荷が60%を下回る場合、書き込み操作において、batch_sizeを5未満に設定すると一定の最適化が見られますが、10を超えるとパフォーマンスが低下します。読み取り操作においては、有効にしても全体的なパフォーマンス向上は顕著ではありません。