全部產品
Search
文件中心

Elastic Compute Service:記憶體溢出(OOM)演練

更新時間:Dec 16, 2025

通過注入進程不斷消耗記憶體,類比Elastic Compute Service發生OOM(即記憶體溢出)情況,測試業務進程是否會被終止、檢測系統復原能力、驗證監控和警示機制的有效性等,並基於演練結果制定應對策略,確保生產環境發生OOM時系統能夠迅速恢複正常運行,降低業務中斷風險。

什麼是OOM和OOM Killer

OOM(Out Of Memory)指在作業系統中出現可用記憶體不足,無法滿足進程的記憶體申請需求的情境,可能會導致進程、系統不穩定。為應對此情境,Linux作業系統通過OOM Killer核心機制對各個進程評分(oom_score),優先終止優先順序低,記憶體佔用多的進程以釋放記憶體,防止因系統記憶體耗盡而觸發不可控的業務和系統崩潰。

實現原理

本方案使用雲助手外掛程式ACS-ECS-HighMemory,注入前計算需要分配的記憶體大小,然後啟動trigger_oom注入進程,並以一定速率消耗記憶體,直至達到目標記憶體佔用。發生OOM時,作業系統根據進程評分選擇終止的進程,該評分由進程佔用記憶體大小和該進程的oom_score_adj計算所得。因此,在故障注入時可以調整注入進程的oom_score_adj參數,使作業系統在OOM發生時選擇終止業務進程或注入進程。oom_score_adj參數取值範圍-1000到1000,預設值為0,值越高該進程越容易被終止,為-1000時表示禁止OOM Killer終止該進程。

使用指南

演練準備

請確保您的ECS執行個體已安裝雲助手Agent,並且雲助手狀態正常。具體操作,請參見查看雲助手狀態及異常狀態處理

故障注入

  1. 登入ECS執行個體。

    具體操作,請參見使用Workbench登入Linux執行個體

  2. 使用具有sudo存取權限的使用者,運行雲助手外掛程式ACS-ECS-HighMemory

    sudo acs-plugin-manager --exec --plugin ACS-ECS-HighMemory --params inject,[score=paramA],[percent=paramB],[rate=paramC],[duration=paramD]

    命令格式中的方括弧[]僅用於表示參數為可選項,實際使用時請去掉方括弧。

    例如,要設定記憶體佔用率為90%、期間為120秒。sudo acs-plugin-manager --exec --plugin ACS-ECS-HighMemory --params inject,percent=90,duration=120

    參數說明:

    • score(可選):用於設定注入進程的oom_score_adj取值範圍為 -1000到1000,通過設定該參數選擇在OOM發生時終止注入進程或業務進程。若需終止業務進程,請為注入進程設定一個負值,如-100,如業務進程未被終止,請調小score值。

    • percent(可選):系統總記憶體目標佔用大小,不填該參數時預設觸發OOM。

    • rate(可選):記憶體佔用速率,單位為MB/s,預設為0表示無限制。

    • duration(可選):達到目標佔用記憶體後的期間,單位為秒,逾時自動釋放記憶體,預設為300(秒)。

  3. 檢查故障注入是否成功。

    • 未發生OOM情境:

      • 執行top命令,系統已使用記憶體達到目標使用率,說明故障注入成功。

      • 在控制台執行個體監控或CloudMonitor中,若記憶體使用量率達到目標使用率,說明故障注入成功。

        image

    • OOM情境:在系統日誌中搜尋與Out of memory相關的日誌。

      dmesg -T | grep "Out of memory" 

      如下所示,表示ECS執行個體中已發生OOM,說明故障注入成功。並判斷終止的進程是否為目標進程,如未殺死目標進程可調整score參數。

      image

故障恢複

如指定目標記憶體使用量率,您可以使用以下方式,移除注入的故障。

  • 方法一(推薦):在ECS執行個體中執行故障恢複命令,查看記憶體使用量率是否下降到故障注入前的水平。

    sudo acs-plugin-manager --exec --plugin ACS-ECS-HighMemory --params recover
  • 方法二:等待逾時自動釋放故障,系統預設在達到設定的記憶體使用量率後,持續300秒後自動釋放記憶體。

未指定目標記憶體使用量率,會觸發OOM情境,一般系統會自動回復。建議對ECS執行重啟,防止非預期的進程被意外終止。

演練案例

  1. 故障注入,預期佔用90%記憶體,速率20 MB/s,期間120s。

    sudo acs-plugin-manager --exec --plugin ACS-ECS-HighMemory --params inject,percent=90,rate=20,duration=120

    回顯類似如下所示時,說明故障注入成功。

    image

  2. 查看注入效果。

    使用top命令查看

    1. 執行top命令後,按M鍵按記憶體佔用大小排序,然後按m鍵顯示記憶體佔用進度條。

      可以看到當前記憶體使用量率為90.2%,注入進程trigger_oom佔用記憶體84.4%。

      image

    2. 逾時後,系統自動釋放記憶體。記憶體回到演練前水平,注入進程退出。

      image

    在控制台執行個體詳情監控查看

    image

    查看控制台執行個體詳情,監控中的記憶體使用量率,系統的記憶體使用量率在注入後以一定速率上升,隨後到達目標記憶體90%,持續120秒後記憶體使用量率跌至注入前水平,演練恢複。

常見的OOM原因及解決方案