回覆列表
  • 1 # 使用者1220686403821

    記憶體溢位是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out of memory;比如申請了一個integer,但給它存了long才能存下的數,那就是記憶體溢位。

    當記憶體嚴重不足時,核心有兩種選擇:

    1.直接panic

    2.殺掉部分程序,釋放一些核心。

    對於每個程序都有一個oom_score的屬性(/proc/PID/oom_score),oom killer會殺死oom_score較大的程序,當oom_score為0時禁止核心殺死該程序。

    對過設定/proc/PID/oom_adj可以改變oom_score,oom_adj的範圍為【-17,15】,當oom_adj=-17時,oom_score將變為0。

    oom_adj的可調值為15到-16,其中15最大-16最小,-17為禁止使用OOM。oom_score為2的n次方計算出來的,其中n就是程序的oom_adj值,所以oom_score的分數越高就越會被核心優先殺掉。

    綜上,可以透過命令 echo 0 > /proc/PID/oom_adj 來防止程序被oom_killer殺死。

    涉及到的引數如下:

    (1)、panic_on_oom 當OOM的時候,是否panic 當值為0的時候,在OOM的時候會呼叫OOM Killer,大部分情況下,會殺掉導致OOM的程序,然後系統恢復 當值為1的時候,發生了OOM以後,如果有mempolicy/cpusets的程序限制,而這些nodes導致了記憶體問題的時候,OOM Killer會幹掉這些中的一個,系統也會恢復 當值為2的時候,OOM後必然panic

    (2)、oom_kill_allocating_task 決定在oom的時候,oom killer殺哪些東西。 非0的時候,它會掃描程序佇列,然後將可能導致記憶體溢位的程序殺掉,也就是佔用記憶體最大的那個,但是設定為0的時候,它只殺掉導致oom的那個程序,避免了程序佇列的掃描,但是釋放的記憶體大小有限

    (3)、oom_dump_tasks 當oom killer被引發的時候,將程序的資訊輸出,包括pid、uid、tgid、vm、rss、cpu等 預設為0

  • 中秋節和大豐收的關聯?
  • EXCEL中如何實現根據不同條件運用不同公式?