25.9 以前のバージョン向けのアロケーションプロファイリング
ClickHouse はグローバルアロケータとして jemalloc を使用します。jemalloc には、アロケーションのサンプリングとプロファイリングのためのツールが付属しています。
アロケーションプロファイリングをより便利に行えるように、Keeper では SYSTEM コマンドに加えて four letter word (4LW) コマンドも提供されています。
アロケーションのサンプリングとヒーププロファイルのフラッシュ
jemalloc でアロケーションのサンプリングとプロファイリングを行う場合は、環境変数 MALLOC_CONF を使用してプロファイリングを有効にし、ClickHouse/Keeper を起動する必要があります。
jemalloc はアロケーションをサンプリングし、その情報を内部に保持します。
現在のプロファイルをフラッシュするように jemalloc に指示するには、次を実行します:
- ClickHouse
- Keeper
デフォルトでは、ヒーププロファイル用のファイルは /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 を次の環境変数を指定して実行します:
生成されるファイル名は、接頭辞、PID、シーケンス番号を連結したものになります。
ヒーププロファイルの解析
ヒーププロファイルを生成したら、それを解析する必要があります。
そのために、jemalloc のツールである jeprof を使用できます。これは複数の方法でインストールできます:
- システムのパッケージマネージャーを使用する
- jemalloc リポジトリ をクローンし、ルートディレクトリで
autogen.shを実行する。この方法では、binディレクトリ内でjeprofスクリプトが利用できるようになります
jeprof を使用してヒーププロファイルから生成できる形式には、さまざまなものがあります。
ツールの使い方および利用可能な各種オプションについては、jeprof --help を実行して確認することをお勧めします。
一般的に、jeprof コマンドは次のように使用します。
2つのプロファイル間でどの割り当てが行われたかを比較したい場合は、base 引数を指定できます。
例
- 各プロシージャを1行ごとに記述したテキストファイルを生成したい場合:
- コールグラフを含む PDF ファイルを生成したい場合:
フレームグラフの生成
jeprof を使用すると、フレームグラフの作成に必要な折りたたみスタック(collapsed stack)を生成できます。
--collapsed 引数を指定する必要があります。
その後、折り畳まれたスタックを可視化するために、さまざまなツールを利用できます。
最も一般的なのは FlameGraph で、flamegraph.pl というスクリプトが付属しています。
もう 1 つ有用なツールとして speedscope があり、収集したスタック情報をよりインタラクティブに解析できます。
実行時のアロケーションプロファイラの制御
ClickHouse/Keeper をプロファイラを有効にした状態で起動した場合、実行時にアロケーションプロファイリングを無効化/有効化するための追加コマンドを使用できます。 これらのコマンドを使用すると、特定の時間区間のみをプロファイルしやすくなります。
プロファイラを無効にするには:
- ClickHouse
- Keeper
プロファイラを有効にするには:
- ClickHouse
- Keeper
prof_active オプションを設定することで、プロファイラの初期状態を制御することも可能です。このオプションはデフォルトで有効になっています。
たとえば、起動時にはアロケーションをサンプリングせず、起動後のみサンプリングしたい場合は、その時点でプロファイラを有効にします。次の環境変数を指定して ClickHouse/Keeper を起動できます:
プロファイラは後から有効化することもできます。
プロファイラの追加オプション
jemalloc にはプロファイラに関連する多数のオプションが用意されており、MALLOC_CONF 環境変数を変更して制御できます。
たとえば、アロケーションサンプル間の間隔は lg_prof_sample で制御できます。
ヒーププロファイルを N バイトごとにダンプしたい場合は、lg_prof_interval を有効化してください。
利用可能なオプションの一覧については、jemalloc のリファレンスページを参照してください。
その他のリソース
ClickHouse/Keeper は、jemalloc 関連のメトリクスをさまざまな方法で公開しています。
これらのメトリクスは互いに同期されておらず、値がずれていく可能性があることを認識しておくことが重要です。
システムテーブル asynchronous_metrics
システムテーブル jemalloc_bins
サイズクラス(bin)ごとに jemalloc アロケータ経由で行われたメモリ割り当てに関する情報を、すべてのアリーナから集約して格納します。
Prometheus
asynchronous_metrics に含まれるすべての jemalloc 関連メトリクスは、ClickHouse と Keeper の両方で Prometheus エンドポイントを通じても公開されます。
Keeper における jmst 4LW コマンド
Keeper は jmst 4LW コマンドをサポートしており、基本的なアロケータ統計情報 を返します。