[英]Linux OOM killer does not work
我想測試內核OOM殺手是否在我的嵌入式Linux上運行良好。 我使用應用程序測試來填充所有內存,看看如果系統在內存不足的情況下運行,OOM是否會終止我的應用程序。
我用過的測試程序:
#include <stdio.h>
#include <stdlib.h>
#define MEGABYTE 1024*1024
int main(int argc, char *argv[])
{
void *myblock = NULL;
int count = 0;
while(1)
{
myblock = (void *) malloc(MEGABYTE);
if (!myblock) break;
memset(myblock,1, MEGABYTE);
printf("Currently allocating %d MB\n",++count);
}
exit(0);
}
結果:
我總是得到:
MyApplication triggered out of memory codition (oom killer not called): gfp_mask=0x1200d2, order=0, oomkilladj=0
我嘗試通過添加以下內容來更改/ etc / sysctl:
vm.oom_kill_allocating_task=1
vm.panic_on_oom=0
vm.overcommit_memory=0
how can I make OOM works fine on my system
內核版本:2.6.30#7 SMP PREEMPT
Linux“OOM殺手”是解決過度使用問題的解決方案。
如果你只是“填滿所有記憶”,那么過度使用就不會出現。 malloc
調用最終將返回一個空指針,該約定指示無法滿足內存請求。
為了引起與過度使用相關的問題,你必須在沒有寫入內容的情況下分配太多內存,然后決定寫入所有內存,以便系統發現自己被迫遵守它所做的承諾而沒有能力來實現它們。
提供源代碼后編輯:
為了完全准確,為了觸發過度使用的問題並強制Linux OOM殺手采取行動,你應該有幾個進程在第一階段都使用malloc()
保留內存(但是還沒有寫入它)。 然后讓他們全部寫入他們同時保留的內存。 這將迫使Linux在任何內存分配之外兌現內存承諾,並且它將別無選擇,只能殺死未分配的進程(因為那時它們都不會分配)。
此外,如果您仍想查看OOM殺手如何或何時起作用。 我建議你在while循環之前添加fork() 。 這將創建許多進程,並最終其中一個OOM殺手將殺死。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.