เหตุใด OOM-Killer จึงไม่สามารถฆ่ากระบวนการที่ขอมากเกินไปได้


12

มีการอธิบายที่นี่ว่า OOM-Killer สามารถกำหนดค่าผ่านทางovercommit_memoryและ:

  • 2 = ไม่มี overcommit การจัดสรรล้มเหลวหากถามมากเกินไป
  • 0, 1 = overcommit (heuristically หรือเสมอ) ฆ่ากระบวนการบางอย่างโดยยึดตามฮิวริสติกเมื่อเข้าถึงหน่วยความจำมากเกินไป

ตอนนี้ฉันอาจเข้าใจผิดทั้งหมด แต่ทำไมไม่มีตัวเลือก (หรือทำไมจึงไม่เป็นค่าเริ่มต้น) เพื่อฆ่ากระบวนการที่พยายามเข้าถึงหน่วยความจำที่จัดสรรมากเกินไป


เกิดอะไรขึ้นถ้ากระบวนการระบบที่สำคัญถามหน่วยความจำมากเกินไป
Lawrence

ในสถานที่แรก - มันสามารถทำสิ่งนี้ แต่ปัญหาที่ใหญ่ที่สุดของคำถามนั้นก็คือในทุกกรณีหากกระบวนการขอหน่วยความจำก็จะถูกดำเนินการใหม่หรือในคำอื่น ๆ นี่เป็นกระบวนการใหม่ที่เกี่ยวข้องกับการประมวลผลในปัจจุบัน คุณต้องการที่จะให้ OOM อนุญาตให้ลูกค้า im ที่ไม่เปิดใช้งานนาน 3 วันทำการเก็บความทรงจำของระบบหรือไม่หรือคุณอยากให้ YouTube โหลดจริง ๆ ในปีนี้บ้างไหม linuxatemyram.com
mikeserv

3
นี่คือสิ่งที่เป็นno overcommitตัวเลือก หากกระบวนการขอหน่วยความจำมากเกินไปก็จะล้มเหลว หากตรวจสอบข้อผิดพลาดมันมักจะฆ่าตัวเอง; หากไม่เป็นเช่นนั้นก็อาจได้รับข้อผิดพลาดการแบ่งกลุ่มเมื่อพยายามตรวจสอบตัวชี้โมฆะที่malloc()ส่งคืนและพยายามล้มเหลว
Barmar

โปรดทราบว่า 2 เป็นno overcommitโหมดตามแหล่งอ้างอิงที่อ้างถึง (เช่นkernel.org/doc/Documentation/vm/overcommit-accounting ) ฉันคิดว่าฉันจะแก้ไขคำถามของคุณตาม
hans_meine

คำตอบ:


23

พิจารณาสถานการณ์นี้:

  • คุณมีหน่วยความจำ 4GB ฟรี
  • กระบวนการที่ผิดพลาดจัดสรร 3.999GB
  • คุณเปิดตัวจัดการงานเพื่อฆ่ากระบวนการที่ควบคุมไม่ได้ ตัวจัดการงานจัดสรร 0.002GB

หากกระบวนการที่ถูกฆ่าเป็นกระบวนการสุดท้ายในการขอหน่วยความจำตัวจัดการงานของคุณจะถูกฆ่า

หรือ:

  • คุณมีหน่วยความจำ 4GB ฟรี
  • กระบวนการที่ผิดพลาดจัดสรร 3.999GB
  • คุณเปิดตัวจัดการงานเพื่อฆ่ากระบวนการที่ควบคุมไม่ได้ เซิร์ฟเวอร์ X จัดสรร 0.002GB เพื่อจัดการหน้าต่างของตัวจัดการงาน

ตอนนี้เซิร์ฟเวอร์ X ของคุณถูกฆ่า มันไม่ได้ทำให้เกิดปัญหา มันเป็นเพียง "ในสถานที่ที่ผิดเวลาผิด" มันเป็นกระบวนการแรกในการจัดสรรหน่วยความจำเพิ่มเติมเมื่อไม่มีใครเหลืออยู่ แต่มันไม่ใช่กระบวนการที่ใช้หน่วยความจำทั้งหมดเริ่มต้นด้วย


ในการขยายตัวอย่างของคุณหมายความว่าหากกระบวนการใช้หน่วยความจำ 99.999% คุณจะไม่สามารถฆ่ามันได้เพราะสิ่งใดก็ตามที่สามารถฆ่าได้จะต้องใช้หน่วยความจำและทำให้ตัวเองถูกฆ่าก่อนที่กระบวนการที่ผิดพลาดจะถูกฆ่า!
เลื่อน

13
ใจคุณนี่คือปรัชญา Linux ไม่ใช่ความจริงที่จำเป็น Windows 3.0 แก้ไขได้โดยมีหน่วยความจำเพียงพอที่สำรองไว้สำหรับการจัดการ OOM รวมถึงกล่องโต้ตอบที่จำเป็น
MSalters

@MSalters: นั่นไม่ได้ใช้กับตัวอย่างจริง ๆ ; ตัวอย่างนี้เกี่ยวกับกระบวนการที่สงวนหน่วยความจำเกือบทั้งหมดไว้ ไม่เพียงพอที่จะฆ่า OOM เห็นได้ชัดว่าจะต้องมีหน่วยความจำเพียงพอสำหรับการจัดการ OOM ในระบบปฏิบัติการใด ๆ แต่กระบวนการที่เรียกใช้การจัดการ OOM จะเป็นกระบวนการถัดไปที่เกิดขึ้นกับการสำรองหน่วยความจำไม่ใช่กระบวนการที่ทำงานผิดปกติ ยกเว้นว่าคุณหมายถึงว่า Windows 3.0 มีหน่วยความจำเพียงพอที่สงวนไว้สำหรับการเรียกใช้ตัวจัดการงานเสมอหรือตัวจัดการ OOM จะแจ้งให้ผู้ใช้ทราบถึงกระบวนการที่จะฆ่า (ซึ่ง! = ฆ่ากระบวนการที่กระทำผิด)
Aleksi Torhamo

3
@AleksiTorhamo: แน่นอนฉันหมายถึงหลัง Windows 3.0 ไม่มีตัวจัดการงานเต็มรูปแบบ แต่ก็มีหน้าจอสีน้ำเงินที่มีชื่อเสียงซึ่งมีการจัดสรรหน่วยความจำล่วงหน้า
MSalters
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.