アロケーションプロファイリング
ClickHouseはグローバルアロケータとして jemalloc を使用しています。 Jemallocにはアロケーションサンプリングとプロファイリングのためのツールがいくつか備わっています。
アロケーションプロファイリングをより便利にするために、ClickHouseとKeeperは設定、クエリ設定、SYSTEM
コマンド、およびKeeperの4文字コマンド(4LW)を使用してサンプリングを制御することを可能にしています。
また、サンプルはsystem.trace_log
テーブルのJemallocSample
タイプに収集することができます。
このガイドはバージョン25.9以降に適用されます。 それ以前のバージョンについては、バージョン25.9以前のアロケーションプロファイリングを確認してください。
サンプリングアロケーション
jemalloc
でアロケーションをサンプリングしプロファイリングするには、設定jemalloc_enable_global_profiler
を有効にした状態でClickHouse/Keeperを起動する必要があります。
jemalloc
はアロケーションをサンプリングし、情報を内部的に保存します。
また、jemalloc_enable_profiler
設定を使用することで、クエリごとにアロケーションを有効にすることもできます。
ClickHouseはアロケーション負荷の大きいアプリケーションであるため、jemallocのサンプリングはパフォーマンスのオーバーヘッドを引き起こす可能性があります。
system.trace_log
におけるjemallocサンプルの保存
すべてのjemallocサンプルを、JemallocSample
タイプとしてsystem.trace_log
に保存することができます。
グローバルにこれを有効にするには、設定jemalloc_collect_global_profile_samples_in_trace_log
を使用します。
ClickHouseはアロケーション負荷の大きいアプリケーションであるため、system.trace_logへのすべてのサンプルの収集は高負荷を引き起こす可能性があります。
また、jemalloc_collect_profile_samples_in_trace_log
設定を使用することで、クエリごとに有効にすることもできます。
system.trace_log
を使用したクエリのメモリ使用量分析の例
まず、jemallocプロファイラを有効にしてクエリを実行し、そのサンプルをsystem.trace_log
に収集する必要があります:
ClickHouseがjemalloc_enable_global_profiler
で起動された場合、jemalloc_enable_profiler
を有効にする必要はありません。
jemalloc_collect_global_profile_samples_in_trace_log
とjemalloc_collect_profile_samples_in_trace_log
についても同様です。
system.trace_log
をフラッシュします:
そして、実行したクエリの各時点でのメモリ使用量を取得するためにクエリします:
メモリ使用量が最も高かった時点を見つけることもできます:
その結果を使用して、その時点でのアクティブなアロケーションがどこから発生したかを確認できます:
ヒーププロファイルのフラッシュ
デフォルトでは、ヒーププロファイルファイルは/tmp/jemalloc_clickhouse._pid_._seqnum_.heap
に生成されます。ここで、_pid_
はClickHouseのPIDで、_seqnum_
は現在のヒーププロファイルのグローバルシーケンス番号です。
Keeperの場合、デフォルトファイルは/tmp/jemalloc_keeper._pid_._seqnum_.heap
で、同じルールに従います。
現在のプロファイルをフラッシュするには、jemalloc
に次のコマンドを実行します:
- ClickHouse
- Keeper
フラッシュされたプロファイルの場所が返されます。
prof_prefix
オプションを付加したMALLOC_CONF
環境変数を追加することで、異なる場所を定義できます。
例えば、ファイル名のプレフィックスをmy_current_profile
にして/data
フォルダにプロファイルを生成したい場合、次の環境変数でClickHouse/Keeperを実行します:
生成されたファイルは、プレフィックスPIDとシーケンス番号に追加されます。
ヒーププロファイルの分析
ヒーププロファイルが生成されたら、それを分析する必要があります。
そのために、jemalloc
のツールである jeprof を使用することができます。これは複数の方法でインストールできます:
- システムのパッケージマネージャを使用
- jemallocリポジトリをクローンし、ルートフォルダから
autogen.sh
を実行します。これにより、bin
フォルダ内にjeprof
スクリプトが提供されます。
jeprof
はスタックトレースを生成するためにaddr2line
を使用し、非常に遅くなる場合があります。
その場合は、ツールの代替実装をインストールすることが推奨されます。
また、llvm-addr2line
も同様に機能します。
jeprof
を使用してヒーププロファイルから生成するフォーマットは多くあります。
ツールの使用法やさまざまなオプションについての情報は、jeprof --help
を実行することをお勧めします。
一般的に、jeprof
コマンドは次のように使用されます:
2つのプロファイル間でどのアロケーションが発生したかを比較したい場合は、base
引数を設定できます:
例
- 各手続きが1行ずつ書かれたテキストファイルを生成したい場合:
- コールグラフを持つPDFファイルを生成したい場合:
ファイアフレームグラフの生成
jeprof
はファイアフレームグラフを構築するために圧縮スタックを生成することができます。
--collapsed
引数を使用する必要があります:
その後、圧縮スタックを視覚化するために多くの異なるツールを使用できます。
最も人気のあるツールは、FlameGraphで、flamegraph.pl
というスクリプトを備えています:
もう一つの興味深いツールは、speedscopeで、収集されたスタックをよりインタラクティブに分析できます。
プロファイラに関する追加オプション
jemalloc
には、プロファイラに関連する多数の異なるオプションがあります。これらはMALLOC_CONF
環境変数を変更することで制御できます。
例えば、アロケーションサンプルの間隔はlg_prof_sample
で制御できます。
Nバイトごとにヒーププロファイルをダンプしたい場合はlg_prof_interval
を使用して有効にできます。
オプションの完全なリストについては、jemalloc
のリファレンスページを確認することをお勧めします。
その他のリソース
ClickHouse/Keeperは、jemalloc
関連のメトリクスをさまざまな方法で公開しています。
これらのメトリクスはすべて同期されていないため、値がずれる可能性があることを認識しておくことが重要です。
システムテーブル asynchronous_metrics
システムテーブル jemalloc_bins
異なるサイズクラス(ビン)においてjemallocアロケータを介して行われたメモリアロケーションに関する情報を、すべてのアリーナから集約して含みます。
Prometheus
asynchronous_metrics
からのすべてのjemalloc
関連メトリクスは、ClickHouseとKeeperの両方でPrometheusエンドポイントを使用して公開されています。
Keeperのjmst
4LWコマンド
Keeperは、基本アロケータ統計を返すjmst
4LWコマンドをサポートしています: