oom_score_adj

1肆捕、在 linux 系統(tǒng)下,內(nèi)存不足會觸發(fā) OOM killer 去殺進(jìn)程
下面模擬一下誓军,幾秒之后顯示被Killed了:

$ cat oom.c
#include <stdlib.h>
#include <stdio.h>

#define BYTES (8 * 1024 * 1024)

int main(void) 
{
    printf("hello OOM \n");
    while(1)
    {
        char *p = malloc(BYTES);
        if (p == NULL)
        {
            return -1;
        }
    }
    return 0;
}
$ gcc oom.c 
$ ./a.out 
hello OOM 
Killed
$ 

dmesg 命令可以看到相關(guān) log:

a.out invoked oom-killer: gfp_mask=0x26084c0, order=0, oom_score_adj=0
Out of memory: Kill process 97843 (a.out) score 835 or sacrifice child

2巾腕、oom_score_adj
上面打印了oom_score_adj=0以及score 835,OOM killer 給進(jìn)程打分闪湾,把 oom_score 最大的進(jìn)程先殺死冲甘。
打分主要有兩部分組成:
一是系統(tǒng)根據(jù)該進(jìn)程的內(nèi)存占用情況打分,進(jìn)程的內(nèi)存開銷是變化的响谓,所以該值也會動態(tài)變化损合。
二是用戶可以設(shè)置的 oom_score_adj,范圍是 -10001000娘纷,定義在:
https://elixir.bootlin.com/linux/v5.0/source/include/uapi/linux/oom.h#L9

/*
 * /proc/<pid>/oom_score_adj set to OOM_SCORE_ADJ_MIN disables oom killing for
 * pid.
 */
#define OOM_SCORE_ADJ_MIN   (-1000)
#define OOM_SCORE_ADJ_MAX   1000

如果用戶將該進(jìn)程的 oom_score_adj 設(shè)定成 -1000嫁审,表示禁止OOM killer 殺死該進(jìn)程(代碼在 https://elixir.bootlin.com/linux/v5.0/source/mm/oom_kill.c#L222 )。比如 sshd 等非常重要的服務(wù)可以配置為 -1000赖晶。
如果設(shè)置為負(fù)數(shù)律适,表示分?jǐn)?shù)會打一定的折扣,
如果設(shè)置為正數(shù)遏插,分?jǐn)?shù)會增加捂贿,可以優(yōu)先殺死該進(jìn)程,
如果設(shè)置為0 胳嘲,表示用戶不調(diào)整分?jǐn)?shù)厂僧,0 是默認(rèn)值。

3了牛、測試設(shè)置 oom_score_adjoom_score 的影響

#include <stdlib.h>
#include <stdio.h>

#define BYTES (8 * 1024 * 1024)
#define N (10240)

int main(void) 
{
    printf("hello OOM \n");
    int i;
    for (i = 0; i < N; i++)
    {
        char *p = malloc(BYTES);
        if (p == NULL)
        {
            return -1;
        }
    }
    printf("while... \n");
    while(1);
    return 0;
}

下面是初始的分?jǐn)?shù):

$ cat /proc/$(pidof a.out)/oom_score_adj
0
$ cat /proc/$(pidof a.out)/oom_score
62

下面修改 oom_score_adj颜屠,oom_score 也隨之發(fā)生了變化:

$ sudo sh -c "echo -50 > /proc/$(pidof a.out)/oom_score_adj"
$ cat /proc/$(pidof a.out)/oom_score_adj
-50
$ cat /proc/$(pidof a.out)/oom_score
12
$ sudo sh -c "echo -60 > /proc/$(pidof a.out)/oom_score_adj"
$ cat /proc/$(pidof a.out)/oom_score_adj
-60
$ cat /proc/$(pidof a.out)/oom_score
2
$ sudo sh -c "echo -500 > /proc/$(pidof a.out)/oom_score_adj"
$ cat /proc/$(pidof a.out)/oom_score_adj
-500
$ cat /proc/$(pidof a.out)/oom_score
0

4辰妙、測試設(shè)置 oom_score_adj 設(shè)置為-1000 對系統(tǒng)的影響
如果把一個(gè)無限申請內(nèi)存的進(jìn)程設(shè)置為-1000,會發(fā)生什么呢:

$ sudo sh -c "echo -1000 > /proc/$(pidof a.out)/oom_score_adj"
$ dmesg | grep "Out of memory"
Out of memory: Kill process 1000 (mysqld) score 67 or sacrifice child
Out of memory: Kill process 891 (vmhgfs-fuse) score 1 or sacrifice child
Out of memory: Kill process 321 (systemd-journal) score 1 or sacrifice child
Out of memory: Kill process 1052 ((sd-pam)) score 1 or sacrifice child
Out of memory: Kill process 1072 (bash) score 0 or sacrifice child

因?yàn)?bash 掛了甫窟,所以 a.out 也掛了密浑。
如果 ./a.out & 在后臺運(yùn)行,就可以看到用更多進(jìn)程的 score 是 0 仍然掛掉了粗井,比如 sshd尔破、dhclient、systemd-logind浇衬、systemd-timesyn懒构、dbus-daemon 等,所以設(shè)置錯(cuò)誤的 oom_score_adj 后果比較嚴(yán)重径玖。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末痴脾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子梳星,更是在濱河造成了極大的恐慌赞赖,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冤灾,死亡現(xiàn)場離奇詭異前域,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)韵吨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門匿垄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人归粉,你說我怎么就攤上這事椿疗。” “怎么了糠悼?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵届榄,是天一觀的道長。 經(jīng)常有香客問我倔喂,道長铝条,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任席噩,我火速辦了婚禮班缰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘悼枢。我一直安慰自己埠忘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著莹妒,像睡著了一般假丧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上动羽,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機(jī)與錄音渔期,去河邊找鬼运吓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛疯趟,可吹牛的內(nèi)容都是我干的拘哨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼信峻,長吁一口氣:“原來是場噩夢啊……” “哼倦青!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盹舞,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤产镐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后踢步,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體癣亚,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年获印,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了述雾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡兼丰,死狀恐怖玻孟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鳍征,我是刑警寧澤黍翎,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站蟆技,受9級特大地震影響玩敏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜质礼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一旺聚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧眶蕉,春花似錦砰粹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弄痹。三九已至,卻和暖如春嵌器,著一層夾襖步出監(jiān)牢的瞬間肛真,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工爽航, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚓让,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓讥珍,卻偏偏與公主長得像历极,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子衷佃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353