TiFlashパイプライン実行モデル

このドキュメントでは、 TiFlashパイプライン実行モデルを紹介します。

v7.2.0 以降、 TiFlash は新しい実行モデルであるパイプライン実行モデルをサポートします。

  • v7.2.0 および v7.3.0 の場合: パイプライン実行モデルは実験的であり、 tidb_enable_tiflash_pipeline_modelによって制御されます。
  • v7.4.0 以降のバージョンの場合: パイプライン実行モデルが一般提供されます。これはTiFlashの内部機能であり、 TiFlashリソース制御と緊密に統合されています。 TiFlashリソース制御を有効にすると、パイプライン実行モデルが自動的に有効になります。 TiFlashリソース制御の使用方法の詳細については、 リソース制御を使用してリソースの分離を実現するを参照してください。さらに、v7.4.0 以降、システム変数tidb_enable_tiflash_pipeline_modelは非推奨になりました。

論文モーセル駆動型並列処理: メニーコア時代の NUMA 対応クエリ評価フレームワークからインスピレーションを得たTiFlashパイプライン実行モデルは、従来のスレッド スケジューリング モデルとは異なる、きめの細かいタスク スケジューリング モデルを提供します。これにより、オペレーティング システムのスレッド アプリケーションとスケジューリングのオーバーヘッドが削減され、きめ細かいスケジューリング メカニズムが提供されます。

設計と実装

オリジナルのTiFlashストリーム モデルは、スレッド スケジューリング実行モデルです。各クエリは複数のスレッドに個別に適用され、連携して実行されます。

スレッド スケジューリング モデルには次の 2 つの欠陥があります。

  • 同時実行性の高いシナリオでは、スレッドが多すぎると大量のコンテキスト切り替えが発生し、スレッドのスケジューリング コストが高くなります。
  • スレッド スケジューリング モデルは、クエリのリソース使用量を正確に測定したり、きめ細かいリソース制御を行うことができません。

新しいパイプライン実行モデルでは、次の最適化が行われます。

  • クエリは複数のパイプラインに分割され、順番に実行されます。各パイプラインでは、より良い時間的局所性を実現し、実行プロセス全体の効率を向上させるために、データ ブロックが可能な限りキャッシュ内に保持されます。
  • オペレーティング システムのネイティブ スレッド スケジューリング モデルを削除し、よりきめ細かいスケジューリング メカニズムを実装するために、各パイプラインは複数のタスクにインスタンス化され、タスク スケジューリング モデルを使用します。同時に、固定スレッド プールを使用して、オペレーティング システムのスレッド スケジューリングのオーバーヘッドが削減されます。

パイプライン実行モデルのアーキテクチャは次のとおりです。

TiFlash pipeline execution model design

上の図に示すように、パイプライン実行モデルは、パイプライン クエリ エグゼキューターとタスク スケジューラという 2 つの主要コンポーネントで構成されます。

  • パイプラインクエリエグゼキューター

    パイプライン クエリ エグゼキュータは、TiDB ノードから送信されたクエリ リクエストをパイプライン有向非巡回グラフ (DAG) に変換します。

    クエリ内のパイプライン ブレーカー演算子を検索し、パイプライン ブレーカーに従ってクエリを複数のパイプラインに分割します。次に、パイプライン間の依存関係に従って、パイプラインを DAG に組み立てます。

    パイプライン ブレーカーは、一時停止/ブロック ロジックを持つオペレーターです。このタイプのオペレータは、すべてのデータ ブロックを受信するまで上流オペレータからデータ ブロックを受け取り続け、処理結果を下流オペレータに返します。このタイプのオペレーターはデータ処理パイプラインを中断するため、パイプライン ブレーカーと呼ばれます。パイプライン ブレーカーの 1 つは集計オペレーターで、ハッシュ テーブル内のデータを計算して結果を下流オペレーターに返す前に、上流オペレーターのすべてのデータをハッシュ テーブルに書き込みます。

    クエリがパイプライン DAG に変換された後、パイプライン クエリ実行プログラムは依存関係に従って各パイプラインを順番に実行します。パイプラインは、クエリの同時実行性に応じて複数のタスクにインスタンス化され、実行のためにタスク スケジューラに送信されます。

  • タスクスケジューラ

    タスク スケジューラは、パイプライン クエリ エグゼキュータによって送信されたタスクを実行します。タスクは、異なる実行ロジックに従って、タスク スケジューラ内の異なるコンポーネント間で動的に切り替えられます。

    • CPUタスクスレッドプール

      データ フィルタリングや関数計算など、タスク内で CPU を大量に使用する計算ロジックを実行します。

    • IOタスクスレッドプール

      中間結果をディスクに書き込むなど、タスク内で IO 集中型の計算ロジックを実行します。

    • 原子炉を待つ

      ネットワークレイヤーがデータ パケットを計算レイヤーに転送するのを待つなど、タスク内の待機ロジックを実行します。

このページは役に立ちましたか?