เป็นไปได้ไหมที่จะเรียกใช้ OOM-killer ในการบังคับให้เปลี่ยน


26

เป็นไปได้หรือไม่ที่ระบบจะทำการสลับเพจที่ไม่ใช้งาน ( vm.swappiness) ล่วงหน้าแต่เรียกใช้ oom-killer เมื่อระบบไม่มี RAM (เมื่อเทียบกับหน่วยความจำหมด) และถูกบังคับให้สลับ

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

ความปรารถนาอีกประการหนึ่งคือการกำหนดค่าจำนวนหน่วยความจำสลับที่ระบบถูกบังคับให้ใช้ก่อนทริกเกอร์ oom-killer วิธีนี้ระบบสามารถจุ่มลงในการแลกเปลี่ยนเพียงเล็กน้อยตราบใดที่มันไม่ได้ไปไกลเกินไป หรือฉันอาจตั้งค่าขีด จำกัด ดังกล่าวเพื่อเรียกใช้ oom-killer ก่อนที่จะใช้ RAM ทั้งหมดดังนั้นจะมีที่ว่างสำหรับแคชของระบบไฟล์เสมอ

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

เพื่อความกระจ่างแจ้งฉันไม่ต้องการปิดการสลับหรือปรับvm.swappinessพารามิเตอร์


3
น่าสนใจพอมันเกิดขึ้นแม้ว่าจะไม่มีไฟล์สลับ เห็นได้ชัดว่าไฟล์ที่แมปหน่วยความจำแบบอ่านอย่างเดียว (เช่นไฟล์ปฏิบัติการไลบรารีหรือทรัพยากรกราฟิก) จะถูกสับเปลี่ยนแทน
WGH

oomdของ Facebook เป็นภูตพื้นที่ผู้ใช้ที่ออกแบบมาเพื่อฆ่ากระบวนการตามปริมาณงานโดยรวมของระบบ (เช่นเฉพาะเมื่อ thrashing) แต่ดูเหมือนจะค่อนข้างซับซ้อนในการตั้งค่าสำหรับเดสก์ท็อป / เวิร์กสเตชัน
Jeffrey Bosboom

คำตอบ:


22

ฉันยังต่อสู้กับปัญหานั้น ฉันแค่ต้องการให้ระบบของฉันตอบสนองต่อไปไม่ว่าอะไรจะเกิดขึ้นและฉันชอบที่จะสูญเสียกระบวนการเพื่อรอสักครู่ ดูเหมือนว่าจะไม่มีวิธีที่จะบรรลุผลนี้โดยใช้เคอร์เนล oom killer

อย่างไรก็ตามในพื้นที่ผู้ใช้เราสามารถทำสิ่งที่เราต้องการ ดังนั้นฉันจึงเขียน Early OOM Daemon ( https://github.com/rfjakob/earlyoom ) ที่จะฆ่ากระบวนการที่ใหญ่ที่สุด (โดย RSS) เมื่อ RAM ที่มีให้ต่ำกว่า 10%

หากไม่มีการเริ่มต้นใช้งานมันเป็นการง่ายที่จะล็อคเครื่องของฉัน (RAM 8GB) โดยเริ่มต้นที่http://www.unrealengine.com/html5/สองสามครั้ง ตอนนี้แท็บเบราว์เซอร์ที่มีความผิดถูกฆ่าก่อนที่มือ


1
ขอบคุณนั่นคือสิ่งที่ฉันกำลังมองหา ตอนนี้ฉันสามารถทำงานcolumn -t -s,กับไฟล์ csv ขนาดใหญ่และปล่อยให้earlyoomฆ่าเมื่อมันเป็นไปไม่ได้ก่อนที่จะสังเกตเห็นการตอบสนองใด ๆ
henfiber

4

ฟังดูเหมือนโซลูชันที่ซับซ้อนเกินไป ฉันอยากจะแนะนำ (และฉันทำสิ่งนี้กับเครื่องที่ฉันตั้งค่าซึ่งไม่จำเป็นต้องจำศีล) เพียงแค่จัดสรรพื้นที่สว็อปเล็กน้อย (128-256MiB) วิธีนี้เคอร์เนลสามารถสลับบางหน้าออกได้ แต่ OOM-killer จะถูกเรียกใช้ก่อนที่สิ่งต่าง ๆ จะแย่

หากคุณต้องการทำสิ่งนี้ฉันคิดว่าคุณจะต้องเขียนสคริปต์ / โปรแกรมของคุณเองซึ่งตรวจสอบการใช้งาน swap และเรียกใช้ OOM-killer โดยใช้ปุ่มMagic SysReq (ซึ่งสามารถทำได้โดยการเขียนโปรแกรม/proc/sysrq-trigger)


1
ฉันจะยืนยันว่าการมี swap เล็กน้อยไม่ใช่ทางออกที่ดีมาก โดยทั่วไปคุณจะได้รับประโยชน์จากการแลกเปลี่ยนของคุณ ถ้าคุณมีเพจที่ไม่ได้ใช้งานจำนวนมากและจะได้รับประโยชน์จากการสลับ 10gb รอบ ๆ ฉันมีกล่องที่มี ram ประมาณ 100GB ที่การสลับ 10gb ไม่ใช่แนวคิดที่ไกล และการเขียนแอปพลิเคชันเพื่อทำสิ่งนี้ใน userspace เป็นเพียงการเปิดรับปัญหา (เมื่อเทียบกับในเคอร์เนล)
Patrick

เพราะโดยพื้นฐานแล้วคุณจำเป็นต้องมีกลไกในการแยกแยะ "การแลกเปลี่ยนที่ดี" จาก "การสลับที่ไม่ดี" และนั่นเป็นอัลกอริทึมที่ยากในการคิด จำนวนเงินของการแลกเปลี่ยนที่เหมาะสมอย่างเห็นได้ชัดขึ้นอยู่กับปริมาณของ RAM และภาระงานที่คุณกำลังใช้งานดังนั้นหาก 10GiB มีความเหมาะสมสำหรับเครื่องของคุณแล้วจัดสรรที่ :-)
mgorven

ทำไมจะยาก? การสลับมีเพียง 2 ประเภทเท่านั้นvm.swappinessเนื่องจากการสลับแบบบังคับและการสลับสับเปลี่ยนเนื่องจาก RAM หมด สิ่งที่ต้องเกิดขึ้นคือเมื่อเคอร์เนลถูกบังคับให้เปลี่ยนเพื่อทริกเกอร์ oom-killer และพื้นที่ 10 กิกะไบต์ยังมีพื้นที่เหลือเฟือสำหรับการบังคับให้สลับเพื่อฟาดดิสก์
Patrick
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.