一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Linux下OOM Killer機制詳解

 cwhbox 2011-11-19

Linux下OOM Killer機制詳解

Linux下面有個特性叫OOM killer(Out Of Memory killer),這個東西會在系統(tǒng)內存耗盡的情況下跳出來,選擇性的干掉一些進程以求釋放一些內存。相信廣大從事Linux服務端編程的農民工兄弟們或多或少遇到過(人在江湖漂,哪有不挨刀?。?。典型的情況是:某天機器突然登不上了,能ping通,但是ssh死活連不了。原因是sshd進程被OOM killer干掉了(淚流滿面)。重啟機器后查看系統(tǒng)日志會發(fā)現(xiàn)血淋淋的Out of Memory: Killed process ×××、Out of Memory: Killed process 〇〇〇。一篇狼藉,慘不忍睹。

前段時間我就被OOM killer虐過一次。情況是這樣的。一個簡單的分布式系統(tǒng),A,B,C等對稱的節(jié)點分擔處理X節(jié)點吐出的數(shù)據(jù),然后將結果塞到Y節(jié)點去。結果負荷一大,ABC處理不過來,數(shù)據(jù)堆積在內存中,內存耗光,逼得OOM killer出來收拾局面,sshd被干掉,更杯具的是,重啟后發(fā)現(xiàn),syslogd也被干掉了,而且是在sshd前面被干掉。想查日志也只能查到一部分。血淋淋的。這也引出了分布式系統(tǒng)設計中的問題:想上面那種設計,要防止ABC中某個節(jié)點突然掛掉,然后導致其他節(jié)點負荷突然增加緊跟著也掛掉(連鎖掛掉)。

回歸正題,Linux下面的OOM killer到底是什么樣一個機制呢,它在什么時候會跳出來,又會選擇那些進程下手呢。

什么時候跳出來

先看第一個問題,它什么時候會跳出來。是不是malloc返回NULL的時候跳出來呢?不是的,malloc的manpage里有下面一段話:

By default, Linux follows an  optimistic  memory  allocation  strategy. 
This  means  that  when malloc() returns non-NULL there is no guarantee 
that the memory really is available.  This is a  really  bad  bug.   In 
case  it  turns  out that the system is out of memory, one or more processes 
will be killed by the infamous OOM killer.   In  case  Linux  is 
employed  under  circumstances where it would be less desirable to suddenly 
lose some randomly picked processes, and moreover the kernel version  
is  sufficiently  recent,  one can switch off this overcommitting 
behavior using a command like:

# echo 2 > /proc/sys/vm/overcommit_memory

上面一段話告訴我們,Linux中malloc返回非空指針,并不一定意味著指向的內存就是可用的,Linux下允許程序申請比系統(tǒng)可用內存更多的內存,這個特性叫Overcommit。這樣做是出于優(yōu)化系統(tǒng)考慮,因為不是所有的程序申請了內存就立刻使用的,當你使用的時候說不定系統(tǒng)已經回收了一些資源了。不幸的是,當你用到這個Overcommit給你的內存的時候,系統(tǒng)還沒有資源的話,OOM killer就跳出來了。

Linux下有3種Overcommit的策略(參考內核文檔:vm/overcommit-accounting),可以在/proc/sys/vm/overcommit_memory配置。取0,1和2三個值,默認是0。

0:啟發(fā)式策略,比較嚴重的Overcommit將不能得逞,比如你突然申請了128TB的內存。而輕微的Overcommit將被允許。另外,root能Overcommit的值比普通用戶要稍微多些。

1:永遠允許Overcommit,這種策略適合那些不能承受內存分配失敗的應用,比如某些科學計算應用。

2:永遠禁止Overcommit,在這個情況下,系統(tǒng)所能分配的內存不會超過swap+RAM*系數(shù)(/proc/sys/vm/overcmmit_ratio,默認50%,你可以調整),如果這么多資源已經用光,那么后面任何嘗試申請內存的行為都會返回錯誤,這通常意味著此時沒法運行任何新程序。

補充(待考證):在這篇文章:Memory overcommit in Linux中,作者提到,實際上啟發(fā)策略只有在啟用了SMACK或者SELinux模塊時才會起作用,其他情況下等于永遠允許策略。

跳出來之后選擇進程的策略

好了,只要存在Overcommit,就可能會有OOM killer跳出來。那么OOM killer跳出來之后選目標的策略又是什么呢?我們期望的是:沒用的且耗內存多的程序被槍。

Linux下這個選擇策略也一直在不斷的演化。作為用戶,我們可以通過設置一些值來影響OOM killer做出決策。Linux下每個進程都有個OOM權重,在/proc/<pid>/oom_adj里面,取值是-17到+15,取值越高,越容易被干掉。

最終OOM killer是通過/proc/<pid>/oom_score這個值來決定哪個進程被干掉的。這個值是系統(tǒng)綜合進程的內存消耗量、CPU時間(utime + stime)、存活時間(uptime - start time)和oom_adj計算出的,消耗內存越多分越高,存活時間越長分越低??傊?,總的策略是:損失最少的工作,釋放最大的內存同時不傷及無辜的用了很大內存的進程,并且殺掉的進程數(shù)盡量少。

另外,Linux在計算進程的內存消耗的時候,會將子進程所耗內存的一半同時算到父進程中。這樣,那些子進程比較多的進程就要小心了。

當然還有其他的策略,大家可以參考文章:Taming the OOM killerWhen Linux Runs Out of Memory。

好了,就到這了,天氣不錯,出去伸個懶腰。

相關文章:

 

評論: 1

發(fā)表評論 ?


    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    五月婷婷六月丁香在线观看| 国产精品白丝久久av| 青青操视频在线观看国产 | 91超频在线视频中文字幕| 亚洲成人免费天堂诱惑| 蜜桃av人妻精品一区二区三区| 2019年国产最新视频| 国产午夜福利一区二区| 精品国模一区二区三区欧美| 又黄又爽禁片视频在线观看| 欧美一区二区三区性视频| 日韩精品一区二区三区av在线| 麻豆蜜桃星空传媒在线观看 | 欧美黑人暴力猛交精品| 五月婷婷亚洲综合一区| 好吊妞视频这里有精品| 欧美一区二区日韩一区二区| 国产成人精品综合久久久看| 国产精品刮毛视频不卡| 神马午夜福利一区二区| 91欧美日韩国产在线观看| 好吊妞视频免费在线观看| 日本女人亚洲国产性高潮视频| 欧美国产日本高清在线| 国产又粗又黄又爽又硬的| 亚洲夫妻性生活免费视频| 亚洲欧美日本视频一区二区| 色哟哟国产精品免费视频| 成人免费视频免费观看| 国产免费自拍黄片免费看| 老司机精品视频在线免费看 | 久久综合亚洲精品蜜桃| 日韩aa一区二区三区| 国产韩国日本精品视频| 午夜小视频成人免费看| 日韩欧美好看的剧情片免费| 五月激情五月天综合网| 成人午夜爽爽爽免费视频| 日韩免费成人福利在线| 国产极品粉嫩尤物一区二区 | 久久亚洲精品中文字幕|