Linux怎么使用OOM killer 機(jī)制?
發(fā)表時(shí)間:2023-08-09 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]OOM killer 機(jī)制就是Linux殺死進(jìn)程的以個(gè)機(jī)制,如果進(jìn)程損壞系統(tǒng)資源到底某種程度,OOM killer 機(jī)制就會(huì)強(qiáng)制殺死進(jìn)程。本文就來介紹一下Linux如何使用OOM killer 機(jī)制...
OOM killer 機(jī)制就是Linux殺死進(jìn)程的以個(gè)機(jī)制,如果進(jìn)程損壞系統(tǒng)資源到底某種程度,OOM killer 機(jī)制就會(huì)強(qiáng)制殺死進(jìn)程。本文就來介紹一下Linux如何使用OOM killer 機(jī)制。
簡(jiǎn)單來說該機(jī)制會(huì)監(jiān)控那些占用內(nèi)存過大,尤其是瞬間很快消耗大量內(nèi)存的進(jìn)程,為了防止內(nèi)存耗盡而內(nèi)核會(huì)把該進(jìn)程殺掉。
這個(gè)功能即使在無法釋放內(nèi)存的情況下,也能夠重復(fù)進(jìn)行確保內(nèi)存的處理過程,防止系統(tǒng)停滯,還可以找出過度消耗內(nèi)存的進(jìn)程。
典型的情況是:某天一臺(tái)機(jī)器突然ssh遠(yuǎn)程登錄不了,但能ping通,說明不是網(wǎng)絡(luò)的故障或者機(jī)器down掉,很大可能是sshd進(jìn)程被 OOM killer殺掉了。
重啟機(jī)器后查看系統(tǒng)日志/var/log/messages會(huì)發(fā)現(xiàn) Out of Memory: Kill process 247(sshd)類似的錯(cuò)誤信息。
還有另外一種情況也會(huì)導(dǎo)致能ping不能ssh,就是網(wǎng)絡(luò)連接過多把系統(tǒng)文件描述符資源耗盡,這里暫時(shí)不考慮這種情況。
而在使用vip的高可用方案中,這種情況也很容易出現(xiàn)腦裂的現(xiàn)象。
防止重要的系統(tǒng)進(jìn)程觸發(fā)(OOM)機(jī)制而被殺死:可以設(shè)置參數(shù)/proc/PID/oom_adj為-17,可臨時(shí)關(guān)閉linux內(nèi)核的OOM機(jī)制。內(nèi)核會(huì)通過特定的算法給每個(gè)進(jìn)程計(jì)算一個(gè)分?jǐn)?shù)來決定殺哪個(gè)進(jìn)程,每個(gè)進(jìn)程的oom分?jǐn)?shù)可以/proc/PID/oom_score中找到。
我們認(rèn)為重要的進(jìn)程有sshd,或者一些監(jiān)控守護(hù)進(jìn)程,大家可以根據(jù)自己實(shí)際情況選擇需要保護(hù)的進(jìn)程。
保護(hù)某個(gè)進(jìn)程不被內(nèi)核殺掉可以這樣操作:
echo -17 》 /proc/$PID/oom_adj
可以寫一個(gè)簡(jiǎn)單的腳本,部署在crontab上防止重要進(jìn)程被oom
pgrep -f “/usr/sbin/sshd” while read PID;do echo -17 》 /proc/$PID/oom_adj;done
其中的“/usr/sbin/sshd”可以替換為你認(rèn)為重要的進(jìn)程,不過在匹配時(shí)候注意不要匹配錯(cuò)了
1.進(jìn)程的選定方法
OOM Killer在內(nèi)存耗盡時(shí),會(huì)查看所有進(jìn)程,并分別為每個(gè)進(jìn)程計(jì)算分?jǐn)?shù)。將信號(hào)發(fā)送給分?jǐn)?shù)最高的進(jìn)程。
2.計(jì)算分?jǐn)?shù)的方法
Linux是一套免費(fèi)使用和自由傳播的類Unix操作系統(tǒng)