8.9 KiB
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
jeprof
はaddr2line
を使用してスタックトレースを生成しますが、これが非常に遅い場合があります。
その場合は、代替実装のインストールをお勧めします。
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