通過注入進程不斷消耗記憶體,類比Elastic Compute Service發生OOM(即記憶體溢出)情況,測試業務進程是否會被終止、檢測系統復原能力、驗證監控和警示機制的有效性等,並基於演練結果制定應對策略,確保生產環境發生OOM時系統能夠迅速恢複正常運行,降低業務中斷風險。
實現原理
本方案使用雲助手外掛程式ACS-ECS-HighMemory,注入前計算需要分配的記憶體大小,然後啟動trigger_oom注入進程,並以一定速率消耗記憶體,直至達到目標記憶體佔用。發生OOM時,作業系統根據進程評分選擇終止的進程,該評分由進程佔用記憶體大小和該進程的oom_score_adj計算所得。因此,在故障注入時可以調整注入進程的oom_score_adj參數,使作業系統在OOM發生時選擇終止業務進程或注入進程。oom_score_adj參數取值範圍-1000到1000,預設值為0,值越高該進程越容易被終止,為-1000時表示禁止OOM Killer終止該進程。
使用指南
演練準備
請確保您的ECS執行個體已安裝雲助手Agent,並且雲助手狀態為正常。具體操作,請參見查看雲助手狀態及異常狀態處理。
故障注入
登入ECS執行個體。
具體操作,請參見使用Workbench登入Linux執行個體。
使用具有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(秒)。
檢查故障注入是否成功。
未發生OOM情境:
執行
top命令,系統已使用記憶體達到目標使用率,說明故障注入成功。在控制台執行個體監控或CloudMonitor中,若記憶體使用量率達到目標使用率,說明故障注入成功。

OOM情境:在系統日誌中搜尋與
Out of memory相關的日誌。dmesg -T | grep "Out of memory"如下所示,表示ECS執行個體中已發生OOM,說明故障注入成功。並判斷終止的進程是否為目標進程,如未殺死目標進程可調整
score參數。
故障恢複
如指定目標記憶體使用量率,您可以使用以下方式,移除注入的故障。
方法一(推薦):在ECS執行個體中執行故障恢複命令,查看記憶體使用量率是否下降到故障注入前的水平。
sudo acs-plugin-manager --exec --plugin ACS-ECS-HighMemory --params recover方法二:等待逾時自動釋放故障,系統預設在達到設定的記憶體使用量率後,持續300秒後自動釋放記憶體。
未指定目標記憶體使用量率,會觸發OOM情境,一般系統會自動回復。建議對ECS執行重啟,防止非預期的進程被意外終止。
演練案例
故障注入,預期佔用90%記憶體,速率20 MB/s,期間120s。
sudo acs-plugin-manager --exec --plugin ACS-ECS-HighMemory --params inject,percent=90,rate=20,duration=120回顯類似如下所示時,說明故障注入成功。

查看注入效果。
使用top命令查看
執行
top命令後,按M鍵按記憶體佔用大小排序,然後按m鍵顯示記憶體佔用進度條。可以看到當前記憶體使用量率為90.2%,注入進程
trigger_oom佔用記憶體84.4%。
逾時後,系統自動釋放記憶體。記憶體回到演練前水平,注入進程退出。

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

查看控制台執行個體詳情,監控中的記憶體使用量率,系統的記憶體使用量率在注入後以一定速率上升,隨後到達目標記憶體90%,持續120秒後記憶體使用量率跌至注入前水平,演練恢複。
常見的OOM原因及解決方案
記憶體佔用較高會出現系統卡頓、內部服務響應速度變慢,您可以排查並分析記憶體過高原因並解決。具體操作,請參見Linux執行個體記憶體使用量率較高問題的排查與處理。
出現OOM可能是因為執行個體本身可使用的記憶體太少或某一個資源被頻繁申請導致系統資源耗盡等,您可以分析OOM出現的原因並解決。具體操作,請參見如何處理Linux執行個體中的OOM問題?。