เป็นไปได้ไหมที่จะทำการแทรกแซง OOM killer ก่อนหน้านี้?


34

ฉันพยายามปรับแต่งระบบการพัฒนาของฉันเพื่อความน่าเชื่อถือสูงสุด ฉันปิดการแลกเปลี่ยนเพราะสำหรับการใช้งาน GUI ส่วนใหญ่จะทำให้เครื่องไม่ตอบสนองในลักษณะที่ไม่สามารถใช้งานได้อีกต่อไป อย่างไรก็ตามหากแอ็พพลิเคชันแบบก้าวร้าวกลืนกินความทรงจำกลไกบางอย่างก็ดูเหมือนจะทำให้มันเกิดประโยชน์สูงสุดจากต้นทุนความเร็ว ไม่มีการดำเนินการสลับฮาร์ดไดรฟ์ แต่ระบบก็ไม่ตอบสนองเช่นเดียวกัน ดังนั้นฉันต้องการปล่อยให้นักฆ่า OOM เตะก่อนที่ระบบจะใช้ความพยายามพิเศษเพื่อเพิ่มความจำ เป็นไปได้หรือไม่ที่จะกำหนดค่า OOM killer ให้ทำงานหากมีหน่วยความจำกายภาพว่างน้อยกว่า 100 MB?


2
ฉันคิดว่าปัญหาที่แท้จริงที่นี่คือมี ram ไม่เพียงพอที่จะเริ่มต้นด้วย คุณจะไม่ใช้ swap ยกเว้นว่าไม่มี ram ด้วยการปิดการสลับ ... คุณหมด RAM และไม่มีที่ให้ไปหน้า ซึ่งทำให้สิ่งที่น่าเกลียดเกิดขึ้น ดูเหมือนว่าระบบของคุณจะถูกติดตั้งอย่างแย่และไม่มีการปรับแต่งใด ๆ
Geek

8
ฉันไม่เห็นด้วย การพัฒนาและ 'ใช้พลังงาน' มักเกี่ยวข้องกับการใช้งานเชิงทดลอง ตัวอย่างเช่นเมื่อใช้เครื่องมือประมวลผลภาพบรรทัดคำสั่งจะไม่มีข้อกำหนดเฉพาะว่าหน่วยความจำของการทำงานนั้นเกี่ยวข้องกับขนาดของภาพมากน้อยเพียงใด ดังนั้นฉันแค่ให้มันวิ่ง และฉันไม่คิดว่ามันจะทำให้เครื่องทั้งหมดของฉันไร้ประโยชน์ สำหรับการทดลองครั้งเดียวฉันสามารถใช้ ulimit เพื่อรักษาความปลอดภัย แต่สำหรับการดำเนินการทั้งระบบที่มีการดำเนินการจำนวนมากบางครั้งการควบคุมหนึ่งกระบวนการไม่เป็นประโยชน์อย่างมาก แต่เป็นการประกันชีวิตสำหรับเครื่องทั้งหมดแน่นอน
dronus

1
ความจริงที่ว่าระบบของคุณกริดหยุดการทำงานเมื่อใช้ swap เป็นที่น่าสงสัย คอมพิวเตอร์ของคุณใช้ swap อยู่เพราะหน่วยความจำไม่เพียงพอ สลับช้าลงทำให้การเข้าถึงดิสก์ช้า การเข้าถึงดิสก์ช้าเนื่องจาก ??? ปัญหามันอยู่ตลอดทาง มันไม่ใช่แค่ว่าคุณมี RAM น้อย มันเป็นสิ่งที่คุณไม่สามารถใช้วิธีเดียวในการบรรเทาผลกระทบอันเนื่องมาจากสิ่งอื่น
Geek

7
@ JourneymanGeek คุณอยู่ในช่องด้านซ้าย ดิสก์จะช้าเมื่อเปรียบเทียบกับ ram ระยะเวลาดังนั้นการสลับที่หนักหน่วงจะทำให้ระบบหยุดชะงัก แน่นอนว่าเขามีหน่วยความจำไม่เพียงพอเพราะเขาพยายามเรียกใช้โปรแกรมที่ใช้หน่วยความจำจำนวนมาก คำถามคือจะทำอย่างไรเมื่อหน่วยความจำไม่เพียงพอ? ฆ่าหมูหรือทำให้ช้าลงเนื่องจากไม่มีหน่วยความจำเหลืออยู่สำหรับดิสก์แคช
psusi

2
@TomWijsman, Disk IO นั้นมีขนาดของคำสั่งที่ช้ากว่าหน่วยความจำ IO ดังนั้นการใช้การแลกเปลี่ยนดิสก์จึงมีความหมายที่ช้าลงอย่างมาก บางครั้ง (โดยเฉพาะอย่างยิ่งในสมัยก่อนที่ ram มีราคาแพงและคนส่วนใหญ่มีไม่มาก) ซึ่งดีกว่าที่จะไม่สามารถทำสิ่งที่คุณพยายามได้เลย วันนี้ดิสก์SOช้ากว่าแกะและแกะเป็นพอราคาถูกที่คนส่วนใหญ่มีความอุดมสมบูรณ์ดังนั้นในโอกาสที่หายากที่พวกเขาตั้งใจทำงานบางอย่างที่ใช้มากขึ้น ram กว่าที่พวกเขามีก็มักจะดีกว่าที่จะให้ขึ้นกว่าใช้เวลา 1000 นานเท่าที่จะทำ
psusi

คำตอบ:


36

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

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

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


3
ขอบคุณสำหรับการเกาคันนี้! รัก แต่เนิ่นๆ
Thomas Ferris Nicolaisen

1
เพิ่งรู้ว่า Android ทำเช่นเดียวกันมาเป็นเวลานาน ฉันไม่แน่ใจว่ามันใช้รหัสที่กำหนดเองเช่นเดียวกับคุณหรือไม่
dronus

1
earlyoomตอนนี้ฉันกำลังทดสอบมันทำได้ดีในการทดสอบทริกเกอร์ครั้งแรก ฉันแค่สงสัยว่าเหตุใดจึงไม่สามารถใช้งานได้โดยการกำหนดค่าเคอร์เนลหรือเครื่องมือของระบบ
dronus

12

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

คุณสามารถเปลี่ยนนโยบายเริ่มต้นที่จะ overcommit หน่วยความจำไม่อนุญาตโดยการเขียนค่าของ /proc/sys/vm/overcommit_memory2 ค่าเริ่มต้น/proc/sys/vm/overcommit_ratioคือ 50 ดังนั้นเคอร์เนลจะไม่อนุญาตให้แอปพลิเคชันจัดสรรมากกว่า 50% ของ ram + swap หากคุณไม่มีการแลกเปลี่ยนเคอร์เนลจะไม่อนุญาตให้แอปพลิเคชั่นจัดสรร RAM ของคุณได้มากกว่า 50% ปล่อยให้แคชอีก 50% ว่าง นั่นอาจจะมากเกินไปสักหน่อยดังนั้นคุณอาจต้องการเพิ่มค่านี้เพื่อบอกว่า 85% หรือมากกว่านั้นดังนั้นแอปพลิเคชันสามารถจัดสรร RAM ของคุณได้สูงถึง 85% โดยทิ้งแคชไว้ 15%


1
การเปลี่ยนค่าเหล่านี้จากค่าเริ่มต้นที่ไม่มีพื้นฐานทางทฤษฎีจะไม่ไปถึงในระบบที่เชื่อถือได้มากขึ้นคุณสามารถพิสูจน์ได้ว่าการเปลี่ยนแปลงนั้นมีสถิติที่เหมาะสมเท่านั้น เพียงเพราะคุณสามารถเปลี่ยนแปลงมันไม่ได้หมายความว่าคุณควร หากคุณอยู่ในสภาวะหน่วยความจำต่ำอย่างต่อเนื่องซึ่งหมายความว่าคุณกำลังใช้หน่วยความจำมากกว่าที่คุณมีและควรซื้อหน่วยความจำเพิ่มขึ้นนั่นไม่ได้หมายความว่าคุณควรจะเล่นซอกับการตั้งค่าและฆ่าแอปพลิเคชันแบบสุ่ม การขัดจังหวะการทำงานประจำวันของคุณหรือแนะนำการคอร์รัปชั่นนั่นไม่ใช่หนทางที่จะไป ...
Tamara Wijsman

3
@ TomWijsman คำถามทำให้เห็นชัดเจนว่าเขาไม่ได้อยู่ในสภาพหน่วยความจำต่ำอย่างต่อเนื่อง; บางครั้งเขาเรียกใช้คำสั่งที่ใช้หน่วยความจำจำนวนมากโดยไม่คาดคิด การซื้อหน่วยความจำเพิ่มเติมไม่ใช่ทางออกเดียวเมื่อคุณหมด โซลูชันที่เป็นไปได้อื่น ๆ ได้แก่ การค้นหาวิธีที่ดีกว่าในการใช้ประโยชน์จากหน่วยความจำที่คุณมีหรือไม่เพียงแค่ทำสิ่งที่ต้องการหน่วยความจำมาก คำถามทำให้ชัดเจนว่าหลังเป็นที่ยอมรับได้มากกว่าการออกไปซื้อ ram มากกว่า
psusi

บรรทัดใดในคำถามที่ทำให้สิ่งนี้ชัดเจน I disabled swap, because for GUI usage it mostly renders the machine unresponsive in such a way not useable anymore.ผมเห็นตรงข้ามกับที่กำหนดใน เขาพูดถึง GUI ในขณะที่คุณกำลังสมมติว่าเขารันคำสั่ง การซื้อหน่วยความจำเพิ่มเติมเป็นวิธีแก้ปัญหาแรกโดยใช้หน่วยความจำน้อยลงด้วยตัวคุณเองเป็นโซลูชันที่สองทำให้ระบบของคุณไม่เสถียรโดยการเล่นซอกับค่าเริ่มต้นที่เสถียรเป็นวิธีสุดท้าย คำถามไม่จำเป็นต้องตอบอย่างแท้จริงดังนั้นฉันไม่เห็นว่าปัญหาของคุณคืออะไรที่คุณต้องรบกวนเราทั้งคู่ในความคิดเห็น พูดจาโผงผางไม่ช่วย ...
Tamara Wijsman

4
เฮ้คำตอบนี้ฟังดูดีมาก น่าเสียดายที่ 'ส่งมอบ' หมายถึงความต้องการหน่วยความจำเสมือนที่ดูเหมือนว่าจะค่อนข้างเลวร้าย เช่นกับฉัน (ไม่สลับ) สก์ท็อปที่ทำงานมีประมาณ 400 หน่วยความจำกายภาพ 2000mb ใช้ แต่ 1600mb 'commit'ted เป็น/proc/meminfoของCommitted_ASรัฐ เมื่อแอพพลิเคชั่นทำงานอยู่ค่านี้จะเกินหน่วยความจำกายภาพอย่างง่ายดายดังนั้นจึงเป็นการยากที่จะกำหนดขีด จำกัด ที่เป็นไปได้โดยสิ่งนี้
dronus

3
บันทึกงานของคุณก่อนที่จะลองสิ่งนี้! : PI มีข้อผิดพลาดจากทุกสิ่งในทันที (ทุบตี, จัดการหน้าต่าง ฯลฯ )
jozxyqk

8

สำหรับฉันการตั้งค่า vm.admin_reserve_kbytes = 262144 ทำสิ่งนี้อย่างแน่นอน OOM killer intervents ก่อนที่ระบบจะไม่ตอบสนองอย่างสมบูรณ์


1
ฉันชอบความคิด แต่หมายความว่าคุณมีหน่วยความจำกายภาพ 256MiB หรือไม่เคยใช้?
Jérôme Pouiller

1
จะใช้ 256MiB สำหรับแคช แคชมีความสำคัญจริง ๆ ไม่ใช่แค่ทำงานได้เร็วขึ้นระบบจะไม่ทำงานหากไม่มีหน่วยความจำแคชเพียงพอ รหัสของโปรแกรมที่กำลังทำงานทุกโปรแกรมสามารถยกเลิกการโหลดจากหน่วยความจำได้เพราะมันเป็น mmaped และสามารถอ่านได้จากดิสก์ หากไม่มีแคชทุกสวิตช์ของงานจะต้องอ่านดิสก์และระบบจะไม่ตอบสนองอย่างสมบูรณ์
Michael Vigovsky

4

คำตอบอื่น ๆ มีวิธีแก้ปัญหาอัตโนมัติที่ดี แต่ฉันคิดว่ามันจะมีประโยชน์ในการเปิดใช้งานSysRqคีย์เมื่อสิ่งต่าง ๆ หลุดมือไป ด้วยSysRqคีย์คุณจะต้องส่งข้อความเคอร์เนลด้วยตนเองและคุณสามารถทำสิ่งต่าง ๆ เช่นรีบูตเครื่องอย่างปลอดภัย (ด้วยSysRQ + REISUB) แม้ว่า userspace จะถูกแช่แข็งอย่างสมบูรณ์

เพื่อให้เคอร์เนลฟังการร้องขอตั้งค่าkernel.sysrq = 1หรือเปิดใช้งานฟังก์ชั่นที่คุณน่าจะใช้กับ bitmask (มีเอกสารไว้ที่นี่ ) ยกตัวอย่างเช่นkernel.sysrq = 244จะช่วยให้คอมโบทั้งหมดที่จำเป็นสำหรับการรีบูตปลอดภัยดังกล่าวข้างต้นเช่นเดียวกับการภาวนาคู่มือของนักฆ่า OOM SysRq + Fด้วย


-2

ความน่าเชื่อถือไม่สามารถเข้าถึงได้โดยเงื่อนไขหน่วยความจำเหลือน้อยและ OOM killer

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

เป็นไปได้ไหมที่จะทำการแทรกแซง OOM killer ก่อนหน้านี้?

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

ฉันพยายามปรับแต่งระบบการพัฒนาของฉันเพื่อความน่าเชื่อถือสูงสุด

ความน่าเชื่อถือสูงสุดเกี่ยวข้องกับการทดสอบระบบของคุณและปรับปรุงระบบของคุณตามการทดสอบเหล่านี้

เพียงแค่การสุ่มสิ่งต่าง ๆจะไม่ได้รับคุณ ...

ฉันปิดการแลกเปลี่ยนเพราะสำหรับการใช้งาน GUI ส่วนใหญ่จะทำให้เครื่องไม่ตอบสนองในลักษณะที่ไม่สามารถใช้งานได้อีกต่อไป อย่างไรก็ตามหากแอ็พพลิเคชันแบบก้าวร้าวกลืนกินความทรงจำกลไกบางอย่างก็ดูเหมือนจะทำให้มันเกิดประโยชน์สูงสุดจากต้นทุนความเร็ว

เนื่องจากสภาพหน่วยความจำต่ำปิดการใช้งานการแลกเปลี่ยนจะไม่ปรับปรุงพฤติกรรม , มันจะตรงข้าม

เพื่อเพิ่มความน่าเชื่อถือในสถานการณ์นี้ให้เพิ่มหน่วยความจำให้มากขึ้นเพื่อให้ระบบของคุณตอบสนองได้ดีขึ้นและไม่มีกระบวนการสุ่มถูกฆ่าโดยที่ผู้ใช้ไม่ต้องการ คุณไม่ควรใช้เงื่อนไขหน่วยความจำต่ำและกลไกแบบนี้โดยเฉพาะอย่างยิ่งไม่ได้อยู่ในสภาพแวดล้อมการพัฒนา ...

ไม่มีการดำเนินการสลับฮาร์ดไดรฟ์ แต่ระบบก็ไม่ตอบสนองเช่นเดียวกัน

เงื่อนไขหน่วยความจำต่ำส่งผลให้ไม่ตอบสนองไม่ว่าคุณจะมีการสลับหรือไม่ก็ตาม

ดังนั้นฉันต้องการปล่อยให้นักฆ่า OOM เตะก่อนที่ระบบจะใช้ความพยายามพิเศษเพื่อเพิ่มความจำ

ความพยายามพิเศษที่จะทำอันตรายมากกว่าดีดังที่ฉันได้อธิบายไว้ข้างต้น แต่คุณสามารถฆ่ากระบวนการที่คุณไม่ต้องการได้ แต่ฉันคิดว่าคุณไม่สามารถทำได้ดังนั้น OOM จะฆ่ากระบวนการที่คุณต้องการ

เป็นไปได้หรือไม่ที่จะกำหนดค่า OOM killer ให้ทำงานหากมีหน่วยความจำกายภาพว่างน้อยกว่า 100 MB?

อาจเป็นไปได้ แต่คุณจะได้รับผลตอบแทนการลงทุนที่สูงขึ้นถ้าคุณเพิ่งซื้อหน่วยความจำเพิ่มเติมซึ่งไม่ได้มีค่าใช้จ่ายเท่าไหร่ พิจารณาว่าคุณจะตีตัวเองด้วยการเดินเท้าในระยะยาวหากคุณยังคงทำงานในสภาวะที่หน่วยความจำเหลือน้อย OOM เป็นเหมือนปลัดอำเภอมันไม่ช่วยคุณเลยมันช่วยระบบปฏิบัติการ ...


7
แน่นอนว่าการปิดใช้งานการสลับจะช่วยปรับปรุงพฤติกรรมเนื่องจากแทนที่การฟาดดิสก์ดิสก์ OOM จะเตะและฆ่าหมูหน่วยความจำ การใช้งานหน่วยความจำไม่ได้เป็นปัญหา (และการเพิ่มมากขึ้นหมายถึงคุณต้องพยายามให้มากขึ้น) ปัญหาคือสิ่งที่ต้องทำเมื่อคุณหมด คุณต้องการให้ OOM ฆ่าหมูและทำให้สภาพความจำต่ำลง
psusi

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

5
การซื้อหน่วยความจำเพิ่มเติมบางอย่างอาจช่วยแก้ปัญหาได้ขึ้นอยู่กับจำนวนที่ซื้อ แต่มันไม่ได้เปลี่ยนความจริงที่ว่าอาจมีประเพณีที่ไม่คาดคิดตามคำสั่งของขนาด ดังนั้นฉันต้องการให้แอปพลิเคชันล้มเหลว แต่ไม่ใช่ระบบภายใต้เงื่อนไขเหล่านั้น ตัวอย่างบางส่วน: ประมวลผลโฟลเดอร์ที่เต็มไปด้วยรูปภาพที่ถูกบีบอัดขนาดส่วนใหญ่เป็น "ปกติ" แต่บางภาพก็มีขนาดใหญ่มาก ข้อผิดพลาดเล็ก ๆ อาจทำให้ลูปตายด้วยหน่วยความจำที่กิน 1GB / s เปิดไฟล์วิดีโอโดยไม่ได้ตั้งใจในโปรแกรมแก้ไขข้อความ มักจะลงท้ายนี้กับอาการเช่นเมาส์กระตุกและ UI เกือบตายจนกว่าจะเตะใน OOM.
dronus

6
@TomWijsman ยังมีลูปเกือบตายเนื่องจากมีอัลกอริธึมที่ทำงานแบบเชิงเส้นในกรณีเฉลี่ย แต่เป็นเลขชี้กำลังในกรณีเลวร้ายที่สุดขึ้นอยู่กับข้อมูลอินพุต และฉันไม่สามารถส่งสัญญาณการฆ่าได้หากเมาส์กระตุกและคลิกรวมทั้งแป้นพิมพ์แสดงเวลาแฝงหนึ่งนาที ฉันมักจะเปลี่ยนเป็นเทอร์มินัลโหมดข้อความจากนั้นและรอสักครู่เพื่อให้การลงชื่อเข้าใช้ดำเนินการต่อเพื่อkillพิมพ์ผิด ๆ
dronus

7
ฉันไม่มีปัญหากับแอปพลิเคชันการฆ่าที่จะทำงานได้เหมือนกัน พิจารณาระบบที่มีการสลับทางกายภาพ 2GB + 2GB แอปพลิเคชันที่หมดหน่วยความจำกายภาพอย่างรวดเร็วสามารถกินการสลับได้ง่ายเช่นกัน มันจะตายในภายหลังหลังจากแสดงผลระบบไม่ตอบสนองเป็นนาที ดังนั้นทำไมไม่ฆ่ามันอย่างรวดเร็วก่อนที่การทำงานของ GUI จะไม่สม่ำเสมอ? กระบวนการจำนวนมากทำงานทั้งหมดด้วย 10mb บางใช้เวลา 1gb และบางอย่างหายากจะต้องมี 10gb นั่นคือชีวิต
dronus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.