• <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>

            大龍的博客

            常用鏈接

            統計

            最新評論

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

            Linux下面有個特性叫OOM killer(Out Of Memory killer),這個東西會在系統內存耗盡的情況下跳出來,選擇性的干掉一些進程以求釋放一些內存。相信廣大從事Linux服務端編程的農民工兄弟們或多 或少遇到過(人在江湖漂,哪有不挨刀啊)。典型的情況是:某天機器突然登不上了,能ping通,但是ssh死活連不了。原因是sshd進程被OOM killer干掉了(淚流滿面)。重啟機器后查看系統日志會發現血淋淋的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返回非空指針,并不一定意味著指向的內存就是可用的,Linux下允許程序申請比系統可用內存更多的內存,這 個特性叫Overcommit。這樣做是出于優化系統考慮,因為不是所有的程序申請了內存就立刻使用的,當你使用的時候說不定系統已經回收了一些資源了。 不幸的是,當你用到這個Overcommit給你的內存的時候,系統還沒有資源的話,OOM killer就跳出來了。
            Linux下有3種Overcommit的策略(參考內核文檔:vm/overcommit-accounting),可以在/proc/sys/vm/overcommit_memory配置。取0,1和2三個值,默認是0。
            0:啟發式策略,比較嚴重的Overcommit將不能得逞,比如你突然申請了128TB的內存。而輕微的Overcommit將被允許。另外,root能Overcommit的值比普通用戶要稍微多些。
            1:永遠允許Overcommit,這種策略適合那些不能承受內存分配失敗的應用,比如某些科學計算應用。
            2:永遠禁止Overcommit,在這個情況下,系統所能分配的內存不會超過swap+RAM*系數(/proc/sys/vm/overcmmit_ratio,默認50%,你可以調整),如果這么多資源已經用光,那么后面任何嘗試申請內存的行為都會返回錯誤,這通常意味著此時沒法運行任何新程序。
            補充(待考證):在這篇文章:Memory overcommit in Linux中,作者提到,實際上啟發策略只有在啟用了SMACK或者SELinux模塊時才會起作用,其他情況下等于永遠允許策略。
            跳出來之后選擇進程的策略
            好了,只要存在Overcommit,就可能會有OOM killer跳出來。那么OOM killer跳出來之后選目標的策略又是什么呢?我們期望的是:沒用的且耗內存多的程序被槍。
            Linux下這個選擇策略也一直在不斷的演化。作為用戶,我們可以通過設置一些值來影響OOM killer做出決策。Linux下每個進程都有個OOM權重,在/proc/<pid>/oom_adj里面,取值是-17到+15,取值越高,越容易被干掉。
            最 終OOM killer是通過/proc/<pid>/oom_score這個值來決定哪個進程被干掉的。這個值是系統綜合進程的內存消耗量、CPU時 間(utime + stime)、存活時間(uptime - start time)和oom_adj計算出的,消耗內存越多分越高,存活時間越長分越低。總之,總的策略是:損失最少的工作,釋放最大的內存同時不傷及無辜的用了 很大內存的進程,并且殺掉的進程數盡量少。

            兩篇文章供你參考:

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

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

            久久高清一级毛片| 丁香五月网久久综合| 亚洲国产成人久久综合碰| 精品久久久久成人码免费动漫| 久久天天躁狠狠躁夜夜av浪潮| 99精品国产99久久久久久97| 精品国产福利久久久| 中文精品99久久国产 | 久久精品国产亚洲AV香蕉| 久久无码av三级| 人妻少妇久久中文字幕一区二区| 久久国产亚洲精品麻豆| 久久久精品人妻无码专区不卡| 午夜精品久久久久久99热| 91久久成人免费| 久久夜色精品国产噜噜亚洲AV | 思思久久精品在热线热| 国产成人久久激情91| 国内精品久久久久| 久久国语露脸国产精品电影| 久久精品国产精品亚洲下载| 粉嫩小泬无遮挡久久久久久| 伊人久久久AV老熟妇色| 久久精品国产欧美日韩99热| 久久久精品久久久久久| 久久久久久久综合日本亚洲| 久久这里只有精品18| 午夜精品久久久久久久久| 伊人久久大香线蕉亚洲 | 久久久久久精品成人免费图片| 韩国无遮挡三级久久| 国内精品久久久久久99| 亚洲AV无码久久精品狠狠爱浪潮| 久久久久97国产精华液好用吗| 久久水蜜桃亚洲av无码精品麻豆| 国产A三级久久精品| 国内精品综合久久久40p| 久久婷婷国产剧情内射白浆| 91性高湖久久久久| 精品久久久久久无码中文野结衣| 久久伊人精品青青草原高清|