• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大龍的博客

            常用鏈接

            統(tǒng)計

            最新評論

            linux malloc -------- OOM killer

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

            什么時候跳出來
            先看第一個問題,它什么時候會跳出來。是不是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返回非空指針,并不一定意味著指向的內(nèi)存就是可用的,Linux下允許程序申請比系統(tǒng)可用內(nèi)存更多的內(nèi)存,這 個特性叫Overcommit。這樣做是出于優(yōu)化系統(tǒng)考慮,因為不是所有的程序申請了內(nèi)存就立刻使用的,當(dāng)你使用的時候說不定系統(tǒng)已經(jīng)回收了一些資源了。 不幸的是,當(dāng)你用到這個Overcommit給你的內(nèi)存的時候,系統(tǒng)還沒有資源的話,OOM killer就跳出來了。
            Linux下有3種Overcommit的策略(參考內(nèi)核文檔:vm/overcommit-accounting),可以在/proc/sys/vm/overcommit_memory配置。取0,1和2三個值,默認(rèn)是0。
            0:啟發(fā)式策略,比較嚴(yán)重的Overcommit將不能得逞,比如你突然申請了128TB的內(nèi)存。而輕微的Overcommit將被允許。另外,root能Overcommit的值比普通用戶要稍微多些。
            1:永遠(yuǎn)允許Overcommit,這種策略適合那些不能承受內(nèi)存分配失敗的應(yīng)用,比如某些科學(xué)計算應(yīng)用。
            2:永遠(yuǎn)禁止Overcommit,在這個情況下,系統(tǒng)所能分配的內(nèi)存不會超過swap+RAM*系數(shù)(/proc/sys/vm/overcmmit_ratio,默認(rèn)50%,你可以調(diào)整),如果這么多資源已經(jīng)用光,那么后面任何嘗試申請內(nèi)存的行為都會返回錯誤,這通常意味著此時沒法運行任何新程序。
            補充(待考證):在這篇文章:Memory overcommit in Linux中,作者提到,實際上啟發(fā)策略只有在啟用了SMACK或者SELinux模塊時才會起作用,其他情況下等于永遠(yuǎn)允許策略。
            跳出來之后選擇進(jìn)程的策略
            好了,只要存在Overcommit,就可能會有OOM killer跳出來。那么OOM killer跳出來之后選目標(biāo)的策略又是什么呢?我們期望的是:沒用的且耗內(nèi)存多的程序被槍。
            Linux下這個選擇策略也一直在不斷的演化。作為用戶,我們可以通過設(shè)置一些值來影響OOM killer做出決策。Linux下每個進(jìn)程都有個OOM權(quán)重,在/proc/<pid>/oom_adj里面,取值是-17到+15,取值越高,越容易被干掉。
            最 終OOM killer是通過/proc/<pid>/oom_score這個值來決定哪個進(jìn)程被干掉的。這個值是系統(tǒng)綜合進(jìn)程的內(nèi)存消耗量、CPU時 間(utime + stime)、存活時間(uptime - start time)和oom_adj計算出的,消耗內(nèi)存越多分越高,存活時間越長分越低。總之,總的策略是:損失最少的工作,釋放最大的內(nèi)存同時不傷及無辜的用了 很大內(nèi)存的進(jìn)程,并且殺掉的進(jìn)程數(shù)盡量少。

            兩篇文章供你參考:

            http://blog.dccmx.com/2011/04/oom-killer-on-linux/
            http://linuxdevcenter.com/lpt/a/6808

            posted on 2012-05-14 14:26 大龍 閱讀(587) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            狠狠色婷婷综合天天久久丁香| 亚洲国产另类久久久精品小说 | 精品免费tv久久久久久久| 久久综合狠狠综合久久综合88| 国产精品毛片久久久久久久 | 亚洲国产婷婷香蕉久久久久久| 久久亚洲精品国产亚洲老地址| 新狼窝色AV性久久久久久| 青青草国产精品久久久久| 日韩精品无码久久一区二区三| 蜜臀久久99精品久久久久久小说| 精品久久久久久| 久久久精品久久久久影院| 国产精品成人久久久久三级午夜电影| 亚洲国产精品综合久久一线| 99精品国产在热久久| 国产69精品久久久久9999APGF| 婷婷综合久久中文字幕| 亚洲日韩中文无码久久| 久久人人超碰精品CAOPOREN| 国产国产成人精品久久| 精品国产99久久久久久麻豆| 精品久久综合1区2区3区激情| 人妻久久久一区二区三区| 亚洲伊人久久综合影院| 99久久精品无码一区二区毛片| 中文字幕乱码久久午夜| 亚洲日本va午夜中文字幕久久| 国产91久久综合| 国产成人综合久久久久久| 精品乱码久久久久久久| 三上悠亚久久精品| 99久久国产综合精品女同图片 | 99久久超碰中文字幕伊人| 久久精品人妻中文系列| 久久人人爽人人爽人人av东京热| 亚洲欧美精品一区久久中文字幕| 久久人人爽人人爽AV片| 亚洲国产精品成人AV无码久久综合影院 | 一级做a爰片久久毛片16| 欧美日韩中文字幕久久伊人|