วันนี้ฉัน (บังเอิญ) รันโปรแกรมบางอย่างบนกล่อง Linux ที่ใช้หน่วยความจำจำนวนมาก ระบบของฉันแข็งเป็นไม่ตอบสนองและทำให้ฉันไม่สามารถฆ่าผู้กระทำความผิดได้
ฉันจะป้องกันสิ่งนี้ในอนาคตได้อย่างไร อย่างน้อยก็ไม่สามารถทำให้แกนตอบสนองหรือสิ่งที่กำลังทำงานอยู่ได้
วันนี้ฉัน (บังเอิญ) รันโปรแกรมบางอย่างบนกล่อง Linux ที่ใช้หน่วยความจำจำนวนมาก ระบบของฉันแข็งเป็นไม่ตอบสนองและทำให้ฉันไม่สามารถฆ่าผู้กระทำความผิดได้
ฉันจะป้องกันสิ่งนี้ในอนาคตได้อย่างไร อย่างน้อยก็ไม่สามารถทำให้แกนตอบสนองหรือสิ่งที่กำลังทำงานอยู่ได้
คำตอบ:
ฉันจะพนันได้เลยว่าระบบไม่ได้ "หยุด" จริง ๆ (ในแง่ที่เคอร์เนลแขวนอยู่) แต่ก็ไม่ตอบสนองมากนัก โอกาสที่จะเป็นเพียงการแลกเปลี่ยนอย่างหนักทำให้เกิดการโต้ตอบและประสิทธิภาพของระบบที่จะลดลงเหมือนหิน
คุณสามารถปิดการสลับได้ แต่เพียงเปลี่ยนปัญหาจากประสิทธิภาพที่ไม่ดีไปเป็นกระบวนการที่ถูกฆ่าโดย OOM (และความสนุกทั้งหมดที่เป็นสาเหตุ) พร้อมด้วยประสิทธิภาพที่ลดลงเนื่องจากดิสก์แคชที่มีอยู่น้อยลง
อีกวิธีหนึ่งคุณสามารถใช้ข้อ จำกัด ทรัพยากรต่อกระบวนการ (โดยทั่วไปเรียกว่าrlimit
และ / หรือulimit
) เพื่อลบความเป็นไปได้ของกระบวนการเดียวที่ใช้หน่วยความจำที่ไร้สาระและก่อให้เกิดการสลับสับเปลี่ยน แต่นั่นทำให้คุณเข้าสู่ดินแดนบันเทิง ช่วงเวลาที่ไม่สะดวกเพราะพวกเขาต้องการหน่วยความจำมากกว่าระบบก็เต็มใจให้พวกเขา
หากคุณรู้ว่าคุณกำลังจะทำอะไรบางอย่างที่อาจทำให้เกิดการใช้งานหน่วยความจำขนาดใหญ่คุณอาจจะเขียนโปรแกรม wrapper ที่ทำmlockall()
แล้วทำเชลล์ของคุณ ที่จะเก็บไว้ในหน่วยความจำและจะเป็นสิ่งที่ใกล้เคียงที่สุดที่จะ "รักษาแกนตอบสนอง" ที่คุณน่าจะได้รับ (เพราะไม่ใช่ว่า CPU กำลังใช้งานเกินพิกัดซึ่งเป็นปัญหา)
โดยส่วนตัวฉันสมัครสมาชิกกับวิธีการ "ไม่ทำสิ่งที่โง่" ของการควบคุมทรัพยากร หากคุณมีรากฐานคุณสามารถทำความเสียหายได้ทุกประเภทต่อระบบและทำสิ่งใดก็ตามที่คุณไม่ทราบว่าผลลัพธ์ที่เป็นไปได้นั้นเป็นธุรกิจที่มีความเสี่ยง
ulimit
หรือแม้กระทั่งกลุ่ม cg ในทุกวันนี้ถ้าคุณเป็นเจ้าหนูน้อย หากคุณทำการเปลี่ยนแปลงคิวรีในการผลิตโดยไม่ตรวจสอบผลกระทบของมันในสภาพแวดล้อมที่ไม่สำคัญนั่นคือสาเหตุของปัญหา
ดังกล่าวข้างต้นในความคิดเห็นโดย Tronic มันเป็นไปได้ที่จะโทร OOM ฆ่า (จากฆาตกรหน่วยความจำ) โดยตรงโดยการรวมกันแป้นพิมพ์-SysRqF
SysRqมักจะรวมPrtScคีย์ภายในคีย์บนแป้นพิมพ์
OOM-killer ฆ่ากระบวนการบางอย่าง (-es) และระบบจะตอบสนองอีกครั้ง การเข้าถึงโดยตรงไปยัง OOM-killer อาจไม่ได้เปิดใช้งานโดยค่าเริ่มต้นโปรดชำระเงินคำถามนี้เพื่อค้นหาวิธีตรวจสอบสถานะและ / หรือเปิดใช้งาน
PS: สิ่งนี้ช่วยฉันได้มาก ฉันเห็นด้วยกับความเห็นว่านี่เป็นคำแนะนำที่มีประโยชน์ที่สุดเกี่ยวกับปัญหานั้นถ้ามันเกิดจาก Chrome หรือซอฟต์แวร์โลภหน่วยความจำใด ๆ แต่คุณต้องจำไว้ว่า OOM-killer สามารถฆ่ากระบวนการที่สำคัญบางอย่างใช้อย่างระมัดระวัง
หากคุณรู้สึกว่าต้องการคอมไพล์เคอร์เนลใหม่คุณสามารถลองแก้ไขจากEDIT
ส่วนของคำถามนี้ได้ที่: /programming//q/52067753/10239615
มันไม่ได้ขับไล่Active(file)
หน้าระหว่างความดันหน่วยความจำสูงและทำให้ OOM-killer เพื่อเรียกใช้งานเกือบจะในทันทีเนื่องจากเคอร์เนลไม่จำเป็นต้องใช้เวลานานอีกต่อไปในการอ่านดิสก์จากโค้ดเพจของโพรเซสที่เรียกใช้ทุกกระบวนการที่ก่อให้เกิดระบบแช่แข็ง
นี่เป็นสิ่งที่ป้องกันได้ยากเป็นพิเศษ เป็นเพราะเคอร์เนลเริ่มต้นการแลกเปลี่ยน ทางออกหนึ่งคือการปิดการแลกเปลี่ยน เมื่อระบบไม่มีหน่วยความจำแทนที่จะเริ่มต้นการแลกเปลี่ยนเคอร์เนลจะฆ่ากระบวนการบางอย่าง โดยปกติแล้วมันจะเลือกกระบวนการที่ถูกต้องในการฆ่า แต่จะเป็นการดีกว่าถ้าจะฆ่ากระบวนการแบบสุ่มมากกว่าที่จะมีระบบที่ไม่ตอบสนอง
นี่อาจเป็นทางออกที่ดีโดยเฉพาะสำหรับเซิร์ฟเวอร์เพราะเซิร์ฟเวอร์มักมี RAM เพียงพอและเมื่อพวกเขาเริ่มใช้พื้นที่สว็อปก็หมายความว่ามีบางอย่างผิดปกติอยู่ดี อย่างไรก็ตามเดสก์ท็อปมักจะต้องการพื้นที่สว็อปดังนั้นฉันคิดว่ามันไม่มีทางออกที่ดีสำหรับเดสก์ท็อป ฉันมักจะปิดการแลกเปลี่ยนพื้นที่ในเซิร์ฟเวอร์โดยเฉพาะอย่างยิ่งเมื่อมีข้อสงสัยว่าหน่วยความจำรั่ว