メインコンテンツまでスキップ
バージョン: Latest-3.4

メモリ管理

このセクションでは、メモリの分類と StarRocks におけるメモリ管理の方法を簡単に紹介します。

メモリの分類

説明:

MetricNameDescription
processBE の使用メモリ合計
query_poolデータクエリによるメモリ使用量実行レイヤーとストレージレイヤーの2つの部分から成ります。
loadデータロードによるメモリ使用量一般的に MemTable
table_metaメタデータメモリS Schema、Tablet メタデータ、RowSet メタデータ、Column メタデータ、ColumnReader、IndexReader
compactionマルチバージョンメモリコンパクションデータインポート完了後に発生するコンパクション
snapshotスナップショットメモリ一般的にクローンに使用され、メモリ使用量は少ない
column_poolカラムプールメモリカラムキャッシュを解放してカラムを加速するためのリクエスト
page_cacheBE の独自の PageCacheデフォルトはオフで、ユーザーは BE ファイルを変更してオンにできます

メモリ関連の設定

  • BE 設定
NameDefaultDescription
vector_chunk_size4096チャンク行数
mem_limit90%BE プロセスメモリの上限。パーセンテージ("80%")または物理的な制限("100G")として設定できます。デフォルトのハードリミットはサーバーメモリサイズの90%、ソフトリミットは80%です。同じサーバーで他のメモリ集約型サービスと一緒に StarRocks をデプロイしたい場合、このパラメータを設定する必要があります。
disable_storage_page_cachefalsePageCache を無効にするかどうかを制御するブール値。PageCache が有効な場合、StarRocks は最近スキャンされたデータをキャッシュします。PageCache は、類似のクエリが頻繁に繰り返される場合にクエリパフォーマンスを大幅に向上させることができます。true は PageCache を無効にすることを示します。この項目は storage_page_cache_limit と一緒に使用し、十分なメモリリソースと多くのデータスキャンがあるシナリオでクエリパフォーマンスを加速できます。この項目のデフォルト値は StarRocks v2.4 以降 true から false に変更されました。
write_buffer_size104857600単一の MemTable の容量制限で、これを超えるとディスクスワイプが行われます。
load_process_max_memory_limit_bytes107374182400BE ノード上のすべてのロードプロセスが占有できるメモリリソースの上限。その値は mem_limit * load_process_max_memory_limit_percent / 100load_process_max_memory_limit_bytes の小さい方です。このしきい値を超えると、フラッシュとバックプレッシャーがトリガーされます。
load_process_max_memory_limit_percent30BE ノード上のすべてのロードプロセスが占有できるメモリリソースの最大パーセンテージ。その値は mem_limit * load_process_max_memory_limit_percent / 100load_process_max_memory_limit_bytes の小さい方です。このしきい値を超えると、フラッシュとバックプレッシャーがトリガーされます。
default_load_mem_limit2147483648単一のインポートインスタンスの受信側でメモリ制限に達した場合、ディスクスワイプがトリガーされます。これを有効にするには、セッション変数 load_mem_limit と一緒に変更する必要があります。このパラメータは、イベントベースのコンパクションフレームワークが有効な場合に変更可能です。
max_compaction_concurrency-1コンパクション(Base Compaction と Cumulative Compaction の両方)の最大同時実行数。値が -1 の場合、同時実行数に制限はありません。
cumulative_compaction_check_interval_seconds1コンパクションチェックの間隔
  • セッション変数
NameDefaultDescription
query_mem_limit0各 BE ノードでのクエリのメモリ制限
load_mem_limit0単一のインポートタスクのメモリ制限。値が 0 の場合、exec_mem_limit が使用されます

メモリ使用量の確認

  • mem_tracker
//全体のメモリ統計を表示
<http://be_ip:be_http_port/mem_tracker>

// 詳細なメモリ統計を表示
<http://be_ip:be_http_port/mem_tracker?type=query_pool&upper_level=3>
  • tcmalloc
<http://be_ip:be_http_port/memz>
------------------------------------------------
MALLOC: 777276768 ( 741.3 MiB) アプリケーションによって使用されているバイト数
MALLOC: + 8851890176 ( 8441.8 MiB) ページヒープフリーリストのバイト数
MALLOC: + 143722232 ( 137.1 MiB) セントラルキャッシュフリーリストのバイト数
MALLOC: + 21869824 ( 20.9 MiB) トランスファーキャッシュフリーリストのバイト数
MALLOC: + 832509608 ( 793.9 MiB) スレッドキャッシュフリーリストのバイト数
MALLOC: + 58195968 ( 55.5 MiB) malloc メタデータのバイト数
MALLOC: ------------
MALLOC: = 10685464576 (10190.5 MiB) 実際に使用されているメモリ(物理 + スワップ)
MALLOC: + 25231564800 (24062.7 MiB) OS に解放されたバイト数(アンマップされたもの)
MALLOC: ------------
MALLOC: = 35917029376 (34253.1 MiB) 使用されている仮想アドレス空間
MALLOC:
MALLOC: 112388 使用中のスパン数
MALLOC: 335 使用中のスレッドヒープ数
MALLOC: 8192 Tcmalloc ページサイズ
------------------------------------------------
ReleaseFreeMemory() を呼び出して、フリーリストメモリを OS に解放します(madvise() 経由)。
OS に解放されたバイト数は仮想アドレス空間を占有しますが、物理メモリは占有しません。

この方法でクエリされたメモリは正確です。ただし、StarRocks の一部のメモリは予約されているが使用されていない場合があります。TcMalloc は予約されたメモリをカウントし、使用されているメモリをカウントしません。

ここで Bytes in use by application は現在使用されているメモリを指します。

  • metrics
curl -XGET http://be_ip:be_http_port/metrics | grep 'mem'
curl -XGET http://be_ip:be_http_port/metrics | grep 'column_pool'

metrics の値は10秒ごとに更新されます。古いバージョンで一部のメモリ統計を監視することが可能です。