🙄

TiDB のメモリ領域について - TiDB Memory Architecture -

に公開

はじめに

MySQL において Buffer Cache やそれに伴う Cache Hit は極めて重要であり、SQL 高速化において重要な要素でしたが、TiDB においてはそこまで Tuning の必要性がないと考えています。ただ、メモリ領域の要素を整理しておくことで更なる Latency / Throughput の改善のアプローチが検討できること、また運用における急激なメモリ増加において何に着目すべきかを判断する上で一助となれば幸いです。

TiDB メモリ領域

TiDB はそもそも構造上 TiDB と TiKV で分離されており各々にキャッシュを持ちます。

Coprocessor Cache

SQL におけるフィルタリング、集計、一部の結合は本来 TiKV 上で処理されます。その処理結果を TiDB 上に保持することにより TiKV への処理軽減や Network 通信の省略、Latency の減少に寄与するパラメータ領域です。MySQL の結果キャッシュに類似しているものです。勿論、対象テーブルに更新があった場合には cache が無効になり、TiKV で計算されます。

Plan Cache

実行計画を Cache する領域です。実行計画の処理自体は数十~数百 μsec オーダーなので通常あまり問題になりません。この領域をあまり Tuning することはないと思いますが、もしボトルネックがある場合には tidb_instance_plan_cache_max_size でのサイズ増加を検討してください。

SQL Cache

「SQL cache」という呼称は公式ではありませんが、SQL の実行を行う上で必要な下記動作においてもメモリ領域が使用されます。ワークロードや SQL の特性によって最も増減が激しい部分になります。運用上のメモリ増加はこの領域に起因するケースが多いと考えられます。メモリアラートが発生した場合には TiDB の考え方に従い、TiDB のスケールアウトを検討してください。

  • sort
  • group by
  • hash 結合
  • Client に結果を送信する過程での結果保持

Cache Table

TiDB 特有の cache です。キャッシュテーブルのサイズ制限は64MBであり小さい、かつ更新があった場合には一旦無効になるため、更新頻度の小さい master data を指定してこの cache を活用するといったユースケースになります。

TiKV メモリ領域

MemTable

TiKV に書き込みを行う際にまずデータを格納するメモリ領域です。この領域自体を特に意識するユースケースはないと思います。

Block Cache

TiKV から読み取り要求があった Key-Value を保持するメモリ領域です。MySQL における innodb_buffer_pool に最も近いメモリ領域です。default では OS Memory の 45% を確保します。但し、60% 以上に設定することは推奨されていません。
read が支配的、かつ大規模 DB の workload で latency 低下を極限まで追求したい場合に変更はありかもしれませんが、基本的に変更は不要です。

IME cache

TiKV MVCC インメモリ エンジン (IME) の領域です。頻繁に更新または削除されるレコードを参照し、それらの処理が競合するほどの同時実行性を持つユースケースの場合は意識する必要があるかもしれませんが、こちらも通常は意識する必要はありません。

Raft Log Cache

TiKV は内部的に Rocksdb であり、Rocksdb の更新履歴を格納するメモリ領域です。(MySQL の innodb_log_buffer_size と似ています)。こちらも通常は意識する必要がないものです。

どういった場合に変更を検討するか?

基本的に数万 qps までの一般的な OLTP ワークロード Memory Tuning は必要ありません。また私自身も Memory Tuning が必要になった経験はありません。Buffer Tuning が必要になる多くのケースで大規模データの range scan が挙げられますが、TiDB の場合には range scan は TiFlash に処理を任せるほうが適切です。

  • TiDB の実行計画のパースの時間が明確に長い場合
    • Plan Cash Size の増加
  • 参照が支配的かつ大規模データを管理する場合
    • TiKV Block Cache の増加
  • 更新頻度の master table を cache させ、latency を追求したい
    • Cache Table の利用

Discussion