Linux下防止進程使用swap及防止OOM機制導致進程被kill掉

首先解釋兩個概念:
swap:在linux裏面,當物理內存不夠用了,而又有新的程序請求分配內存,那麼linux就會選擇將其他程序暫時不用的數據交換到物理磁盤上(swap out),等程序要用的時候再讀進來(swap in)。這樣做的壞處顯而易見,swap in/swap out這裏的代價比較大,相比數據一直放在內存裏面,多了讀磁盤的操作,而磁盤IO代價。。大家都懂的。
OOM:out of memory,指在linux裏面,由於系統內存壓力,系統會選擇保護一些系統進程,而將一些其他的進程kill掉,釋放內存。

那麼在linux裏面怎麼可以做到這兩點呢?
一、禁止使用swap
1.  可以設置/proc/sys/vm/swappiness=0,不過這就禁用了所有進程使用swap(實際上設置爲0並不能完全禁止使用swap,而是隻能儘量減少使用swap可能性)
2.  給進程分配內存的時候,讓它使用hugepage內存。設置方法:
1>vi /etc/sysctl.conf ; 添加 vm.nr_hugepages=hugepage_num(多少頁大頁內存,這個必須大於進程需要的最大內存,比如mysqld buffer pool=5G,那麼hugepage_num*page_size>5G)  ; sysctl -p 生效。
2>這樣可以防止進程使用hugepage的原因:在進程使用hugepage分配內存時,是一次性分配、且獨佔的,既然一次性已經分配滿了那也不存在使用swap的理由,你可以通過top命令看到進程一開始就佔用了你所爲它設定大小的內存。
3.  可以設置/proc/sys/vm/overcommit_memory=2(其他值代表什麼含義,可以自己google,另外自己測試中發現這個值如果大於2,那麼效果和2一樣) 在值爲2的情況下,可以分配的內存最大大小在swap size + RAM*((/proc/sys/vm/overcommit_ratio) / 100)),如果大於這個直接返回錯誤,這個也是類似hugepage分配內存,也是一次性,獨佔(不能100%肯定),但是利用top命令查看,它顯示當前已佔用的內存大小不是我們爲他設定的那個值。那爲什麼我認爲它也是獨佔、且一次性分配呢?因爲啓動其他進程的時候,直接報錯:
Error occurred during initialization of VM
Could not reserve enough space for object heap
4. 使用mysql自帶的參數--memlock 它將內存鎖定,原理同hugepage一樣,不過缺陷是必須由root運行mysqld

二、怎麼避免進程因爲OOM機制被kill掉?
1.  與OOM相關的幾個文件是 /proc/<pid>/oom_adj 、 /proc/<pid>/oom_score。前者是一個權值-16至15,默認是0,設置爲-17表示永遠不被kill,其餘情況值越大越容易被kill。後者就是它計算出來的一個值,就是根據這個值來選擇哪些進程被kill掉的。
2.  上面放置使用swap中的第三個方法 overcommit參數,因爲它分配不出內存就會返回錯誤,所以永遠也不能達到內存被耗盡。OOM也就不會有影響了。

如果有興趣你也可以自己測試一下,或許還能發現新問題~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章