ClickHouse/docs/ja/operations/allocation-profiling.md
2024-11-18 11:58:58 +09:00

8.9 KiB
Raw Permalink Blame History

slug sidebar_label title
/ja/operations/allocation-profiling アロケーションプロファイリング アロケーションプロファイリング

import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem';

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

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

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

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

MALLOC_CONF=background_thread:true,prof:true

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

現在のプロファイルをフラッシュするようにjemallocに指示するには、次のように実行します:

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オプションを追加します。
たとえば、/dataフォルダにプロファイルを生成したい場合、ファイル名のプレフィックスをmy_current_profileとするには、ClickHouse/Keeperを以下の環境変数で実行します

MALLOC_CONF=background_thread:true,prof:true,prof_prefix:/data/my_current_profile

生成されたファイルにはプレフィックスにPIDとシーケンス番号が追加されます。

ヒーププロファイルの分析

ヒーププロファイルを生成した後、それを分析する必要があります。
これには、jemallocのツールであるjeprofを使用する必要があります。このツールは以下の方法でインストールできます:

  • システムのパッケージマネージャーを使用してjemallocをインストールする
  • jemallocリポジトリをクローンし、ルートフォルダーからautogen.shを実行すると、binフォルダ内にjeprofスクリプトが用意されます

:::note jeprofaddr2lineを使用してスタックトレースを生成しますが、これが非常に遅い場合があります。
その場合は、代替実装のインストールをお勧めします。

git clone https://github.com/gimli-rs/addr2line.git --depth=1 --branch=0.23.0
cd addr2line
cargo build --features bin --release
cp ./target/release/addr2line path/to/current/addr2line

:::

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

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

jeprof path/to/binary path/to/heap/profile --output_format [ > output_file]

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

jeprof path/to/binary --base path/to/first/heap/profile path/to/second/heap/profile --output_format [ > output_file]

例えば:

  • 各手続きが1行ごとに書かれたテキストファイルを生成したい場合
jeprof path/to/binary path/to/heap/profile --text > result.txt
  • コールグラフ付きのPDFファイルを生成したい場合
jeprof path/to/binary path/to/heap/profile --pdf > result.pdf

フレームグラフの生成

jeprofを使用してフレームグラフを作成するために折りたたまれたスタックを生成できます。

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

jeprof path/to/binary path/to/heap/profile --collapsed > result.collapsed

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

最も人気があるのは、flamegraph.plスクリプトを含むFlameGraphです:

cat result.collapsed | /path/to/FlameGraph/flamegraph.pl --color=mem --title="Allocation Flame Graph" --width 2400 > result.svg

さらに、収集されたスタックをよりインタラクティブに分析するためのツールであるspeedscopeも興味深いです。

実行時にアロケーションプロファイラーを制御する

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

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

SYSTEM JEMALLOC DISABLE PROFILE
echo jmdp | nc localhost 9181

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

SYSTEM JEMALLOC ENABLE PROFILE
echo jmep | nc localhost 9181

プロファイラーの初期状態を制御することも可能で、デフォルトで有効になっているprof_activeオプションを設定することができます。
たとえば、起動時にアロケーションのサンプリングを行わず、プロファイラーを有効にした後でのみ行いたい場合、以下の環境変数を使用してClickHouse/Keeperを起動することができます

MALLOC_CONF=background_thread:true,prof:true,prof_active:false

その後、後の段階でプロファイラーを有効にすることができます。

プロファイラーの追加オプション

jemallocにはプロファイラーに関連するさまざまなオプションがあり、これを変更することでMALLOC_CONF環境変数を通じて制御できます。
たとえば、アロケーションサンプルの間隔はlg_prof_sampleで制御できます。
Nバイトごとにヒーププロファイルをダンプする場合、lg_prof_intervalを使用して有効にできます。

これらのオプションについては、jemallocリファレンスページを確認することをお勧めします。

その他のリソース

ClickHouse/Keeperは、jemalloc関連のメトリクスをさまざまな方法で公開しています。

:::warning 警告 これらのメトリクスのいずれも互いに同期されておらず、値がずれる可能性があることを意識してください。 :::

システムテーブル asynchronous_metrics

SELECT *
FROM system.asynchronous_metrics
WHERE metric ILIKE '%jemalloc%'
FORMAT Vertical

参照

システムテーブル jemalloc_bins

異なるサイズクラスビンでのjemallocアロケーターを介して行われたメモリアロケーションに関する情報を、すべてのアリーナから集約したものを含みます。

参照

Prometheus

asynchronous_metricsからのすべてのjemalloc関連メトリクスは、ClickHouseとKeeperの両方でPrometheusエンドポイントを使用して公開されています。

参照

Keeperのjmst 4LWコマンド

Keeperは、基本アロケーター統計を返すjmst 4LWコマンドをサポートしています。

例:

echo jmst | nc localhost 9181