メインコンテンツまでスキップ
メインコンテンツまでスキップ

Allocation profiling

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

現在のプロファイルをフラッシュするには、次のコマンドを実行します。

SYSTEM JEMALLOC FLUSH PROFILE

デフォルトでは、ヒーププロファイルファイルは/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はスタックトレースを生成するためにaddr2lineを使用するため、非常に遅くなることがあります。
その場合、ツールの代替実装をインストールすることをお勧めします。

jeprofを使用してヒーププロファイルから生成できる異なるフォーマットが多数あります。 jeprof --helpを実行して、ツールが提供する多くの異なるオプションと使用法を確認することをお勧めします。

一般的に、jeprofコマンドは次のようになります:

2つのプロファイル間でどのアロケーションが発生したかを比較したい場合は、ベース引数を設定できます:

例えば:

  • 各手続きを行ごとに記述したテキストファイルを生成したい場合:
  • コールグラフを含むPDFファイルを生成したい場合:

フレームグラフの生成

jeprofは、フレームグラフを構築するために圧縮スタックを生成できます。

--collapsed引数を使用する必要があります:

その後、圧縮スタックを視覚化するために多くの異なるツールを使用できます。

最も人気があるのは、FlameGraphで、flamegraph.plというスクリプトが含まれています:

もう一つ興味深いツールは、収集されたスタックをよりインタラクティブに分析できるspeedscopeです。

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

ClickHouse/Keeperがプロファイラーを有効にして起動された場合、実行時にアロケーションプロファイリングを無効/有効にするための追加コマンドをサポートしています。 これらのコマンドを使用すると、特定の間隔だけをプロファイリングすることが容易になります。

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

SYSTEM JEMALLOC DISABLE PROFILE

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

SYSTEM JEMALLOC ENABLE PROFILE

プロファイラーの初期状態を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コマンドをサポートしています。

例: