OOM killer ตัดสินใจอย่างไรว่ากระบวนการใดจะต้องฆ่าก่อน


92

นี้คำตอบที่อธิบายการดำเนินการโดย kernel เมื่อสถานการณ์ OOM sysctl vm.overcommit_memoryจะพบขึ้นอยู่กับมูลค่าของ

เมื่อovercommit_memoryตั้งค่าเป็น 0 หรือ 1 overcommitจะเปิดใช้งานและโปรแกรมได้รับอนุญาตให้จัดสรรหน่วยความจำได้มากกว่าที่มีจริง ๆ

ตอนนี้เกิดอะไรขึ้นเมื่อเรามีหน่วยความจำไม่เพียงพอในสถานการณ์นี้ อย่างไรฆาตกร OOMตัดสินใจว่าขั้นตอนการฆ่าครั้งแรก?


1
ฉันเชื่อว่าค่าคือ 1 ต่อ 2 - ไม่ใช่ 0 และ 1
fpmurphy

จากที่นี่serverfault.com/questions/606185/… , 0 และ 1 เป็นค่าที่ถูกต้อง
Rui F Ribeiro

1
มีคำอธิบายที่ยอดเยี่ยมที่linux-mm.org/OOM_Killer
Jarek Przygódzki

ตามkernel.org/doc/Documentation/vm/overcommit-accounting 0, 1 และ 2 เป็นค่าที่ถูกต้องทั้งหมด
Derek Lewis

คำตอบ:


109

หากหน่วยความจำถูกใช้อย่างหมดจดโดยกระบวนการจนถึงระดับที่อาจเป็นภัยคุกคามต่อความเสถียรของระบบดังนั้นนักฆ่า 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


3
ความดีไม่ได้มีบทบาทด้วยหรือไม่
neverMind9
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.