Heap Profile によるメモリ分析
Heap Profile ではプロセスのメモリ使用量とコールスタックをリアルタイムで確認できます。そのため、通常はコードについてある程度の知識が必要です。Heap Profile が記録するのは仮想メモリである点に注意してください。設定を変更して Doris BE プロセスを再起動し、対象の現象を再現できる必要があります。
Doris はデフォルトのアロケータとして Jemalloc を使用します。Heap Profile を使用するには、次の手順に従ってください。
-
prof_active:falseはJEMALLOC_CONFの設定値です。be.conf内でこの値をprof_active:trueに変更し、Doris BE を再起動します。 -
curl http://be_host:8040/jeheap/dumpを実行すると、生成されたprofileファイルを${DORIS_HOME}/logディレクトリで確認できます。 -
jeprof --dot ${DORIS_HOME}/lib/doris_be ${DORIS_HOME}/log/profile_fileを実行し、ターミナルに出力されたテキストを オンラインの dot 描画サイト に貼り付けて、メモリ割り当てのグラフを生成します。
上記の手順は Doris 2.1.8、3.0.4 以降のバージョンを対象とし、リアルタイムのメモリ分析に使用します。長期間にわたってメモリを観察する場合や、メモリ割り当て量の累積値を確認する場合は、Jemalloc Heap Profile を参照してください。
Heap Profile のコールスタックで Segment、TabletSchema、ColumnReader などの項目がメモリ使用量の大きな割合を占めている場合は、メタデータが大量のメモリを占有していることを意味します。
クラスターを一定期間稼働させた後、アイドル状態になっても BE のメモリ使用量が減少せず、Heap Profile のコールスタックで Agg、Join、Filter、Sort、Scan などの項目がメモリ使用量の大きな割合を占めている場合があります。該当する時間帯の BE プロセスのメモリ監視でも継続的な増加傾向が見られるなら、メモリリークを疑う根拠があります。コールスタックを基にコードをさらに分析してください。
クラスターでタスクを実行中に、Heap Profile のコールスタックで Agg、Join、Filter、Sort、Scan などの項目がメモリ使用量の大きな割合を占めていても、タスク完了後にメモリが正常に解放されるなら、メモリの大部分は実行中のタスクに使われており、リークはありません。総メモリ使用量に占める Label=query, Type=overview Memory Tracker の値の割合が、Heap Profile で上記の項目を含むコールスタックのメモリ使用量の割合より小さい場合は、Label=query, Type=overview Memory Tracker の統計値が不正確であることを意味します。その場合は、速やかにコミュニティへ報告してください。