มีวิธีใดที่จะได้รับดัมพ์หลักหรือสามารถดีบักกระบวนการที่ถูกฆ่าโดย oom-killer ได้หรือไม่?
หรือแม้แต่ตั้งค่า oom-killer ให้พยายามฆ่ากระบวนการโดยใช้ ABRT แทน?
มีวิธีใดที่จะได้รับดัมพ์หลักหรือสามารถดีบักกระบวนการที่ถูกฆ่าโดย oom-killer ได้หรือไม่?
หรือแม้แต่ตั้งค่า oom-killer ให้พยายามฆ่ากระบวนการโดยใช้ ABRT แทน?
คำตอบ:
อีกวิธีหนึ่งคือการปิดใช้งานการทับหน่วยความจำมากเกินไป
ในการกู้คืนสติปัญญาบางส่วนให้กลับสู่การจัดการหน่วยความจำของคุณ:
- ปิดการใช้งาน OOM Killer (ใส่
vm.oom-kill = 0
/etc/sysctl.conf)- ปิดการใช้งานหน่วยความจำ overcommit (ใส่
vm.overcommit_memory = 2
ใน/etc/sysctl.conf
)การตั้งค่าเหล่านี้จะทำให้ Linux ทำงานในลักษณะดั้งเดิม (หากกระบวนการร้องขอหน่วยความจำมากกว่าที่มีอยู่
โปรดทราบว่านี่เป็นค่าที่ประกอบไปด้วย:malloc()
จะล้มเหลวและกระบวนการที่ขอหน่วยความจำคาดว่าจะรับมือกับความล้มเหลวนั้น)
- 0 = "ประเมินถ้าเรามีแรมเพียงพอ"
- 1 = "พูดว่าใช่เสมอ"
- 2 = "ปฏิเสธเมื่อไม่มีหน่วยความจำ"
สิ่งนี้จะบังคับให้แอปพลิเคชันจัดการกับหน่วยความจำไม่เพียงพอและอาจเป็นไปได้ว่าล็อก / coredump / ฯลฯ อาจให้สิ่งที่มีประโยชน์แก่คุณ
หมายเหตุ:เมื่อระบบของคุณไม่มีหน่วยความจำคุณจะไม่สามารถวางกระบวนการใหม่ได้! คุณอาจถูกล็อคออกจากระบบ
echo 1 > /proc/sys/vm/oom_dump_tasks
ซึ่งดูเหมือนเกี่ยวกับจำนวนสูงสุดที่คุณสามารถรับเคอร์เนลเพื่อแสดงข้อผิดพลาดออกจากหน่วยความจำ
https://www.kernel.org/doc/Documentation/sysctl/vm.txt
เปิดใช้งานดัมพ์ภารกิจทั่วทั้งระบบ (ไม่รวมเธรดเคอร์เนล) ที่จะสร้างขึ้นเมื่อเคอร์เนลทำการฆ่า OOM และรวมข้อมูลเช่น pid, uid, tgid, ขนาด vm, rss, nr_ptes, swapents, คะแนน oom_score_adj และชื่อ สิ่งนี้มีประโยชน์ในการพิจารณาว่าเหตุใดนักฆ่า OOM จึงถูกเรียกใช้เพื่อระบุภารกิจการหลอกลวงที่ทำให้เกิดและเพื่อพิจารณาว่าเหตุใดนักฆ่า OOM จึงเลือกงานที่ทำเพื่อฆ่า
หากตั้งค่าเป็นศูนย์ข้อมูลนี้จะถูกระงับ ในระบบที่มีขนาดใหญ่มากซึ่งมีงานหลายพันงานอาจไม่สามารถถ่ายโอนข้อมูลสถานะหน่วยความจำสำหรับแต่ละระบบได้ ระบบดังกล่าวไม่ควรถูกบังคับให้รับบทลงโทษด้านประสิทธิภาพในเงื่อนไขของ OOM เมื่อไม่ต้องการข้อมูล
หากตั้งค่าเป็นไม่เป็นศูนย์ข้อมูลนี้จะปรากฏขึ้นทุกครั้งที่นักฆ่า OOM ฆ่างานหน่วยความจำ