メインコンテンツへスキップ
メインコンテンツへスキップ

25.9 以前のバージョン向けのアロケーションプロファイリング

ClickHouse はグローバルアロケータとして jemalloc を使用します。jemalloc には、アロケーションのサンプリングとプロファイリングのためのツールが付属しています。
アロケーションプロファイリングをより便利に行えるように、Keeper では SYSTEM コマンドに加えて four letter word (4LW) コマンドも提供されています。

アロケーションのサンプリングとヒーププロファイルのフラッシュ

jemalloc でアロケーションのサンプリングとプロファイリングを行う場合は、環境変数 MALLOC_CONF を使用してプロファイリングを有効にし、ClickHouse/Keeper を起動する必要があります。

MALLOC_CONF=background_thread:true,prof:true

jemalloc はアロケーションをサンプリングし、その情報を内部に保持します。

現在のプロファイルをフラッシュするように jemalloc に指示するには、次を実行します:

SYSTEM JEMALLOC FLUSH PROFILE

デフォルトでは、ヒーププロファイル用のファイルは /tmp/jemalloc_clickhouse._pid_._seqnum_.heap に生成されます。ここで _pid_ は ClickHouse の PID、_seqnum_ は現在のヒーププロファイルに対するグローバルシーケンス番号です。
Keeper の場合、デフォルトファイルは /tmp/jemalloc_keeper._pid_._seqnum_.heap であり、同じルールに従います。

MALLOC_CONF 環境変数に prof_prefix オプションを追加することで、別の場所を指定できます。
たとえば、/data ディレクトリ内に、ファイル名のプレフィックスを my_current_profile としてプロファイルを生成したい場合は、ClickHouse/Keeper を次の環境変数を指定して実行します:

MALLOC_CONF=background_thread:true,prof:true,prof_prefix:/data/my_current_profile

生成されるファイル名は、接頭辞、PID、シーケンス番号を連結したものになります。

ヒーププロファイルの解析

ヒーププロファイルを生成したら、それを解析する必要があります。
そのために、jemalloc のツールである jeprof を使用できます。これは複数の方法でインストールできます:

  • システムのパッケージマネージャーを使用する
  • jemalloc リポジトリ をクローンし、ルートディレクトリで autogen.sh を実行する。この方法では、bin ディレクトリ内で jeprof スクリプトが利用できるようになります
注記

jeprof はスタックトレースを生成するために addr2line を使用しますが、これは非常に遅くなる場合があります。
その場合は、このツールの代替実装をインストールすることを推奨します。

git clone https://github.com/gimli-rs/addr2line.git --depth=1 --branch=0.23.0
cd addr2line
cargo build --features bin --release
cp ./target/release/addr2line path/to/current/addr2line

jeprof を使用してヒーププロファイルから生成できる形式には、さまざまなものがあります。 ツールの使い方および利用可能な各種オプションについては、jeprof --help を実行して確認することをお勧めします。

一般的に、jeprof コマンドは次のように使用します。

jeprof path/to/binary path/to/heap/profile --output_format [ > output_file]

2つのプロファイル間でどの割り当てが行われたかを比較したい場合は、base 引数を指定できます。

jeprof path/to/binary --base path/to/first/heap/profile path/to/second/heap/profile --output_format [ > output_file]

  • 各プロシージャを1行ごとに記述したテキストファイルを生成したい場合:
jeprof path/to/binary path/to/heap/profile --text > result.txt
  • コールグラフを含む PDF ファイルを生成したい場合:
jeprof path/to/binary path/to/heap/profile --pdf > result.pdf

フレームグラフの生成

jeprof を使用すると、フレームグラフの作成に必要な折りたたみスタック(collapsed stack)を生成できます。

--collapsed 引数を指定する必要があります。

jeprof path/to/binary path/to/heap/profile --collapsed > result.collapsed

その後、折り畳まれたスタックを可視化するために、さまざまなツールを利用できます。

最も一般的なのは FlameGraph で、flamegraph.pl というスクリプトが付属しています。

cat result.collapsed | /path/to/FlameGraph/flamegraph.pl --color=mem --title="Allocation Flame Graph" --width 2400 > result.svg

もう 1 つ有用なツールとして speedscope があり、収集したスタック情報をよりインタラクティブに解析できます。

実行時のアロケーションプロファイラの制御

ClickHouse/Keeper をプロファイラを有効にした状態で起動した場合、実行時にアロケーションプロファイリングを無効化/有効化するための追加コマンドを使用できます。 これらのコマンドを使用すると、特定の時間区間のみをプロファイルしやすくなります。

プロファイラを無効にするには:

SYSTEM JEMALLOC DISABLE PROFILE

プロファイラを有効にするには:

SYSTEM JEMALLOC ENABLE PROFILE

prof_active オプションを設定することで、プロファイラの初期状態を制御することも可能です。このオプションはデフォルトで有効になっています。
たとえば、起動時にはアロケーションをサンプリングせず、起動後のみサンプリングしたい場合は、その時点でプロファイラを有効にします。次の環境変数を指定して ClickHouse/Keeper を起動できます:

MALLOC_CONF=background_thread:true,prof:true,prof_active:false

プロファイラは後から有効化することもできます。

プロファイラの追加オプション

jemalloc にはプロファイラに関連する多数のオプションが用意されており、MALLOC_CONF 環境変数を変更して制御できます。 たとえば、アロケーションサンプル間の間隔は lg_prof_sample で制御できます。
ヒーププロファイルを N バイトごとにダンプしたい場合は、lg_prof_interval を有効化してください。

利用可能なオプションの一覧については、jemallocリファレンスページを参照してください。

その他のリソース

ClickHouse/Keeper は、jemalloc 関連のメトリクスをさまざまな方法で公開しています。

注意

これらのメトリクスは互いに同期されておらず、値がずれていく可能性があることを認識しておくことが重要です。

システムテーブル asynchronous_metrics

SELECT *
FROM system.asynchronous_metrics
WHERE metric LIKE '%jemalloc%'
FORMAT Vertical

リファレンス

システムテーブル jemalloc_bins

サイズクラス(bin)ごとに jemalloc アロケータ経由で行われたメモリ割り当てに関する情報を、すべてのアリーナから集約して格納します。

リファレンス

Prometheus

asynchronous_metrics に含まれるすべての jemalloc 関連メトリクスは、ClickHouse と Keeper の両方で Prometheus エンドポイントを通じても公開されます。

リファレンス

Keeper における jmst 4LW コマンド

Keeper は jmst 4LW コマンドをサポートしており、基本的なアロケータ統計情報 を返します。

echo jmst | nc localhost 9181