จากความคิดเห็นของคุณดูเหมือนว่าระบบจะทำการแลกเปลี่ยน
ลีนุกซ์มีนักฆ่า OOM ซึ่งถูกเรียกใช้เมื่อระบบได้ทำการ overcommit มันเป็นหน่วยความจำและตอนนี้ก็หมดลงแล้ว
Linux โดยค่าเริ่มต้นจะทำการ overcommit หน่วยความจำซึ่งโดยทั่วไปจะให้โปรแกรมหน่วยความจำมากกว่าระบบจริง มันทำเช่นนี้โดยมีข้อสันนิษฐานว่าโปรแกรมจะไม่ใช้หน่วยความจำทั้งหมดที่พวกเขาร้องขอ อย่างไรก็ตามเมื่อระบบมีหน่วยความจำไม่เพียงพอระบบจะบอกขั้นตอนการทำงานต่างๆว่ามีหน่วยความจำอยู่แล้วดังนั้นจึงไม่สามารถปฏิเสธได้อีกต่อไป สิ่งที่ควรทำคือการเรียกใช้ OOM killer OOM killer โดยทั่วไปจะพบกระบวนการที่เคอร์เนลคิดว่าจะบรรเทาเงื่อนไขหน่วยความจำไม่เพียงพอ โดยปกตินี่เป็นเพียงกระบวนการที่ใช้หน่วยความจำมากที่สุด แต่อัลกอริทึมนั้นซับซ้อนกว่านั้นมาก
เนื่องจากคุณได้overcommit_memory
ตั้งค่าเป็น0
(โหมดอัตโนมัติ) เคอร์เนลจึงทำการหน่วยความจำทับ ดังนั้นจากพฤติกรรมที่คุณอธิบายดูเหมือนว่าระบบจะทำการแลกเปลี่ยนอย่างหนัก
จากที่นี่มี 2 ตัวเลือก
ลดการสลับ
ระบบของคุณไม่มี RAM ดังนั้นเคอร์เนลจึงเริ่มเปลี่ยนสิ่งต่าง ๆ เป็น swap หากระบบของคุณไม่มีการแลกเปลี่ยนระบบจะเรียกใช้ OOM killer อย่างไรก็ตามเนื่องจากคุณมีพื้นที่สว็อปว่างเหลือจึงไม่เกิดขึ้น
ความคิดเดิมของคุณฆ่ากระบวนการด้วยตนเอง
คุณสามารถฆ่ากระบวนการด้วยตนเองเมื่อคุณคิดว่าระบบกำลังแลกเปลี่ยนมากเกินไปและบางสิ่งบางอย่างจำเป็นต้องตาย สิ่งนี้สามารถทำได้ผ่านเคอร์เนล SysRq
เคอร์เนลมีสิ่งที่เรียกว่า "magic SysRq" นี่เป็นฟังก์ชันการทำงานเล็กน้อยที่บอกให้เคอร์เนลทำการดำเนินการฉุกเฉินบางประเภท นี่อาจเป็นสิ่งที่ "remount วอลุ่มทั้งหมดเป็นแบบอ่านอย่างเดียว", "ซิงค์ระบบไฟล์ทั้งหมด" หรือ "รีบูตทันที" หนึ่งในตัวเลือกเหล่านี้คือการเรียกใช้ OOM killer
หากเคอร์เนลของคุณเปิดใช้งาน Magic SysRq (ตัวเลือกเคอร์เนลCONFIG_MAGIC_SYSRQ
) คุณสามารถทำได้สองวิธี
- Alt+ SysRq+ f
เพียงกด 3 ปุ่มบนแป้นพิมพ์
echo f > /proc/sysrq-trigger
สิ่งนี้จะทำงานเช่นเดียวกับวิธีการของคีย์บอร์ด แต่จะเป็นแบบโปรแกรม
คุณสามารถปิดการใช้งาน swap ได้ทั้งหมดและนี่คือสิ่งที่ฉันทำในระบบส่วนใหญ่ของฉันและด้วยเหตุผลนี้ การแลกเปลี่ยนมีประโยชน์ในการที่เคอร์เนลจะทำการสลับข้อมูลที่ไม่ได้ใช้งานไว้ล่วงหน้าเพื่อให้หน่วยความจำของคุณถูกใช้เพื่อแคชมากขึ้น แต่มันนำไปสู่ปัญหาการแลกเปลี่ยนที่ถูกบังคับที่คุณเห็น
โดยส่วนตัวฉันคิดว่าทางออกที่ดีที่สุดคือตัวเลือกเคอร์เนลบางประเภทที่จะเรียกใช้ OOM killer เพื่อบังคับการแลกเปลี่ยน โดยทั่วไปปล่อยให้ swap preemptive ทำงานได้ แต่ถ้าเคอร์เนลถูกบังคับให้ย้ายบางสิ่งไปที่ swap เนื่องจากคุณออกจาก RAM แล้วให้เรียก OOM killer
น่าเสียดายที่นี่เป็นเพียงความปรารถนาส่วนตัวของฉันเอง มันไม่ได้ทำเช่นนี้