ปุ่ม“ ฆ่ากระบวนการที่ใหญ่ที่สุด”


14

แล็ปท็อปนี้มี SSD ดังนั้นฉันจึงตัดสินใจไม่เปลี่ยน วิธีนี้ใช้งานได้ดีในกรณีส่วนใหญ่ แต่บางครั้ง RAM ก็ค่อนข้างสั้นและคอมพิวเตอร์ก็ซบเซาและมีแนวโน้มที่จะแข็งตัว มีวิธีการใช้ปุ่ม "ฆ่ากระบวนการที่ใหญ่ที่สุด" ที่ตรงไปยังเคอร์เนลในกรณีที่ฉันสังเกตเห็นการตรึงเร็วพอ? หรือเพราะเป็นคอมพิวเตอร์ฮิวริสติกเมื่อมันเริ่มแข็งตัวและถ่ายทำกระบวนการที่ใหญ่ที่สุดก็จะใช้ได้เช่นกัน


คุณหมายถึงคำสั่ง "ฆ่ากระบวนการที่ใหญ่ที่สุด" หรือไม่?
Ramesh

Linux มีสิ่งนี้ มันเรียกว่านักฆ่า OOM แต่คุณต้องเปิดใช้งานหน่วยความจำทับหน้า (และจะเปิดตามค่าเริ่มต้นใน distros ส่วนใหญ่)
Patrick

@ แพทริกovercommit_memoryเป็น0, เป็นovercommit_ratio 50
Reactormonk

คำตอบ:


12

จากความคิดเห็นของคุณดูเหมือนว่าระบบจะทำการแลกเปลี่ยน

ลีนุกซ์มีนักฆ่า 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) คุณสามารถทำได้สองวิธี

  1. Alt+ SysRq+ f
    เพียงกด 3 ปุ่มบนแป้นพิมพ์
  2. echo f > /proc/sysrq-trigger
    สิ่งนี้จะทำงานเช่นเดียวกับวิธีการของคีย์บอร์ด แต่จะเป็นแบบโปรแกรม

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

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


ฉันไม่รู้เกี่ยวกับ OOM Killer ฉันคิดถึงสคริปต์ที่คอยตรวจสอบการใช้งานหน่วยความจำอย่างต่อเนื่องโดยใช้topหรือpsคำสั่งและหากเกินขีด จำกัด ขีด จำกัด การฆ่ากระบวนการนั้นโดยใช้killคำสั่ง
Ramesh

ฉันไม่ได้ใช้การแลกเปลี่ยนใด ๆ
Reactormonk

เพื่อดูว่ากระบวนการใดถูกสังหารโดยนักฆ่าgrep -E "oom-killer|Killed process" /var/log/syslog /var/log/syslog.1
อุ้ม

@Tass Oh ฉันจ้องไปที่ความคิดเห็น "ฉันตัดสินใจที่จะละเว้นการแลกเปลี่ยน" ขอโทษ :-( แม้ว่าข้อมูล "การฆ่ากระบวนการด้วยตนเอง" ยังคงมีอยู่อย่างไรก็ตามคุณไม่ควรพบความเชื่องช้าเมื่อหน่วยความจำไม่เพียงพอคุณ ควรพบเคอร์เนลเพียงแค่ฆ่าสิ่งต่าง ๆ
Patrick

@ แพทริกที่เกิดขึ้น แต่หลังจาก ~ 30 นาที
Reactormonk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.