หากหน่วยความจำถูกใช้อย่างหมดจดโดยกระบวนการจนถึงระดับที่อาจเป็นภัยคุกคามต่อความเสถียรของระบบดังนั้นนักฆ่า OOM จะเข้ามาในภาพ
หมายเหตุ:มันเป็นหน้าที่ของ OOM Killer ที่จะทำการฆ่ากระบวนการต่อไปจนกว่าจะมีหน่วยความจำเพียงพอสำหรับการทำงานที่ราบรื่นของกระบวนการที่เหลือซึ่งเคอร์เนลพยายามเรียกใช้
OOM Killer ต้องเลือกกระบวนการที่ดีที่สุดในการฆ่า ดีที่สุดที่นี่หมายถึงกระบวนการที่จะเพิ่มหน่วยความจำสูงสุดเมื่อฆ่าและยังมีความสำคัญน้อยที่สุดกับระบบ
เป้าหมายหลักคือการฆ่ากระบวนการน้อยที่สุดที่จะลดความเสียหายที่เกิดขึ้นและในเวลาเดียวกันก็เพิ่มจำนวนหน่วยความจำที่เพิ่มขึ้น
เพื่ออำนวยความสะดวกในการนี้เคอร์เนลรักษาoom_score
สำหรับแต่ละกระบวนการ คุณสามารถดูกระบวนการoom_score
แต่ละกระบวนการใน/proc
ระบบไฟล์ภายใต้pid
ไดเรกทอรี
$ cat /proc/10292/oom_score
ยิ่งมูลค่าของoom_score
กระบวนการใดสูงขึ้นเท่าใดโอกาสในการถูกสังหารโดยOOM Killerก็จะสูงขึ้นในสถานการณ์ที่หน่วยความจำไม่เพียงพอ
วิธีการคือOOM_Score
การคำนวณอย่างไร
ในชุดแก้ไขของเดวิดความชั่วร้ายเก่า ๆ () ฮิวริสติกเกือบหมดไปหมดแล้ว การคำนวณจะกลายเป็นคำถามง่าย ๆ ว่ากระบวนการใช้หน่วยความจำที่มีอยู่เปอร์เซ็นต์ใด หากระบบโดยรวมมีหน่วยความจำไม่เพียงพอ "หน่วยความจำที่มีอยู่" คือผลรวมของ RAM ทั้งหมดและพื้นที่สว็อปที่มีอยู่ในระบบ
หากสถานการณ์ OOM นั้นเกิดจากการปล่อยหน่วยความจำที่อนุญาตให้กับกลุ่ม cpuset / กลุ่มควบคุมที่กำหนดไว้ดังนั้น "หน่วยความจำที่มีอยู่" คือจำนวนเงินทั้งหมดที่จัดสรรให้กับกลุ่มควบคุมนั้น การคำนวณที่คล้ายกันจะเกิดขึ้นหากเกินขีด จำกัด ที่กำหนดโดยนโยบายหน่วยความจำ ในแต่ละกรณีการใช้หน่วยความจำของกระบวนการจะถือว่าเป็นผลรวมของชุดที่อยู่อาศัย (จำนวนหน้า RAM ที่ใช้) และการใช้งาน swap
การคำนวณนี้สร้างผลลัพธ์เป็นจำนวนเปอร์เซ็นต์คูณสิบ กระบวนการที่ใช้หน่วยความจำที่มีอยู่ทุกไบต์จะมีคะแนน 1,000 ในขณะที่กระบวนการที่ไม่มีหน่วยความจำจะได้คะแนนเท่ากับศูนย์ มีการแก้ไขปัญหาแบบฮิวริสติกน้อยมากสำหรับคะแนนนี้ แต่โค้ดยังลบจำนวนเล็กน้อย (30) จากคะแนนของกระบวนการที่เป็นเจ้าของรูทบนความคิดที่ว่าพวกเขามีค่ามากกว่ากระบวนการที่ผู้ใช้เป็นเจ้าของเล็กน้อย
การปรับแต่งอื่น ๆ ที่ใช้คือการเพิ่มค่าที่เก็บไว้ในตัวแปร oom_score_adj ของแต่ละกระบวนการซึ่งสามารถปรับได้ผ่าน / proc ปุ่มนี้ช่วยให้สามารถปรับความน่าดึงดูดใจของแต่ละโพรเซสต่อ OOM killer ในพื้นที่ผู้ใช้; การตั้งค่าเป็น -1000 จะเป็นการปิดการทำงานของ OOM โดยสิ้นเชิงในขณะที่การตั้งค่าเป็น +1000 จะเทียบเท่ากับการวาดเป้าหมายขนาดใหญ่ในกระบวนการที่เกี่ยวข้อง
อ้างอิง
http://www.queryhome.com/15491/whats-happening-kernel-starting-killer-choose-which-process
https://serverfault.com/a/571326