25.9以前のバージョンのアロケーションプロファイリング
ClickHouseは、jemalloc をグローバルアロケーターとして使用しています。Jemallocには、アロケーションのサンプリングとプロファイリングのためのツールが付属しています。
アロケーションプロファイリングをより便利にするために、SYSTEM
コマンドと Keeper の4文字ワード (4LW) コマンドが提供されています。
アロケーションのサンプリングとヒーププロファイルのフラッシュ
jemalloc
のアロケーションをサンプリングしてプロファイリングするには、環境変数 MALLOC_CONF
を使用してプロファイリングを有効にして ClickHouse/Keeper を起動する必要があります:
jemalloc
はアロケーションをサンプリングし、情報を内部で保存します。
現在のプロファイルをフラッシュするには、以下のコマンドを実行します:
- ClickHouse
- Keeper
デフォルトでは、ヒーププロファイルファイルは /tmp/jemalloc_clickhouse._pid_._seqnum_.heap
に生成され、ここで _pid_
は ClickHouse の PID、_seqnum_
は現在のヒーププロファイルのグローバルシーケンス番号です。
Keeper の場合、デフォルトファイルは /tmp/jemalloc_keeper._pid_._seqnum_.heap
で、同じルールに従います。
異なる場所を定義するには、prof_prefix
オプションと一緒に MALLOC_CONF
環境変数を追加します。
たとえば、ファイル名のプレフィックスを my_current_profile
として /data
フォルダ内にプロファイルを生成したい場合、次の環境変数を使用して ClickHouse/Keeper を実行できます:
生成されたファイルは、プレフィックス PID とシーケンス番号に追加されます。
ヒーププロファイルの分析
ヒーププロファイルが生成されたら、それを分析する必要があります。
そのために、jemalloc
のツールである jeprof を使用できます。これは複数の方法でインストールできます:
- システムのパッケージマネージャを使用する
- jemalloc リポジトリ をクローンして、ルートフォルダから
autogen.sh
を実行します。これによりbin
フォルダ内にjeprof
スクリプトが提供されます。
jeprof
はスタックトレースを生成するために addr2line
を使用しますが、これは非常に遅くなる可能性があります。
その場合は、ツールの 代替実装 をインストールすることをお勧めします。
jeprof
を使用してヒーププロファイルから生成できる形式は多様です。
使用法やツールが提供するさまざまなオプションに関する情報は、jeprof --help
を実行することをお勧めします。
一般的に、jeprof
コマンドの使い方は次のとおりです:
2つのプロファイル間でどのアロケーションが発生したかを比較したい場合は、base
引数を設定できます:
例
- 各手続きを行ごとに書き込んだテキストファイルを生成したい場合:
- コールグラフを持つPDFファイルを生成したい場合:
フレームグラフの生成
jeprof
を使用すると、フレームグラフを構築するための折りたたまれたスタックを生成できます。
--collapsed
引数を使用する必要があります:
その後、多くの異なるツールを使用して折りたたまれたスタックを視覚化できます。
最も популяр なものは FlameGraph で、flamegraph.pl
と呼ばれるスクリプトが含まれています:
もう1つの興味深いツールは speedscope で、収集されたスタックをよりインタラクティブな方法で分析できます。
実行時のアロケーションプロファイラの制御
ClickHouse/Keeper がプロファイラを有効にして起動されると、実行時にアロケーションプロファイリングを無効/有効にする追加のコマンドがサポートされます。
これらのコマンドを使用することで、特定のインターバルのみをプロファイリングするのが容易になります。
プロファイラを無効にするには:
- ClickHouse
- Keeper
プロファイラを有効にするには:
- ClickHouse
- Keeper
プロファイラの初期状態を制御することも可能で、デフォルトで有効になっています。
たとえば、起動中にアロケーションのサンプリングを行わず、後でのみ行いたい場合は、プロファイラを無効にできます。次の環境変数を使用して ClickHouse/Keeper を起動できます:
プロファイラは後で有効にできます。
プロファイラの追加オプション
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 コマンドをサポートしています: