มันสามารถ
มีเงื่อนไขหน่วยความจำที่แตกต่างกันสองแบบที่คุณสามารถพบได้ใน Linux ซึ่งคุณพบขึ้นอยู่กับมูลค่าของsysctl vm.overcommit_memory
( /proc/sys/vm/overcommit_memory
)
เกริ่นนำ:
เคอร์เนลสามารถดำเนินการในสิ่งที่เรียกว่า 'memory overcommit' นี่คือเมื่อเคอร์เนลจัดสรรโปรแกรมหน่วยความจำมากกว่าที่มีอยู่จริงในระบบ นี่คือความหวังที่ว่าโปรแกรมจะไม่ใช้หน่วยความจำทั้งหมดที่พวกเขาจัดสรรเพราะนี่เป็นเหตุการณ์ที่เกิดขึ้นบ่อยครั้ง
overcommit_memory = 2
เมื่อovercommit_memory
ตั้งค่า2
เป็นเคอร์เนลจะไม่ทำการ overcommit ใด ๆ เลย แต่เมื่อโปรแกรมได้รับการจัดสรรหน่วยความจำจะเป็นการรับประกันว่าการเข้าถึงจะมีหน่วยความจำนั้น หากระบบไม่มีหน่วยความจำว่างเพียงพอที่จะตอบสนองการร้องขอการจัดสรรเคอร์เนลจะส่งคืนความล้มเหลวสำหรับการร้องขอ มันขึ้นอยู่กับโปรแกรมที่จะจัดการกับสถานการณ์อย่างสง่างาม หากไม่ได้ตรวจสอบว่าการจัดสรรสำเร็จเมื่อล้มเหลวจริง ๆ แอปพลิเคชันมักจะพบกับ segfault
ในกรณีของ segfault คุณควรหาบรรทัดเช่นนี้ในผลลัพธ์ของdmesg
:
[1962.987529] myapp[3303]: segfault at 0 ip 00400559 sp 5bc7b1b0 error 6 in myapp[400000+1000]
at 0
หมายความว่าโปรแกรมพยายามที่จะเข้าถึงตัวชี้เตรียมซึ่งอาจจะเป็นผลมาจากการเรียกร้องการจัดสรรหน่วยความจำที่ล้มเหลว ( แต่มันไม่ได้เป็นวิธีเดียว)
overcommit_memory = 0 และ 1
เมื่อovercommit_memory
ตั้งค่าเป็น0
หรือ1
เปิดใช้งาน overcommit แล้วและโปรแกรมได้รับอนุญาตให้จัดสรรหน่วยความจำได้มากกว่าที่มีจริง ๆ
อย่างไรก็ตามเมื่อโปรแกรมต้องการใช้หน่วยความจำที่ได้รับการจัดสรร แต่เคอร์เนลพบว่าไม่มีหน่วยความจำเพียงพอที่จะทำให้เป็นจริงมันต้องได้หน่วยความจำกลับมา ก่อนอื่นจะพยายามดำเนินการงานล้างหน่วยความจำต่าง ๆ เช่นการล้างแคช แต่ถ้าไม่เพียงพอก็จะยุติกระบวนการ การยุตินี้ดำเนินการโดย OOM-Killer OOM-Killer ดูที่ระบบเพื่อดูว่าโปรแกรมใดบ้างที่ใช้หน่วยความจำระยะเวลาที่ใช้งานผู้ใช้งานและปัจจัยอื่น ๆ เพื่อพิจารณาว่าโปรแกรมใดถูกฆ่า
หลังจากกระบวนการถูกฆ่าหน่วยความจำที่ใช้อยู่นั้นถูกทำให้เป็นอิสระและโปรแกรมที่เพิ่งทำให้เกิดสภาวะหน่วยความจำไม่เพียงพอในตอนนี้มีหน่วยความจำที่ต้องการ
อย่างไรก็ตามแม้ในโหมดนี้โปรแกรมยังสามารถปฏิเสธคำขอการจัดสรรได้ เมื่อovercommit_memory
ใด0
เคอร์เนลจะพยายามคาดเดาได้ดีที่สุดว่าควรเริ่มปฏิเสธคำขอการจัดสรรเมื่อใด เมื่อตั้งค่าเป็น1
ฉันไม่แน่ใจว่าจะใช้การกำหนดว่าควรปฏิเสธคำขอเมื่อใด แต่สามารถปฏิเสธคำขอที่มีขนาดใหญ่มากได้
คุณสามารถดูว่า OOM-Killer เกี่ยวข้องหรือไม่โดยดูจากผลลัพธ์dmesg
และค้นหาข้อความเช่น:
[11686.043641] Out of memory: Kill process 2603 (flasherav) score 761 or sacrifice child
[11686.043647] Killed process 2603 (flasherav) total-vm:1498536kB, anon-rss:721784kB, file-rss:4228kB