Allocation profiling
jemalloc
はアロケーションをサンプリングし、情報を内部に保存します。
現在のプロファイルをフラッシュするには、次のコマンドを実行します。
- ClickHouse
- Keeper
SYSTEM JEMALLOC FLUSH PROFILE
echo jmfp | nc localhost 9181
デフォルトでは、ヒーププロファイルファイルは/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
をインストール - jemallocレポジトリをクローンし、ルートフォルダからautogen.shを実行して
bin
フォルダ内にjeprof
スクリプトを提供します。
jeprof
を使用してヒーププロファイルから生成できる異なるフォーマットが多数あります。
jeprof --help
を実行して、ツールが提供する多くの異なるオプションと使用法を確認することをお勧めします。
一般的に、jeprof
コマンドは次のようになります:
2つのプロファイル間でどのアロケーションが発生したかを比較したい場合は、ベース引数を設定できます:
例えば:
- 各手続きを行ごとに記述したテキストファイルを生成したい場合:
- コールグラフを含むPDFファイルを生成したい場合:
フレームグラフの生成
jeprof
は、フレームグラフを構築するために圧縮スタックを生成できます。
--collapsed
引数を使用する必要があります:
その後、圧縮スタックを視覚化するために多くの異なるツールを使用できます。
最も人気があるのは、FlameGraphで、flamegraph.pl
というスクリプトが含まれています:
もう一つ興味深いツールは、収集されたスタックをよりインタラクティブに分析できるspeedscopeです。
実行時のアロケーションプロファイラーの制御
ClickHouse/Keeperがプロファイラーを有効にして起動された場合、実行時にアロケーションプロファイリングを無効/有効にするための追加コマンドをサポートしています。 これらのコマンドを使用すると、特定の間隔だけをプロファイリングすることが容易になります。
プロファイラーを無効にする:
- ClickHouse
- Keeper
SYSTEM JEMALLOC DISABLE PROFILE
echo jmdp | nc localhost 9181
プロファイラーを有効にする:
- ClickHouse
- Keeper
SYSTEM JEMALLOC ENABLE PROFILE
echo jmep | nc localhost 9181
プロファイラーの初期状態をprof_active
オプションによって制御することも可能で、デフォルトでは有効になっています。
例えば、起動時にアロケーションをサンプリングしたくないが、プロファイラーを有効にした後のみサンプリングを行いたい場合、次の環境変数で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コマンドをサポートしています。
例: