アロケーションプロファイリング
ClickHouseは、アロケーションサンプリングとプロファイリングのためのいくつかのツールを備えたグローバルアロケータとしてjemallocを使用しています。
アロケーションプロファイリングをより便利にするために、SYSTEM
コマンドがKeeperの4LWコマンドと共に提供されています。
アロケーションのサンプリングとヒーププロファイルのフラッシュ
jemalloc
でアロケーションをサンプリングおよびプロファイリングしたい場合は、環境変数MALLOC_CONF
を使用してプロファイリングを有効にしてClickHouse/Keeperを起動する必要があります。
jemalloc
はアロケーションをサンプリングし、内部に情報を格納します。
現在のプロファイルをフラッシュするために、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
です。
異なる場所を定義するには、MALLOC_CONF
環境変数にprof_prefix
オプションを追加します。
たとえば、ファイル名のプレフィックスがmy_current_profile
である/data
フォルダーにプロファイルを生成したい場合、次のようにClickHouse/Keeperを実行できます:
生成されるファイルは、プレフィックスPIDとシーケンス番号を付加します。
ヒーププロファイルの分析
ヒーププロファイルを生成した後、これを分析する必要があります。
そのためには、jemalloc
のツールであるjeprofを使用する必要があります。これは複数の方法でインストールできます:
- システムのパッケージマネージャを使用して
jemalloc
をインストール - jemallocリポジトリをクローンし、ルートフォルダーからautogen.shを実行して、
bin
フォルダー内にjeprof
スクリプトを提供する
jeprof
を使用してヒーププロファイルから生成できるさまざまなフォーマットがあります。
ツールが提供する使用法とさまざまなオプションを確認するには、jeprof --help
を実行することをお勧めします。
一般的に、jeprof
コマンドは次のようになります:
2つのプロファイル間でどのアロケーションが発生したかを比較したい場合は、ベース引数を設定できます:
例えば:
- 各手続きを1行ずつ書いたテキストファイルを生成したい場合:
- コールグラフを持つ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
プロファイラの初期状態を設定することも可能で、デフォルトで有効になっています。
たとえば、起動時にアロケーションをサンプリングしたくないが、プロファイラを有効にした後にのみサンプリングを行いたい場合、次の環境変数で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コマンドをサポートしています。
例: