メインコンテンツまでスキップ
バージョン: 2.1

OOM Killer クラッシュ解析

BEプロセスがクラッシュした後にlog/be.outにエラーメッセージがない場合は、dmesg -Tを実行してください。以下のログが表示された場合、OOM Killerがトリガーされたことを意味します。20240718 15:03:59の時点で、pid 360303のdoris_beプロセスの物理メモリ(anon-rss)が約60 GBであることが確認できます。

[Thu Jul 18 15:03:59 2024] Out of memory: Killed process 360303 (doris_be) total-vm:213416916kB, anon-rss:62273128kB, file-rss:0kB, shmem-rss:0kB, UID:0 pgtables:337048kB oom_score_adj:0

理想的には、Dorisはオペレーティングシステムの残り利用可能メモリを定期的に検出し、後続のメモリ要求をブロックし、メモリGCをトリガーするなどの一連のアクションを実行して、メモリが不足した際のOOM Killerのトリガーを回避します。しかし、メモリステータスの更新とメモリGCには一定の遅延があり、すべての大きなメモリ要求を完全に捕捉することは困難です。クラスターの負荷が高すぎる場合、依然としてOOM Killerがトリガーされる一定の確率があり、BEプロセスのクラッシュを引き起こします。さらに、プロセスのメモリステータスが異常な場合、メモリGCはメモリを解放できず、プロセスの実際の利用可能メモリの減少を引き起こし、クラスターのメモリ負荷を増大させます。

OOM Killerがトリガーされた場合、まずログに基づいてOOM Killerがトリガーされる前のBEプロセスのメモリステータスとタスク実行を分析し、その後対象を絞ったパラメーター調整を行ってクラスターを安定性に復旧させます。

OOM Killerがトリガーされる前のメモリログを見つける

OOM Killerがトリガーされた場合、プロセスの利用可能メモリが不足していることを意味します。Memory ログ Analysisを参照して、be/log/be.INFOでOOM Killerがトリガーされた時点で下から上に最後に印刷されたMemory Tracker 要約キーワードを見つけ、BEプロセスの主要なメモリ位置を分析します。

less be/log/be.INFOでファイルを開いた後、まずOOM Killerがトリガーされた時刻に対応するログにジャンプします。上記のdmesg -Tの結果を例に取ると、/20240718 15:03:59を入力してEnterを押し、対応する時刻を検索します。見つからない場合は、OOM Killerがトリガーされた時刻に多少のずれがある可能性があります。/20240718 15:03:を検索できます。ログが対応する時刻にジャンプした後、/Memory Tracker 要約を入力してEnterを押してキーワードを検索します。デフォルトでは、ログ内で下方向に検索します。見つからないか時刻が一致しない場合は、shift + nを押して上方向に検索し、最後に印刷されたMemory Tracker 要約と同時に印刷されたProcess Memory 要約メモリログを見つける必要があります。

過度なクラスターメモリ負荷がOOM Killerをトリガー

以下の現象が満たされる場合、クラスターメモリ負荷が高すぎることが原因で、特定の瞬間にプロセスメモリステータスが適時に更新されず、メモリGCが適時にメモリを解放できず、BEプロセスメモリの効果的な制御に失敗したと考えられます。

Doris 2.1以前では、Memory GCが完璧ではなく、メモリが常に逼迫している状況では、OOM Killerをトリガーしやすい状況がありました。

  • Memory Tracker 要約の分析により、クエリやその他のタスク、各種キャッシュ、メタデータなどのメモリ使用量が妥当であることが判明。

  • 対応する時間帯のBEプロセスメモリモニタリングで、メモリ使用率が長時間高レベルで維持され、メモリリークの兆候がない

  • be/log/be.INFOでOOM Killer時点の前のメモリログを特定し、下から上にGCキーワードを検索し、BEプロセスが頻繁にメモリGCを実行していることを確認。

この時、BE 構成 Itemsを参照してbe/conf/be.confmem_limitを削減し、max_sys_mem_available_low_water_mark_bytesを増加させます。メモリ制限、ウォーターマーク計算方法、メモリGCの詳細については、Memory Control Strategyを参照してください。

さらに、memory_gc_sleep_time_mssoft_mem_limit_fracmemory_maintenance_sleep_time_msprocess_minor_gc_sizeprocess_full_gc_sizeenable_query_memory_overcommitthread_wait_gc_max_millisecondsなどを含む、メモリステータス更新とGCを制御する他のパラメーターを調整できます。

一部の異常な問題がOOM Killerをトリガー

クラスターメモリ負荷が高すぎる場合、この時メモリステータスが異常になる可能性があり、メモリGCが適時にメモリを解放できない場合があります。以下は、OOM Killerをトリガーする一般的な異常な問題です。

Memory Tracker統計の欠落

ログMemory Tracker 要約Label=process resident memory Memory TrackerとLabel=sum of all trackers Memory Trackerの差が大きい場合、またはOrphan Memory Trackerの値が大きすぎる場合、Memory Trackerに統計の欠落があることを意味します。Memory Trackerの[Memory Tracker Statistics Missing]セクションを参照してさらに分析してください。

Query Cancelの停止

be/log/be.INFOログでOOM Killerの時点を特定し、コンテキストでMemory Tracker 要約を検索してプロセスメモリ統計ログを見つけます。Memory Tracker 要約で大量のメモリを使用しているクエリがある場合、grep {queryID} be/log/be.INFOを実行してCancelキーワードを含むログがあるかを確認します。対応する時点がクエリがキャンセルされた時刻です。クエリがキャンセルされており、クエリがキャンセルされた時点とOOM Killerがトリガーされた時点が長時間離れている場合、Memory Problem FAQの[Query Cancel process stuck]の分析を参照してください。Memory Tracker 要約の分析については、Memory ログ Analysisを参照してください。

Jemalloc Metadataの大きなメモリ使用量

Memory GCは現在Jemalloc Metadataを解放できません。Memory TrackerLabel=tc/jemalloc_metadata Memory Trackerの分析を参照してメモリ使用量を削減してください。

Jemalloc Cacheの大きなメモリ使用量

Doris 2.0で一般的

Doris 2.0のbe.confJEMALLOC_CONFlg_tcache_maxのデフォルト値は20で、一部のシナリオでJemalloc Cacheが大きくなりすぎて自動的に解放されない原因となります。Jemalloc Memory Analysisを参照してJemalloc Cacheのメモリ使用量を削減してください。