歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux下防止進程使用swap及防止OOM機制導致進程被kill掉

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

日期:2017/2/28 15:52:25   编辑:Linux教程
首先解釋兩個概念:
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
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(其他值代表什麼含義,可以自己www.linuxidc.com,另外自己測試中發現這個值如果大於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。前者是一個權值-17至15。設置為0表示永遠不被kill,其余情況值越大越容易被kill。後者就是它計算出來的一個值,就是根據這個值來選擇哪些進程被kill掉的。
2. 上面放置使用swap中的第三個方法 overcommit參數,因為它分配不出內存就會返回錯誤,所以永遠也不能達到內存被耗盡。OOM也就不會有影響了。

如果有興趣你也可以自己測試一下,或許還能發現新問題~
Copyright © Linux教程網 All Rights Reserved