您好,登錄后才能下訂單哦!
最近遇到了一個程序運(yùn)行時間長后,操作系統(tǒng)由于out of memory 導(dǎo)致系統(tǒng)的oom-killer將程序直接殺死的問題:
錯誤提示大概為:
Out of memory: Kill process 20011 (main) score 58 or sacrifice child
Killed process 20011 (main) total-vm:21688384kB, anon-rss:715844kB, file-rss:816256kB
這些錯誤可以在linux系統(tǒng)的/var/log/syslog文件中找到
這涉及到oom-killer的問題,具體詳見:http://blog.csdn.net/gugemichael/article/details/24017515
解決方法1:
修改/proc/sys/vm/lowmem_reserve_ratio文件,即:echo 512 > /proc/sys/vm/lowmem_reserve_ratio
1、malloc是分配虛擬地址空間,如果不memset或者bzero,那么就不會觸發(fā)physical allocate,不會映射物理地址,所以這里用bzero填充
2、每次申請的block大小比較有講究,Linux內(nèi)核分為LowMemroy和HighMemroy,LowMemory為內(nèi)存緊張資源,LowMemroy有個閥值,通過free -lm和
/proc/sys/vm/lowmem_reserve_ratio來查看當(dāng)前l(fā)ow大小和閥值low大小。低于閥值時候才會觸發(fā)oom killer,所以這里block的分配小雨默認(rèn)的256M,否則如果每次申請512M(大于128M),malloc可能會被底層的brk這個syscall阻塞住,內(nèi)核觸發(fā)page cache回寫或slab回收。
解決方法2:(來自http://orax.blog.sohu.com/144138537.html)
調(diào)整3個虛擬內(nèi)存參數(shù):
l vm.min_free_kbytes=409600
l vm.vfs_cache_pressure=200
l vm.swappiness =40
調(diào)整MIN_FREE_KBYTES的目的是保持物理內(nèi)存有足夠的空閑空間,防止突發(fā)性的換頁。Swapiness缺省為60,減少swapiness會使系統(tǒng)盡快通過swapout不使用的進(jìn)程資源來釋放更多的物理內(nèi)存。Vfs_cache_pressure的缺省值是100,加大這個參數(shù)設(shè)置了虛擬內(nèi)存回收directory和i-node緩沖的傾向,這個值越大,回收的傾向越嚴(yán)重。調(diào)整這三個參數(shù)的目的就是讓操作系統(tǒng)在平時就盡快的回收緩沖,釋放物理內(nèi)存,這樣就可以避免突發(fā)性的大規(guī)模換頁。
sysctl命令調(diào)整了三個參數(shù):
#sysctl -w vm.min_free_kbytes=409600//我這里改的是3000000單位是k字節(jié)(因為我的內(nèi)存為8GB),也就是cache頁最少要為3GB,小了就讓系統(tǒng)內(nèi)核釋放物理內(nèi)存
#sysctl -w vm.vfs_cache_pressure=200
#sysctl -w vm.swappiness=40
參數(shù)修改完畢后,進(jìn)入/proc/sys/vm目錄,檢查這三個參數(shù)是否修改正確:
#cd /proc/sys/vm
#cat min_free_kbytes
#cat vfs_cache_pressure
#cat swappiness
參數(shù)修改完畢后,過了幾分鐘,1號節(jié)點上的空閑物理內(nèi)存明顯回升。說明參數(shù)確實起作用了。上面的操作完成了對目前系統(tǒng)的調(diào)整,永久性的設(shè)置需要修改/etc/sysctl.conf參數(shù)文件。
cd /etc
#cp sysctl.conf sysctl.conf.save20080304
#vi sysctl.conf
添加如下內(nèi)容:
#modify vm parameter
vm.min_free_kbytes=409600
vm.vfs_cache_pressure=200
vm.swappiness =40
解決方法3:
直接修改/proc/PID/oom_adj文件,將其置位-17,此時oom-killer選擇kill程序時,要保護(hù)的進(jìn)程的score 值為0,score值越高,oom-killer就越會選擇該程序,將其殺死
echo -17 /proc/8163/oom_adj
解決方法4:(來自http://blog.csdn.net/tenfyguo/article/details/9409743)
直接關(guān)閉oom-killer
OOM Killer的關(guān)閉與激活方式:
# echo "0" > /proc/sys/vm/oom-kill
# echo "1″ > /proc/sys/vm/oom-kill
其他精彩文章文章
更多關(guān)于android開發(fā)文章
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。