สำหรับสิ่งที่ฉันเข้าใจเมื่อระบบใกล้จะไม่มีหน่วยความจำว่างเคอร์เนลควรเริ่มฆ่ากระบวนการเพื่อฟื้นหน่วยความจำบางส่วน แต่ในระบบของฉันสิ่งนี้ไม่ได้เกิดขึ้นเลย
สมมติว่าสคริปต์ง่าย ๆ ที่เพิ่งจัดสรรหน่วยความจำมากกว่าที่มีอยู่ในระบบ (ตัวอย่างเช่นอาร์เรย์ที่มีสตริงนับล้านตัวอย่าง) ถ้าฉันเรียกใช้สคริปต์เช่นนี้ (ในฐานะผู้ใช้ปกติ) เพียงแค่ได้รับหน่วยความจำทั้งหมดจนกว่าระบบจะหยุดทำงานอย่างสมบูรณ์ (เฉพาะ SysRQ REISUB เท่านั้น)
ส่วนที่แปลกที่นี่คือเมื่อคอมพิวเตอร์หยุดทำงานฮาร์ดไดรฟ์จะเปิดขึ้นและยังคงอยู่จนกว่าคอมพิวเตอร์จะรีบูตถ้าฉันมีพาร์ทิชัน swap ติดตั้งอยู่หรือไม่!
ดังนั้นคำถามของฉันคือ:
- พฤติกรรมนี้เป็นปกติหรือไม่ เป็นเรื่องแปลกที่แอปพลิเคชันที่ดำเนินการในฐานะผู้ใช้ทั่วไปสามารถทำให้ระบบล่มได้ด้วยวิธีนี้ ...
- มีวิธีใดบ้างที่ฉันสามารถทำให้ Ubuntu ฆ่าแอปพลิเคชั่นเหล่านั้นโดยอัตโนมัติเมื่อพวกเขาได้รับหน่วยความจำมากเกินไป
ข้อมูลเพิ่มเติม
- Ubuntu 12.04.3
- เคอร์เนล 3.5.0-44
RAM: ~ 3.7GB จาก 4GB (ใช้ร่วมกับการ์ดกราฟิก) * * * *
$ tail -n+1 /proc/sys/vm/overcommit_* ==> /proc/sys/vm/overcommit_memory <== 0 ==> /proc/sys/vm/overcommit_ratio <== 50 $ cat /proc/swaps Filename Type Size Used Priority /dev/dm-1 partition 4194300 344696 -1
Allocation failed
) แต่หากไม่มีการสลับจะทำให้คอมพิวเตอร์หยุดทำงาน มันควรจะทำงานด้วยวิธีนี้ (ฆ่าเมื่อใช้ swap) เท่านั้น?
tail -n+1 /proc/sys/vm/overcommit_*
และเพิ่มผลลัพธ์ ดูที่นี่: ฉันจะกำหนดค่า oom-killer ได้อย่างไร