Linux OOM機制詳解

2021-09-14 05:42:42 字數 1630 閱讀 1137

在工作過程中,你可能會遇到過這種情況,程式在執行一段時間之後突然掛掉,在你保證程式在正常情況下不會掛掉的情況下,程式掛掉的原因可能是在你的程式執行過程中,有一段時間你的程式執行記憶體過大,而此時系統物理記憶體不足,導致系統觸發oom killer機制,將該程序kill。

oom killer是out-of-memory killer的縮寫,它是機liux核心的一種記憶體管理機制。在linux系統記憶體將要用完的情況下,oom-killer程序會遍歷當前機器上的所有程序,按照**程序所佔記憶體的大小和使用者打分(oom_score_adj)**對程序進行打分(占用記憶體越大,分數越高),然後挑選出分數最高的程序將其kill掉。

乙個程序的oom-killer打分分別由系統得分和使用者打分綜合評判,它的具體策略是系統打分+使用者打分為當前程序的最後分數。對於linux中執行的每乙個程序,都會有兩個檔案分別為/proc//oom_score和/proc//oom_score_adj來儲存系統打分和使用者打分。

所以我們可以通過linux中程序執行過程中儲存的oom_score和oom_score_adj檔案,來找到最先被系統oom-kill的程序。可使用下面指令碼來搜尋優先被oom_kill的程序

dir=`ls

-l /proc |awk '/^d/ '`

result_process=0

result_score=0

for i in $dir

do oom_score=0

oom_score_adj=0

if[-f "/proc/$i/oom_score"

] then

oom_score=`cat

/proc/

$i/oom_score`

fi if

[-f "/proc/$i/oom_score_adj"

] then

oom_score_adj=`cat

/proc/

$i/oom_score_adj`

fi process_score=`expr $oom_score

+$oom_score_adj`

if[$i!= "1"

] && [

$process_score

-gt$result_score

] then

result_score=$process_score

result_process=$i

fidone

echo

$result_process

,$result_score

當我們機器上執行著重要的程式時,比如mysql或者redis等,這些程式都是比較吃記憶體的,所以我們不希望這些程序被系統kill掉,我們可以通過兩種方式來達到目的。

1、手從修改程序oom_score_adj的值為-1000避免該程序被kill。

2、禁止的oom kill機制,當系統發生 oom 的時候開啟 kernel panic,此時系統會發生重啟。

# 修改sysctl.conf檔案

echo "vm.panic_on_oom=1" >> /etc/sysctl.conf

# 使配置生效

systcl -p

參考:

sphinx rotate機制詳解

今日,發現sphinx出現 sphinx.new.sp 諸多檔案。出現這樣的情況是因為 searchd沒有載入新索引檔案。遂google之,到sphinx官網論壇後得知rotate的機制後方解決!sphinx的searchd在啟動時會建立乙個 spl 鎖檔案,並在關閉時會刪除它。在indexer建立...

Cookie Session機制詳解

cookie通過在客戶端記錄資訊確定使用者身份,session通過在伺服器端記錄資訊確定使用者身份。cookie機制 理論上,乙個使用者的所有請求操作都應該屬於同乙個會話,而另乙個使用者的請求操作則應該屬於另乙個會話。而web應用程式是使用http協議傳輸資料的。http協議是無狀態的協議,一旦資料...

android binder機制詳解

1.直觀來說,binder是android中的乙個類,它繼承了ibinder介面 2.從ipc角度來說,binder是android中的一種跨程序通訊方式,binder還可以理解為一種虛擬的物理裝置,它的裝置驅動是 dev binder,該通訊方式在linux中沒有 3.從android frame...