SYSTEM コマンド、および Keeper の four letter word (4LW) コマンドを使ってサンプリングを制御できます。結果を確認する方法はいくつかあります。
- クエリごとの分析のために、
JemallocSampleタイプとしてサンプルをsystem.trace_logに収集します。 - 組み込みの jemalloc web UI を使って、リアルタイムのメモリ統計を表示し、ヒーププロファイルを取得します (26.2+) 。
system.jemalloc_profile_textを使用して、現在のヒーププロファイルを SQL から直接クエリできます (26.2+) 。- ヒーププロファイルをディスクに flush し、
jeprofで解析します。
このガイドはバージョン 25.9 以降に対応しています。
それ以前のバージョンについては、25.9 より前のバージョン向けの割り当てプロファイリング を参照してください。
メモリ割り当てのサンプリング
jemalloc_enable_global_profiler 設定を有効にして ClickHouse/Keeper を起動します。
jemalloc は割り当てをサンプリングし、その情報を内部的に保存します。
jemalloc_enable_profiler 設定を使用すると、クエリごとにサンプリングを有効にすることもできます。
jemallocのサンプルをsystem.trace_logに保存する
JemallocSampleタイプでsystem.trace_logに保存できます。
これをグローバルに有効化するには、jemalloc_collect_global_profile_samples_in_trace_log設定を使用します。
jemalloc_collect_profile_samples_in_trace_log 設定を使うと、これをクエリごとに有効にすることもできます。
例: クエリのメモリ使用量を分析する
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 をフラッシュします:
Jemalloc web UI
このセクションはバージョン 26.2 以降に適用されます。
/jemalloc HTTP エンドポイントで jemalloc のメモリ統計を表示する組み込みの web UI があります。
allocated、active、resident、mapped memory に加え、アリーナごとおよび bin ごとの統計を含むライブのメモリメトリクスが、チャートで表示されます。
また、グローバルおよびクエリごとのヒーププロファイルを UI から直接取得することもできます。
- ClickHouse
- Keeper
SQL からヒーププロファイルを取得する
このセクションはバージョン 26.2 以降が対象です。
system.jemalloc_profile_text システムテーブルを使用すると、外部ツールを使ったり、事前にディスクへフラッシュしたりしなくても、現在の jemalloc ヒーププロファイルを SQL から直接取得して確認できます。
このテーブルには 1 つのカラムがあります。
| Column | Type | Description |
|---|---|---|
line | String | シンボル化された jemalloc ヒーププロファイルの行。 |
出力フォーマット
jemalloc_profile_text_output_format 設定で制御され、次の 3 つの値をサポートしています。
raw— jemalloc によって生成される生のヒーププロファイル。symbolized— 関数シンボルが埋め込まれたjeprof互換フォーマットです。シンボルはすでに埋め込まれているため、jeprofは ClickHouse バイナリがなくても出力を解析できます。collapsed(デフォルト) — フレームグラフ互換のコラプスされたスタックです。各行に 1 つのスタックとバイト数が含まれます。
追加設定
jemalloc_profile_text_symbolize_with_inline(Bool, デフォルト:true) — シンボル化の際にインラインフレームを含めるかどうかを指定します。これを無効にするとシンボル化は大幅に高速化されますが、インライン化された関数呼び出しがスタックに表示されなくなるため、精度は低下します。影響するのはsymbolizedおよびcollapsedフォーマットのみです。jemalloc_profile_text_collapsed_use_count(Bool, デフォルト:false) —collapsedフォーマットを使用する場合、バイト数ではなく割り当て回数で集計します。
例: SQLからフレームグラフを生成する
collapsed なので、出力をそのまま FlameGraph に渡せます:
ヒーププロファイルをディスクにフラッシュする
jeprof を使ってヒーププロファイルをファイルとして保存し、オフラインで解析したい場合は、ディスクにフラッシュできます。
デフォルトでは、ヒーププロファイルファイルは /tmp/jemalloc_clickhouse._pid_._seqnum_.heap に生成されます。ここで、_pid_ は ClickHouse の PID、_seqnum_ は現在のヒーププロファイルのグローバルなシーケンス番号です。
Keeper の場合、デフォルトのファイルは /tmp/jemalloc_keeper._pid_._seqnum_.heap で、同じルールに従います。
現在のプロファイルをフラッシュするには、次のようにします。
- ClickHouse
- Keeper
MALLOC_CONF 環境変数に prof_prefix オプションを追加します。
たとえば、ファイル名のプレフィックスを my_current_profile にして /data フォルダにプロファイルを生成する場合は、次の環境変数を指定して ClickHouse/Keeper を実行できます。
jeprof によるヒーププロファイルファイルの分析
jemalloc のツールである jeprof を使って分析できます。インストール方法はいくつかあります。
- システムのパッケージマネージャーを使用する
- jemalloc リポジトリ をクローンし、ルートディレクトリで
autogen.shを実行する。これにより、binフォルダー内のjeprofスクリプトを利用できます
jeprof --help を実行して確認してください。
シンボル化されたヒーププロファイル
SYSTEM JEMALLOC FLUSH PROFILE を使ってフラッシュすると、ClickHouse はシンボル化されたヒーププロファイルを自動的に生成します。
シンボル化プロファイル (.symbolized 拡張子) には関数シンボルが埋め込まれているため、ClickHouse バイナリがなくても jeprof で解析できます。
たとえば、次を実行すると:
/tmp/jemalloc_clickhouse.12345.0.heap.symbolized) を返します。
続いて、jeprof を使って直接解析できます:
バイナリは不要: シンボル化済みプロファイル (
.symbolized ファイル) を使用する場合、jeprof に ClickHouse バイナリのパスを指定する必要はありません。これにより、別のマシン上でも、あるいはバイナリ更新後でも、プロファイルの解析がはるかに容易になります。シンボル化されていないプロファイルでは、あるいは、
jeprof はスタックトレースの生成に addr2line を使用するため、かなり時間がかかることがあります。
その場合は、このツールの代替実装をインストールすることをおすすめします。llvm-addr2line も同様に使用できます (ただし、llvm-objdump は jeprof と互換性がない点に注意してください) 。以降は、次のように使用します jeprof --tools addr2line:/usr/bin/llvm-addr2line,nm:/usr/bin/llvm-nm,objdump:/usr/bin/objdump,c++filt:/usr/bin/llvm-cxxfilt--base 引数を使用できます。
例
- 各プロシージャを1行に1つずつ記述したテキストファイルを生成します:
- コールグラフ付きのPDFファイルを生成します:
- 各プロシージャを1行に1つずつ記述したテキストファイルを生成します:
- コールグラフを含むPDFファイルを生成します:
フレームグラフの生成
jeprof を使うと、フレームグラフの作成に使うコラプスされたスタックを生成できます。
--collapsed 引数を使用する必要があります。
flamegraph.pl というスクリプトが含まれています。
プロファイラの追加オプション
jemalloc では、プロファイラに関連するさまざまなオプションを利用できます。これらは MALLOC_CONF 環境変数を変更することで制御できます。
たとえば、割り当てサンプルの間隔は lg_prof_sample で制御できます。
heap profile を N バイトごとにダンプする場合は、lg_prof_interval を使用して有効にできます。
オプションの完全な一覧については、jemalloc のリファレンスページを確認することをお勧めします。
その他のリソース
jemalloc 関連のメトリクスがさまざまな形で公開されています。
システムテーブル asynchronous_metrics
システムテーブル jemalloc_bins
システムテーブル jemalloc_stats (26.2+)
malloc_stats_print() の出力全体を、単一の文字列として返します。SYSTEM JEMALLOC STATS コマンドと同等です。
Prometheus
asynchronous_metrics の jemalloc 関連のすべてのメトリクスは、ClickHouse と Keeper の両方で Prometheus エンドポイント経由でも公開されています。
Reference
Keeper の jmst 4LW コマンド
jmst 4LW コマンドをサポートしており、基本的なアロケータ統計情報を返します: