linux out of memory分析(OOM)

來源:互聯網
上載者:User
原文:http://blog.csdn.net/guomsh/article/details/6536915Linux有一個特性:OOM Killer,一個保護機制,用於避免在記憶體不足的時候不至於出現嚴重問題,把一些無關的進程優先殺掉,即在記憶體嚴重不足時,系統為了繼續運轉,核心會挑選一個進程,將其殺掉,以釋放記憶體,緩解記憶體不足情況,不過這種保護是有限的,不能完全的保護進程的運行。    在很多情況下,經常會看到還有剩餘記憶體時,oom-killer依舊把進程殺死了,現象是在/var/log/messages記錄檔中有如下資訊:    Out of Memory: Killed process [PID] [process name].    該問題是low memory耗盡,因為核心使用low memory來跟蹤所有的記憶體配置。    當low memory耗盡,不管high memory剩多少,oom-killer都會殺死進程,以保持系統的正常運行。    在32位CPU下定址範圍是有限的,Linux核心定義了下面三個地區:
   # DMA: 0x00000000 -  0x00999999 (0 - 16 MB)    # LowMem: 0x01000000 - 0x037999999 (16 - 896 MB) - size: 880MB   # HighMem: 0x038000000 - <硬體特定> 
    LowMem區(也叫NORMAL ZONE)共880MB,並且是固定不能變的(除非使用hugemem核心),對於高負荷的系統,可能因為LowMem使用不好而觸發了OOM Killer機制。因為記憶體配置是一個連續的地區,在此時,如果LowMem裡存在很多片段或者LowFree太少,此時無法分配到一塊連續的記憶體地區,就觸發了OOM Killer。    查看當前LowFree值:    cat /proc/meminfo | grep LowFree    查看LowMem記憶體片段:    cat /proc/buddyinfo    上面這命令需要在2.6核心才有效。    有如下方法可以解決該問題:    1、升級到64位系統,這是最好的方法,因為此時所有的記憶體都屬low memory,如此時提示out of memory,則真的是low memory耗盡,真的OOM了。    2、如必須使用32位系統,那麼可以使用hugemem核心,此時核心會以不同的方式分割low/high memory,而大多數情況下會提供足夠多的low memory至high memory的映射,此時很簡單的一個修複方法是可以安裝hugemem核心包,然後重啟。    3、如果hugemem核心也用不了,那麼我們可以嘗試將/proc/sys/vm/lower_zone_protection的值設為250或更大,可使用如下命令查看和設定該值:       cat /proc/sys/vm/lower_zone_protection       echo 250 > /proc/sys/vm/lower_zone_protection       或者可以修改/etc/sysctl.conf檔案,以便重啟後生效,添加的內容如下:       vm.lower_zone_protection = 250    4、實在沒辦法,那麼我們把oom-killer關掉,不過該選項可能導致系統掛起,故要看實際情況使用。       查看當前的oom-killer的狀態:cat /proc/sys/vm/oom-kill       關閉/開啟oom-killer:       echo "0" > /proc/sys/vm/oom-kill       echo "1" > /proc/sys/vm/oom-kill       或者直接加到/etc/sysctl.conf檔案,內容如下:       vm.oom-kill = 0       此時,當進程被oom-killer嘗試殺死而沒有成功時,會把相關資訊記錄到/var/log/messages檔案中,資訊如下:       "Would have oom-killed but /proc/sys/vm/oom-kill is disabled"    5、或者不把oom-killer關掉,只針對單一進程處理,把某個進程保護起來,此時,我們可以使用如下命令:       echo -17 > /proc/[pid]/oom_adj       /proc/[pid]/oom_adj中oom_adj的取值範圍是-17~15,當該值為-17時,系統將不會殺死指定pid的進程,而-16~15則會使得進程的/proc/[pid]/oom_adj值呈指數(K*2^n)形式遞增,即它們被殺掉的可能性呈指數遞增。針對init(進程號為1)這個進程,無論該值設為多少都不會被殺。    6、參考資料       http://www.haw-haw.org/node/626       http://guogoul.com/2010/04/28/oom-killer-swap/       http://zhwen.org/xlog/?p=430       http://www.dbanotes.net/database/linux_outofmemory_oom_killer.html       http://www.sealinger.com/archives/185       以上是從網路上查到,結合自己的問題進行下補充:一開始由於系統配置是2G,而且沒有交換分區,所以每天導致out of memory,後來增加了實體記憶體,並做了交換分區,情況有所改善,但是運行2-3天后還是會出現out of memory的情況,後來分析記錄檔messages發現粗體部分,分析是low memory不足導致,後來自己實驗用sync ;echo 3 >> /proc/sys/vm/drop_caches可以將記憶體釋放出來,查看/proc/buddyinfo記憶體釋放出來。Jun 10 13:33:11 xx user.warn kernel: DMA free:3548kB min:68kB low:84kB high:100kB active:0kB inactive:0kB present:16384kB pages_scanned:0 all_unreclaimable? yesJun 10 13:33:11 xx user.warn kernel: lowmem_reserve[]: 0 0 880 4080Jun 10 13:33:11 xx user.warn kernel: DMA32 free:0kB min:0kB low:0kB high:0kB active:0kB inactive:0kB present:0kB pages_scanned:0 all_unreclaimable? noJun 10 13:33:11 xx user.warn kernel: lowmem_reserve[]: 0 0 880 4080 Jun 10 13:33:11 xx user.warn kernel: Normal free:1340kB min:3756kB low:4692kB high:5632kB active:0kB inactive:28kB present:901120kB pages_scanned:2456536 all_unreclaimable? yesJun 10 13:33:11 xx user.warn kernel: lowmem_reserve[]: 0 0 0 25600Jun 10 13:33:11 xx user.warn kernel: HighMem free:1615600kB min:512kB low:3928kB high:7344kB active:274112kB inactive:24928kB present:3276800kB pages_scanned:0 all_unreclaimable? noJun 10 13:33:11 xx user.warn kernel: lowmem_reserve[]: 0 0 0 0Jun 10 13:33:11 xx user.warn kernel: DMA: 1*4kB 1*8kB 1*16kB 0*32kB 1*64kB 1*128kB 1*256kB 0*512kB 1*1024kB 1*2048kB 0*4096kB = 3548kBJun 10 13:33:11 xx user.warn kernel: DMA32: emptyJ un 10 13:33:11 xx user.warn kernel: Normal: 1*4kB 1*8kB 1*16kB 1*32kB 0*64kB 0*128kB 1*256kB 0*512kB 1*1024kB 0*2048kB 0*4096kB = 1340kBJun 10 13:33:11 CHINASOFT user.warn kernel: HighMem: 8192*4kB 7506*8kB 5166*16kB 2932*32kB 1528*64kB 688*128kB 253*256kB 86*512kB 67*1024kB 12*2048kB 234*4096kB = 1615600kB

 

以上是自己遇到的問題,處理肯定有不對的地方,如果您發現請指正!補充:核心是2.26.16

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.