一、OOM機制
OOM機制是Linux操作系統中的一個重要特性,它可以在系統內存不足時自動殺死一些進程來釋放內存。這個機制的出現是為了解決系統內存管理的問題,避免資源的浪費和系統的宕機。Linux的OOM機制基于進程的OOM得分來確定哪個進程將被殺死,得分越高的進程越容易被殺死。
二、相關系統參數
在Linux系統中,有一些相關的系統參數可以用來控制OOM機制的行為,包括:
1. vm.overcommit_memory:該參數控制內存分配時系統的行為。
查看方式:cat /proc/sys/vm/overcommit_memory
vm.overcommit_memory=0時,表示內存分配時不檢查系統內存是否足夠,而是依靠后續的OOM killer來殺死進程。
vm.overcommit_memory=1時,永遠允許進程overcommit,不會觸發OOM killer。
vm.overcommit_memory=2時,永遠禁止overcommit,不會觸發OOM killer。
2. vm.panic_on_oom:該參數控制系統在內存不足時是否崩潰。
查看方式:cat /proc/sys/vm/panic_on_oom
   vm.panic_on_oom=0:內存不足時,啟動 OOM killer。
   vm.panic_on_oom=1:內存不足時,有可能會觸發 kernel panic,也有可能啟動 OOM killer。
   vm.panic_on_oom=2:內存不足時,表示強制觸發 kernel panic,導致系統重啟。
3. vm.oom_kill_allocating_task:該參數控制在內存不足時是否殺死正在分配內存的進程。
查看方式:cat /proc/sys/vm/oom_kill_allocating_task
vm.oom_kill_allocating_task=0時,表示系統會殺死使用得分最高的進程。
vm.oom_kill_allocating_task值為非0時,表示系統會殺死正在分配內存的進
vm.oom_kill_allocating_task:該參數控制在內存不足時是否殺死正在分配內存的進程。
4. 控制進程打分參數
查看路徑: /proc/進程PID/
oom_score:內核對進程的打分,包含系統打分和用戶打分。
oom_score_adj:用戶打分。通過調整 oom_score_adj 的值來決定最終 oom_score 的值,oom_score_adj 的取值范圍是 -1000~1000,為0時表示用戶不調整 oom_score。
oom_adj:舊的接口參數,其功能類似oom_score_adj,為了兼容,目前仍然保留這個參數,當操作這個參數的時候,kernel實際上是會換算成oom_score_adj
三、使用ChaosBlade模擬OOM的表現
ChaosBlade是一種開源的混沌工程實驗工具,可以用來模擬各種系統問題,包括OOM。使用ChaosBlade模擬OOM的方法如下:
1. 安裝ChaosBlade。
從github下載最新版本并解壓://github.com/chaosblade-io/chaosblade/releases
進入主路徑:cd chaosblade/
確認是否安裝成功:./blade v
2. 修改OOM相關系統參數
3. 執行以下命令來模擬OOM:
./blade create mem load --mem-percent 90
4. 查看系統日志是否出現了OOM
dmesg -T