在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

細說Linux Out Of Memory機制

Linux愛好者 ? 來源:Linux內(nèi)核那些事 ? 2023-02-12 09:57 ? 次閱讀

有時候我們會發(fā)現(xiàn)系統(tǒng)中某個進程會突然掛掉,通過查看系統(tǒng)日志發(fā)現(xiàn)是由于OOM機制導(dǎo)致進程被殺掉。

今天我們就來介紹一下什么是OOM機制以及怎么防止進程因為OOM機制而被殺掉。

什么是OOM機制

OOM是 Out Of Memory 的縮寫,中文意思是內(nèi)存不足。而OOM機制是指當(dāng)系統(tǒng)內(nèi)存不足時,系統(tǒng)觸發(fā)的應(yīng)急機制。

當(dāng) Linux 內(nèi)核發(fā)現(xiàn)系統(tǒng)中的物理內(nèi)存不足時,首先會對系統(tǒng)中的可回收內(nèi)存進行回收,能夠被回收的內(nèi)存有如下:

讀寫文件時的頁緩存。

為了性能而延遲釋放的空閑 slab 內(nèi)存頁。

當(dāng)系統(tǒng)內(nèi)存不足時,內(nèi)核會優(yōu)先釋放這些內(nèi)存頁。因為使用這些內(nèi)存頁只是為了提升系統(tǒng)的性能,釋放這些內(nèi)存頁也不會影響系統(tǒng)的正常運行。

如果釋放上述的內(nèi)存后,還不能解決內(nèi)存不足的情況,那么內(nèi)核會如何處理呢?答案就是:觸發(fā)OOM killer殺掉系統(tǒng)中占用內(nèi)存最大的進程。如下圖所示:

2c15eae4-a98d-11ed-bfe3-dac502259ad0.png

可以看出,OOM killer 是防止系統(tǒng)崩潰的最后一個手段,不到迫不得已的情況是不會觸發(fā)的。

OOM killer 實現(xiàn)

接下來,我們分析一下內(nèi)核是如何實現(xiàn) OOM killer 的。

由于在 Linux 系統(tǒng)中,進程申請的都是虛擬內(nèi)存地址。所以當(dāng)程序調(diào)用malloc()申請內(nèi)存時,如果虛擬內(nèi)存空間足夠的話,是不會觸發(fā) OOM 機制的。

當(dāng)進程訪問虛擬內(nèi)存地址時,如果此虛擬內(nèi)存地址還沒有映射到物理內(nèi)存地址的話,那么將會觸發(fā)缺頁異常。

在缺頁異常處理例程中,將會申請新的物理內(nèi)存頁,并且將進程的虛擬內(nèi)存地址映射到剛申請的物理內(nèi)存。

如果在申請物理內(nèi)存時,系統(tǒng)中的物理內(nèi)存不足,那么內(nèi)核將會回收一些能夠被回收的文件頁緩存。如果回收完后,物理內(nèi)存還是不足的話,那么將會觸發(fā)swapping機制(如果開啟了的話)。

swapping機制會將某些進程不常用的內(nèi)存頁寫入到交換區(qū)(硬盤分區(qū)或文件)中,然后釋放掉這些內(nèi)存頁,從而達到緩解內(nèi)存不足的情況。

如果通過上面的手段還不能解決內(nèi)存不足的情況,那么內(nèi)核將會調(diào)用pagefault_out_of_memory()函數(shù)來殺掉系統(tǒng)中占用物理內(nèi)存最多的進程。

我們來看看pagefault_out_of_memory()函數(shù)的實現(xiàn):

voidpagefault_out_of_memory(void)
{
...
out_of_memory(NULL,0,0,NULL,false);
...
}

可以看出,pagefault_out_of_memory()函數(shù)最終會調(diào)用out_of_memory()來殺死系統(tǒng)中占用內(nèi)存最多的進程。

我們繼續(xù)來看看out_of_memory()函數(shù)的實現(xiàn):

voidout_of_memory(structzonelist*zonelist,gfp_tgfp_mask,intorder,
nodemask_t*nodemask,boolforce_kill)
{
...

//1.從系統(tǒng)中選擇一個最壞(占用內(nèi)存最多)的進程
p=select_bad_process(&points,totalpages,mpol_mask,force_kill);
...

//2.如果找到最壞的進程,那么調(diào)用oom_kill_process函數(shù)殺掉進程
if(p!=(void*)-1UL){
oom_kill_process(p,gfp_mask,order,points,totalpages,NULL,
nodemask,"Outofmemory");
killed=1;
}
...
}

out_of_memory()函數(shù)的邏輯比較簡單,主要完成兩個事情:

調(diào)用select_bad_process()函數(shù)從系統(tǒng)中選擇一個最壞(占用物理內(nèi)存最多)的進程。

如果找到最壞的進程,那么調(diào)用oom_kill_process()函數(shù)將此進程殺掉。

從上面的分析可知,找到最壞的進程是 OOM killer 最為重要的事情。

那么我們來看看select_bad_process()函數(shù)是怎樣選擇最壞的進程的:

staticstructtask_struct*
select_bad_process(unsignedint*ppoints,unsignedlongtotalpages,
constnodemask_t*nodemask,boolforce_kill)
{
structtask_struct*g,*p;
structtask_struct*chosen=NULL;
unsignedlongchosen_points=0;
...

//1.遍歷系統(tǒng)中所有的進程和線程
for_each_process_thread(g,p){
unsignedintpoints;
...

//2.計算進程最壞分?jǐn)?shù)值,選擇分?jǐn)?shù)最大的進程作為殺掉的目標(biāo)進程
points=oom_badness(p,NULL,nodemask,totalpages);
if(!points||points

select_bad_process()函數(shù)的主要工作如下:

遍歷系統(tǒng)中所有的進程和線程,并且調(diào)用oom_badness()函數(shù)計算進程的最壞分?jǐn)?shù)值。

選擇最壞分?jǐn)?shù)值最大的進程作為被殺掉的目標(biāo)進程。

所以,計算進程的最壞分?jǐn)?shù)值就是 OOM killer 的核心工作。我們接著來看看oom_badness()函數(shù)是怎么計算進程的最壞分?jǐn)?shù)值的:

unsignedlong
oom_badness(structtask_struct*p,structmem_cgroup*memcg,
constnodemask_t*nodemask,unsignedlongtotalpages)
{
longpoints;
longadj;

//1.如果進程不能被殺掉(init進程和內(nèi)核進程是不能被殺的)
if(oom_unkillable_task(p,memcg,nodemask))
return0;
...

//2.我們可以通過/proc/{pid}/oom_score_adj文件來設(shè)置進程的被殺建議值,
//這個值越小,進程被殺的機會越低。如果設(shè)置為-1000時,進程將被禁止殺掉。
adj=(long)p->signal->oom_score_adj;
if(adj==OOM_SCORE_ADJ_MIN){
...
return0;
}

//3.統(tǒng)計進程使用的物理內(nèi)存數(shù)
points=get_mm_rss(p->mm)
+atomic_long_read(&p->mm->nr_ptes)
+get_mm_counter(p->mm,MM_SWAPENTS);
...

//4.加上進程被殺建議值,得出最終的分?jǐn)?shù)值
adj*=totalpages/1000;
points+=adj;

returnpoints>0?points:1;
}

oom_badness()函數(shù)主要按照以下步驟來計算進程的最壞分?jǐn)?shù)值:

如果進程不能被殺掉(init進程和內(nèi)核進程是不能被殺的),那么返回分?jǐn)?shù)值為 0。

可以通過/proc/{pid}/oom_score_adj文件來設(shè)置進程的 OOM 建議值(取值范圍為 -1000 ~ 1000)。建議值越小,進程被殺的機會越低。如果將其設(shè)置為 -1000 時,進程將被禁止殺掉。

統(tǒng)計進程使用的物理內(nèi)存數(shù),包括實際使用的物理內(nèi)存、頁表占用的物理內(nèi)存和 swap 機制占用的物理內(nèi)存。

最后加上進程的 OOM 建議值,得出最終的分?jǐn)?shù)值。

通過oom_badness()函數(shù)計算出進程的最壞分?jǐn)?shù)值后,系統(tǒng)就能從中選擇一個分?jǐn)?shù)值最大的進程殺死,從而解決內(nèi)存不足的情況。

禁止進程被 OOM 殺掉

有時候,我們不希望某些進程被 OOM killer 殺掉。例如 MySQL 進程如果被 OOM killer 殺掉的話,那么可能導(dǎo)致數(shù)據(jù)丟失的情況。

那么如何防止進程被 OOM killer 殺掉呢?從上面的分析可知,在內(nèi)核計算進程最壞分?jǐn)?shù)值時,會加上進程的oom_score_adj(OOM建議值)值。如果將此值設(shè)置為-1000時,那么系統(tǒng)將會禁止 OOM killer 殺死此進程。

例如使用如下命令,將會禁止殺死 PID 為 2000 的進程:

$echo-1000>/proc/2000/oom_score_adj

這樣,我們就能防止一些重要的進程被 OOM killer 殺死。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11406

    瀏覽量

    212078
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3096

    瀏覽量

    74828
  • Memory
    +關(guān)注

    關(guān)注

    1

    文章

    79

    瀏覽量

    29422
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4361

    瀏覽量

    63637
  • 虛擬內(nèi)存
    +關(guān)注

    關(guān)注

    0

    文章

    77

    瀏覽量

    8175

原文標(biāo)題:細說:Linux Out Of Memory機制

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 0人收藏

    評論

    相關(guān)推薦

    Matlab Out of memory問題總結(jié)(1)

    首先,我要聲明,matlab自帶的Help才是最權(quán)威的Matlab學(xué)習(xí)資料,如果有時間好好學(xué)習(xí)一下或是可以高效的使用的話,一定受益匪淺!比如說像Out of Memory這個問題,最開始我都是用
    發(fā)表于 02-24 15:26

    Matlab Out of memory問題總結(jié)(2)

    arrayY1000x10004004000double array (sparse)5.使用pack命令當(dāng)內(nèi)存被分為很多碎片以后,其實本身可能有很大的空間,只是沒有作構(gòu)的連續(xù)空間即大的Block而已。如果此時Out
    發(fā)表于 02-24 15:27

    詳解Linux能力機制

    Linux能力機制
    發(fā)表于 04-20 08:23

    運行時出現(xiàn)out of memory是堆配置原因嗎

    [C674X_0] ti.sy***ios.heaps.HeapMem: line 307: out of memory: handle=0xc01d7118, size
    發(fā)表于 04-22 14:15

    pads 9.5 / VX2.11 Out of memory

    在win10/win11下使用PADS layout時,報錯‘’Out of memory‘’,或者報錯‘’數(shù)據(jù)庫嚴(yán)重錯誤編號 2010‘’已經(jīng)嘗試過:1.加大內(nèi)存條內(nèi)存,無法解決2.加大虛擬內(nèi)存
    發(fā)表于 03-25 18:58

    Linux內(nèi)核詳細說

    Linux_內(nèi)核詳細說
    發(fā)表于 03-28 09:46 ?35次下載

    Linux與VxWorks任務(wù)調(diào)度機制分析

    Linux與VxWorks任務(wù)調(diào)度機制分析
    發(fā)表于 03-28 09:52 ?19次下載

    linux內(nèi)存管理機制淺析

    本內(nèi)容介紹了arm linux內(nèi)存管理機制,詳細說明了linux內(nèi)核內(nèi)存管理,linux虛擬內(nèi)存管理,arm
    發(fā)表于 12-19 14:09 ?73次下載
    <b class='flag-5'>linux</b>內(nèi)存管理<b class='flag-5'>機制</b>淺析

    linux內(nèi)核oom機制分析

    Linux 內(nèi)核有個機制叫OOM killer(Out-Of-Memory killer),該機制會監(jiān)控那些占用內(nèi)存過大,尤其是瞬間很快消耗大量內(nèi)存的進程,為了防止內(nèi)存耗盡而內(nèi)核會把該
    發(fā)表于 11-13 17:01 ?1473次閱讀
    <b class='flag-5'>linux</b>內(nèi)核oom<b class='flag-5'>機制</b>分析

    你知道linux的cache memory

    當(dāng)你讀寫文件的時候,Linux內(nèi)核為了提高讀寫性能與速度,會將文件在內(nèi)存中進行緩存,這部分內(nèi)存就是Cache Memory(緩存內(nèi)存)。即使你的程序運行結(jié)束后,Cache Memory也不會自動釋放。
    發(fā)表于 04-26 15:49 ?1297次閱讀

    Memory芯片的測試資料詳細說

    本文檔的主要內(nèi)容詳細介紹的是Memory芯片的測試資料詳細說明包括了:Memory芯片的重要性,Memory類型和結(jié)構(gòu)特點, Memory
    發(fā)表于 11-30 08:00 ?0次下載
    <b class='flag-5'>Memory</b>芯片的測試資料詳<b class='flag-5'>細說</b>明

    Linux的內(nèi)核定制方法詳細說

    本文檔的主要內(nèi)容詳細介紹的是Linux的內(nèi)核定制方法詳細說
    發(fā)表于 02-26 11:14 ?22次下載

    Linux的內(nèi)核定制方法詳細說

    本文檔的主要內(nèi)容詳細介紹的是Linux的內(nèi)核定制方法詳細說
    發(fā)表于 02-26 11:14 ?4次下載

    Linux內(nèi)核文件Cache機制

    Linux內(nèi)核文件Cache機制(開關(guān)電源技術(shù)與設(shè)計 第二版)-Linux內(nèi)核文件Cache機制? ? ? ? ? ? ? ??
    發(fā)表于 08-31 16:34 ?4次下載
    <b class='flag-5'>Linux</b>內(nèi)核文件Cache<b class='flag-5'>機制</b>

    OOM Killer機制學(xué)習(xí)

    當(dāng)系統(tǒng)內(nèi)存不足以分配時,Linux內(nèi)核會使用一種OOM Killer(Out-Of-Memory Killer)機制釋放內(nèi)存,該機制通過一系列比較選擇出最適合的進程并將其kill掉,從
    的頭像 發(fā)表于 12-19 16:17 ?1409次閱讀

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學(xué)習(xí)
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品
    主站蜘蛛池模板: 神马午夜第九 | 日本最好的免费影院 | 边做饭边被躁欧美三级小说 | 国产免费小视频 | 奇米影视大全 | 精品欧美小视频在线观看 | 国模龙园园私拍337p | 亚洲三级在线 | 国产美女被艹 | 天天射天天射天天射 | 国产一级特黄的片子 | 欧美人与z0zoxxxx特 | 国产黄网站 | 日韩电影天堂网 | 国产一级真人毛爱做毛片 | 色中色官网 | 狠狠色狠狠色综合日日不卡 | 曰本性l交片视频视频 | 色综合天天综合 | 222www免费观看 | 午夜欧美精品久久久久久久 | 国产香蕉视频在线观看 | 免费人成年激情视频在线观看 | 中文字幕在线永久在线视频2020 | 亚洲欧美在线一区二区 | 久久性久久性久久久爽 | 88xx成人永久免费观看 | 黄色刺激网站 | 欧美一级特黄aa大片视频 | 欧美特级午夜一区二区三区 | 久久国产免费观看精品 | 六月丁香色婷婷 | 亚洲色图综合网站 | 另类free性欧美护士 | 久久午夜精品 | 久久免费福利视频 | 欧美a色爱欧美综合v | 在线观看高清免费播放 | 久久www免费人成_看 | 韩国特黄特色a大片免费 | 久久国产99 |