簡體   English   中英

Linux OOM殺手不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM