ヒーププロファイルメモリ解析
Heap Profileはプロセスメモリ使用量とコールスタックのリアルタイム表示をサポートしているため、通常はコードについてある程度理解する必要があります。Heap Profileは仮想メモリを記録することに注意してください。設定を変更してDoris BEプロセスを再起動し、現象を再現する必要があります。
DorisはデフォルトのAllocatorとしてJemallocを使用しています。以下の方法を参照してHeap Profileを使用してください。
-
be.confのJEMALLOC_CONFのprof_active:falseをprof_active:trueに変更し、Doris BEを再起動します。 -
curl http://be_host:8040/jeheap/dumpを実行すると、${DORIS_HOME}/logディレクトリに生成されたprofileファイルが表示されます。 -
jeprof --dot ${DORIS_HOME}/lib/doris_be ${DORIS_HOME}/log/profile_fileを実行した後、ターミナルが出力したテキストをオンラインdot描画ウェブサイトに貼り付けて、メモリ割り当てグラフを生成します。
上記のプロセスはDoris 2.1.8および3.0.4以降のバージョンに基づいており、リアルタイムメモリ分析に使用されます。長期間メモリを観察する必要がある場合や、メモリアプリケーションの累積値を観察する場合は、Jemalloc Heap Profileの使用に関する詳細情報について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=overviewMemory Trackerの値が、Heap Profileで上記フィールドを含むメモリコールスタックよりも総メモリに占める割合が小さい場合、Label=query, Type=overviewMemory Trackerの統計が不正確であることを意味し、コミュニティでタイムリーにフィードバックを提供できます。