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

アロケーションプロファイリング

ClickHouseは、アロケーションサンプリングとプロファイリングのためのいくつかのツールを備えたグローバルアロケータとしてjemallocを使用しています。
アロケーションプロファイリングをより便利にするために、SYSTEMコマンドがKeeperの4LWコマンドと共に提供されています。

アロケーションのサンプリングとヒーププロファイルのフラッシュ

jemallocでアロケーションをサンプリングおよびプロファイリングしたい場合は、環境変数MALLOC_CONFを使用してプロファイリングを有効にしてClickHouse/Keeperを起動する必要があります。

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

現在のプロファイルをフラッシュするために、jemallocに次のコマンドを実行するよう指示できます:

SYSTEM JEMALLOC FLUSH PROFILE

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

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

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

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

例えば:

  • 各手続きを1行ずつ書いたテキストファイルを生成したい場合:
  • コールグラフを持つPDFファイルを生成したい場合:

フレームグラフの生成

jeprofは、フレームグラフを構築するための折りたたまれたスタックを生成することを可能にします。

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

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

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

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

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

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

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

SYSTEM JEMALLOC DISABLE PROFILE

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

SYSTEM JEMALLOC ENABLE PROFILE

プロファイラの初期状態を設定することも可能で、デフォルトで有効になっています。
たとえば、起動時にアロケーションをサンプリングしたくないが、プロファイラを有効にした後にのみサンプリングを行いたい場合、次の環境変数で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コマンドをサポートしています。

例: