Linux的OOM Killer機(jī)制

背景

最近發(fā)現(xiàn)在壓力測(cè)試MySQL時(shí)候有重啟情況,查看日志,也只是一大堆回滾日志啥的

InnoDB: Progress in percents: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 1002018-06-04 20:59:05 20990 [Note] InnoDB: Rollback of trx with id 19528681 completed

于是乎果斷查看/var/log/messages日志,從日志中找到了有用的信息

Jun  4 05:49:26 localhost kernel: Out of memory: Kill process 12600 (mysqld) score 458 or sacrif
ice child
Jun  4 05:49:26 localhost kernel: Killed process 12600 (mysqld) total-vm:59075508kB, anon-rss:54
677236kB, file-rss:0kB

內(nèi)存溢出Linux為了保護(hù)系統(tǒng)不崩潰,將按照它的機(jī)制將“內(nèi)存大戶”mysql給干掉了,嗚嗚嗚。。。

看來有必要仔細(xì)了解下Linux的OOM Killer機(jī)制了。

OOM

linux系統(tǒng)為了避免在內(nèi)存不足的時(shí)候出現(xiàn)嚴(yán)重問題,在出現(xiàn)內(nèi)存不足時(shí)候使用OOM killer機(jī)制將一些其他的進(jìn)程殺掉來釋放一些內(nèi)存。
以下是關(guān)于它的英文翻譯:
默認(rèn)情況下,Linux遵循樂觀的內(nèi)存分配策略。這意味著當(dāng) malloc()返回非空時(shí)不能保證內(nèi)存真的可用。這是一個(gè)非常糟糕的錯(cuò)誤。如果事實(shí)證明系統(tǒng)內(nèi)存不足,一個(gè)或多個(gè)進(jìn)程將被臭名昭著的OOM Killer殺死。如果使用Linux在不希望突然失去一些隨機(jī)挑選的過程的情況下,而且內(nèi)核版本是最新的,可以使用這樣的命令關(guān)閉這種過度提交行為:

echo 2 > /proc/sys/vm/overcommit_memory

overcommit_memory的值:
0:?jiǎn)l(fā)式策略,可以允許輕微的overcommit。
1:永遠(yuǎn)允許overcommit。
2:永遠(yuǎn)禁止overcommit,系統(tǒng)分配的內(nèi)存不會(huì)超過swap+ram*overcommit_ratio系數(shù)默認(rèn)50%

[root@localhost ~]# cat /proc/sys/vm/overcommit_ratio 
50

內(nèi)存使用完畢后,在此申請(qǐng)內(nèi)存會(huì)報(bào)錯(cuò),表示再也不可能運(yùn)行新程序。
挑選殺掉的進(jìn)程是按照:內(nèi)存消耗量、CPU時(shí)間(utime+stime)、存活時(shí)t間(utime-stat time)和oom_adj計(jì)算出來的。oom_adj是OOM權(quán)重,在/proc/<pid>/oom_adj里面,取值是-17到+15,取值越高,越容易被干掉。
若是想避免哪個(gè)程序被干掉,可以修改oom_adj為-17
總的來說就是那個(gè)程序運(yùn)行時(shí)間越長(zhǎng),占用內(nèi)存越大它的打分就會(huì)越高,就越容易被挑出來干掉。

知道了程序意外重啟的原因,下面就是他的解決辦法
1,檢查程序的配置是否合理,運(yùn)行時(shí)候是否負(fù)載過大,倘若程序確實(shí)需要消耗大量的內(nèi)存無法避免,那就提高硬件配置,或者考慮橫向擴(kuò)展等等。
2, 將/proc/sys/vm/overcommit_memory設(shè)置為2,但是在要是新的程序連接過來就會(huì)直接drop掉無法運(yùn)行,并不推薦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容