溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ubuntu 解決cache逐漸變大導(dǎo)致oom-killer將某些進(jìn)程殺死的情況

發(fā)布時間:2020-06-10 00:00:19 來源:網(wǎng)絡(luò) 閱讀:3595 作者:dyllove98 欄目:移動開發(fā)

最近遇到了一個程序運(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


其他精彩文章文章

Android KSOAP2調(diào)用.net webservice

jQuery教程(8)-DOM樹操作之使用反向插入方法

android學(xué)習(xí)筆記(34)使用AlertDialog創(chuàng)建簡單對話框

android學(xué)習(xí)筆記(33)畫廊視圖(Gallery)的功能和用法

android navidgation drawer 在導(dǎo)航抽屜中如何改變List選中項的...


更多關(guān)于android開發(fā)文章


向AI問一下細(xì)節(jié)

免責(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)容。

AI