ฉันมีแล็ปท็อปมาตรฐาน Linux (ทดสอบเดเบียน) ที่มีพาร์ทิชันสลับ
ฉันทำการทดลองกับมันมากมาย บางส่วนของพวกเขากำลังหิวมากหน่วยความจำและวิธีการทำงานของ Linux โดยค่าเริ่มต้นเป็นปัญหาสำหรับฉัน ... ขอยกตัวอย่างโง่ ๆ :
- นั่งหน้าแล็ปท็อป
- เปิดเทอร์มินัล
- พิมพ์
python
จากนั้นa = [0]*100000000
ตอนนี้มีโอกาสสูงที่คุณจะมี RAM ไม่เพียงพอที่จะจัดการกับรายการใหญ่ Linux จะเติม RAM แล้วสลับและอีกสองสามนาทีต่อมา OOM killer จะถูกทริกเกอร์และฆ่าบริการแบบสุ่ม (เกือบ) และหวังว่าถ้าคุณกด Ctrl + C ในเวลาที่เหมาะสมpython
และถ้าเทอร์มินัล ยังคงมีสมาธิคอมพิวเตอร์จะตอบสนองอีกครั้ง
ฉันต้องการบังคับใช้ขีด จำกัด หน่วยความจำบางส่วนเพื่อหลีกเลี่ยงการสลับที่ไม่พึงประสงค์และปฏิเสธสิทธิ์ในการจัดสรรหน่วยความจำมากกว่าที่ฉันมี (ใน RAM) หากความต้องการหน่วยความจำต่ำกว่าขีด จำกัด หรือรูตที่ถามแล้วให้ฆ่ากระบวนการหิวหน่วยความจำส่วนใหญ่ของผู้ใช้ใด ๆ ยกเว้นรูท
ulimit -Sv [mem]
ฉันได้ยินที่ด้านหลัง!
โฮ้โฮ! "ใช้งานcgroups
ผ่านcgexec
!" บางคนบอกว่าแถวแรก!
ใช่คุณพูดถูก: นี่เป็นคำตอบที่ดีมาก แต่:
- ไม่ใช้ทั้งระบบ
- มีการกำหนดขีด จำกัด ต่อกระบวนการ
- ข้อ จำกัด คงที่โดยไม่คำนึงถึงจำนวนจริงของ RAM ว่าง (AFAIK)
- ที่นี่และมีพวกเขากล่าวว่าเหล่านี้ไม่ได้จริงๆเป็นทางออกที่ดีในการบังคับใช้ข้อ จำกัด อย่างหนัก
สิ่งที่ฉันต้องการก็คือเคอร์เนลพูดว่า: "คุณเป็นของผู้ใช้foo (ไม่ใช่รูท) คุณใช้หน่วยความจำจำนวนมากและเราจะใช้หน่วยความจำไม่พอขออภัยเพื่อน ... ตายแล้ว!"
หรือ: "คุณกำลังทำอะไรอยู่คุณต้องการx MB และมีเฉพาะy MB เท่านั้นใช่ SWAP ว่างเปล่า แต่คุณไม่ต้องการใช้ SWAP เพื่อทำงานสกปรกคุณใช่ไหมฉันไม่ ไม่ว่าไม่มีความทรงจำสำหรับคุณ! ถ้าคุณยืนยันคุณจะต้องตาย! "
ulimits
เป็นความคิดที่ไม่ดีตามที่แสดงเกือบทุกที่เนื่องจากเป็นข้อ จำกัด ของกระบวนการ ... ฉันแยกคุณรู้ :) เกี่ยวกับcgroups
เรื่องนี้ดีกว่าแน่นอน แต่ไม่มีอะไรทั่วไปมากกว่า: ฉันกำลังพูดถึงแล็ปท็อปของฉัน แต่ฉันยัง เป็นเจ้าของเซิร์ฟเวอร์ "การคำนวณ" ที่เราสามคนแบ่งปัน หากฉันบังคับใช้ตามข้อ จำกัด ของผู้ใช้ฉันจะถูก จำกัด โดยสถานการณ์กรณีที่เลวร้ายที่สุดใช่ไหม
/proc/sys/vm/overcommit_memory
ส่งผลกระทบต่อพฤติกรรมของเคอร์เนลในหน่วยความจำเหลือน้อย