説明
このドキュメントは、obcdc V3.2.4.5以降、V4.0以前、およびV4.2.1以降のバージョンに適用されます。
obcdcのフロー制御機能は、ほとんどのシナリオで、obcdc実行時のメモリ使用量をユーザーの想定値付近に抑えることができます。memory_limit構成パラメータを使用して、obcdcのメモリ使用量を調整できます。
obcdc内部には複数のモジュールがあり、トランザクションデータはこれらのモジュール間で転送されます。全体的なデータ生成・消費モデルは、いくつかの直列接続された生成・消費モデルとして大まかに理解できます。フロー制御の調整は、主にデータ消費モジュールとログ取得モジュールという2つの主要なモジュールのメモリ制御に分かれます。
データ消費モジュールの制限
ユーザーの消費が遅い場合、データ消費モジュールのタスク配布進捗を制御し、大量のデータが生成されても消費されず、メモリ使用量が過剰になる状況を防ぎます。obcdcは、消費キューとリソース回収キューのタスク滞り状況に基づいて、下流の消費速度を判断します。滞り率がpause_redo_dispatch_task_count_threshold/100を超え、かつメモリ使用量がアラートしきい値(memory_limit * memory_usage_warn_threshold/100)に達した場合、または処理中のREDOログが一定のしきい値に達した場合、下流の消費速度が遅いと判断されます。
NEED_PAUSE_REDO_DISPATCH=1ログキーワードを使用して、libobcdc.logから消費モジュールの制限ログを取得できます。その中のREASONフィールドには、具体的な制限理由が記述されています。
ログ取得モジュールの制限
以下の場合、obcdcはログ取得のフロー制御をトリガーします:
メモリ使用量がアラートしきい値(memory_limit * memory_usage_warn_threshold/100)に達した場合。
メモリ内のアクティブトランザクションが一定のしきい値を超え、かつデータ消費のフロー制御が既にトリガーされた場合。
シーケンシングモジュールのタスクが滞っている場合。
データ永続化タスクが滞っている場合。
NEED_SLOW_DOWN=1ログキーワードを使用して、libobcdc.logからログ取得の制限ログを取得できます。その中のREASONフィールドには、具体的な制限理由が記述されています。
上記の一部のパラメータの説明は以下のとおりです:
| パラメータ | デフォルト値 | 値の範囲 | 説明 |
|---|---|---|---|
| memory_limit | 8G | [2G, +∞) | 期待されるobcdcのメモリ使用量 |
| memory_usage_warn_threshold | 85 | [0,100] | ストリーム制御検出を開始するメモリ使用量のしきい値 |
| pause_redo_dispatch_task_count_threshold | 80 | [0, 100] | 消費モジュールの制限をトリガーするユーザー消費キューとリソース回収キューの積み残し割合のしきい値 |
obcdc内部には、さらに多くの細粒度のフロー制御調整アルゴリズムと対応するフロー制御パラメータが存在します。これらのパラメータは、設定したmemory_limitに基づいて自動的に調整されますが、ごく一部のシナリオではこれらのパラメータを微調整する必要がある場合があります。ここにこれらのパラメータを参考としてリストアップします。ただし、ほとんどの場合、これらのパラメータを調整する必要はありません。
フロー制御に関連する、obcdcが自動的に調整する構成パラメータは以下のとおりです。詳細については、obcdc構成パラメータの説明を参照してください。
redodispatcher_memory_limit
extra_redo_dispatch_memory_size
redo_dispatched_memory_limit_exceed_ratio
part_trans_task_active_count_upper_bound
part_trans_task_reusable_count_upper_bound
ready_to_seq_task_upper_bound
storager_task_count_upper_bound
storager_mem_percentage