ป้องกัน Ubuntu จากการแช่แข็งแม้ว่าหน่วยความจำระบบจะเหลือน้อย


24

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

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

นี่คือสิ่งที่ Ubuntu ทำเพื่อฉัน: กินหน่วยความจำ fre ทั้งหมดแล้วขอให้ระบบปฏิบัติการแลกเปลี่ยนบริการที่จำเป็นทั้งหมด (เซสชัน gnome, terminal, keyboard) จากนั้นหยุดและรอให้ฉันดึงปลั๊กไฟ

สองคำถาม:

  1. ระบบปฏิบัติการสามารถสันนิษฐานได้อย่างไรว่าสิ่งใดที่สำคัญเกินกว่าที่จะหยุดฟังอินพุตของผู้ใช้ได้
  2. ฉันจะบอก Ubuntu ได้อย่างไรว่าจะไม่ต้องแลกเปลี่ยนบริการที่จำเป็นและตอบสนองต่ออินพุตของผู้ใช้เสมอแม้ว่ากระบวนการโง่ ๆ บางอย่างจะพยายามกินทรัพยากรมากกว่าที่ระบบจัดไว้ให้

คุณติดตั้ง RAM เท่าใด swap ของคุณมีขนาดเท่าใด (ในเทอร์มินัลพิมพ์swaponเพื่อค้นหา) ไชโยอัล
ไฮน์เนมา

3
ram 16gb และ 16gb swap แต่นั่นไม่ใช่จุดที่นี่ปัญหานี้ไม่สามารถแก้ไขได้โดยการเพิ่มหน่วยความจำเพิ่มเติม
Klamann

1
ลองหนึ่งในสองสิ่งนี้ 1) เปลี่ยนการswappinessตั้งค่าเป็น 10 เช่น: vm.swappiness = 10ใน /etc/sysctl.conf ค้นหาที่นี่เพื่อรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ 2) ถ้า swappiness ไม่ช่วย ... แม้ว่าคุณอาจไม่ต้องการ ... เพิ่มขนาดของ swapfile ของคุณเป็น 1.5x16G และดูว่ามันช่วยได้หรือไม่ ให้ฉันโพสต์ ไชโยอัล
ไฮน์เนมา

1
@Klamann ฉันยอมรับการเพิ่ม swap อีกครั้งจะไม่แก้ไขปัญหา เมื่อคุณมีโปรแกรมที่ใช้งานไม่ได้ซึ่งใช้ RAM + SWAP ทั้งหมดเพิ่ม SWAP พิเศษเพิ่มเติมจะเป็นการหน่วงเวลาที่หลีกเลี่ยงไม่ได้
WinEunuuchs2Unix

1
@ WinEunuuchs2Unix อย่างที่ฉันพูดvm.swappiness=10ต้องเพิ่มไปยัง sysctl.conf บุคคลที่มีประสบการณ์สามารถใช้คำสั่ง sysctl ได้ทันทีเพื่อตั้งค่า vm.swappiness = 10 โดยไม่ต้องแก้ไขไฟล์ sysctl.conf ไชโยอัล ps: รอ OP เพื่อตอบสนอง
heynnema

คำตอบ:


5

ฉันยังไม่มีวิธีแก้ไขปัญหา แต่ฉันสามารถเสนอวิธีแก้ไขปัญหาสองวิธีที่อาจเป็นที่สนใจของผู้อื่น:

1) ก่อนกำหนด

นั่นคือบริการที่เฝ้าดูการใช้งานหน่วยความจำและฆ่ากระบวนการที่ใช้หน่วยความจำมากที่สุดเมื่อถึงเกณฑ์ที่กำหนด (ดูที่นี่และนี่คำถามเกี่ยวกับนักฆ่า OOM ในเคอร์เนลลินุกซ์)

ฉันได้ทำการทดสอบด้วยกระบวนการสาธิตที่ร้องขอหน่วยความจำในหน่วยย่อย ๆ อย่างไม่มีกำหนด นี่เป็นความประทับใจครั้งแรกของฉัน: เมื่อฉันเริ่มต้นกระบวนการโกงมันกิน RAM ทั้งหมดของฉันอย่างรวดเร็ว จากนั้นการแลกเปลี่ยนเริ่มขึ้นระบบจะไม่ตอบสนอง ไม่กี่วินาทีต่อมาระบบจะกลับมาออนไลน์ บันทึกของช่วงต้นแสดงให้เห็นว่ามันฆ่ากระบวนการกินหน่วยความจำหลังจากที่ทั้งหน่วยความจำและการใช้งานการแลกเปลี่ยนถึง 90%

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

2) เพียงแค่ปิดการใช้งาน swap

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

คุณสามารถปิดการแลกเปลี่ยนสำหรับเซสชันปัจจุบันด้วยsudo swapoff -aหรือทำการเปลี่ยนแปลงแบบถาวร


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


1
ฉันปิดการใช้งาน swap และระบบของฉันเปลี่ยนจากหน่วยความจำเหลือน้อย (<100MB) ไปเป็นน้ำแข็ง ฉันจะบอกได้อย่างไรว่านักฆ่า OOM เปิดใช้งาน actuall หรือไม่
Michael

0

ลองหนึ่งในสองสิ่งนี้:

1) เปลี่ยนการตั้งค่า swappiness จากการตั้งค่าเริ่มต้นที่ 60, 10 คือ: เพิ่มvm.swappiness = 10เป็น /etc/sysctl.conf (ในเทอร์มินัลพิมพ์sudo gedit /etc/sysctl.conf ) จากนั้นรีบูทระบบ ค้นหาที่นี่เพื่อรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้

2) ถ้า swappiness ไม่ช่วย ... แม้ว่าคุณอาจไม่ต้องการ ... เพิ่มขนาดของ swapfile ของคุณเป็น 1.5x16G และดูว่ามันช่วยได้หรือไม่

ให้ฉันโพสต์ ไชโยอัล


ฉันได้ตั้งค่า VM ให้ใช้การทดสอบบางอย่างเนื่องจากการรีบูตระบบปฏิบัติการทุก ๆ สองสามวินาทีนั้นน่ารำคาญจริงๆ Ubuntu 16.04, ram 2gb, swap 3gb, ดิสก์ 20gb จากนั้นฉันก็เรียกใช้สคริปต์ที่กินหน่วยความจำมาก: ด้วยความรวดเร็วในการตั้งค่าเริ่มต้น (60) ระบบจะหยุดทำงานและหลังจากนั้นไม่กี่นาทีฉันก็ปิดมันลงเพราะเวลาในการกู้คืนไม่สามารถยอมรับได้ ด้วย swappiness 10 ระบบจะค้างเป็นเวลาสองสามวินาทีจากนั้นจะรับอินพุต แต่คุณไม่สามารถเริ่มกระบวนการใด ๆ ได้ (เช่นtopฆ่าหน่วยความจำ) หลังจากนั้นประมาณหนึ่งนาทีกระบวนการก็จะถูกฆ่า ไม่สมบูรณ์แบบ แต่เรากำลังเข้าใกล้
Klamann

ให้เราโพสต์. VM จะไม่เลียนแบบระบบปฏิบัติการในชีวิตจริงของคุณอย่างแท้จริง แต่จะให้คุณเล่นกับการตั้งค่า ฉันจะอยากรู้ว่า swappiness ช่วยคุณแก้ปัญหาได้ไหม ไชโยอัล
ไฮน์เนมา

ก็ดี. ความคืบหน้า! อ่านเพิ่มขึ้นเล็กน้อยเกี่ยวกับความรวดเร็ว คุณสามารถเล่นกับค่าเล็กน้อย ไชโยอัล
ไฮน์เนมา

มีการใช้การแลกเปลี่ยนเท่าไหร่เมื่อระบบหยุดทำงาน ไชโยอัล
ไฮน์เนมา

2
ทำไมประเด็นในนั้นคืออะไร? หน่วยความจำเพิ่มเติมจะไม่ป้องกันระบบจากการติดถ้าฉันดูดหน่วยความจำนั้นด้วย
Klamann

0

ฉันแก้ไขปัญหาที่คล้ายกัน ฉันไม่รู้ว่าประสบการณ์ของฉันอาจเหมาะกับคุณหรือไม่

เมื่อเร็ว ๆ นี้ฉันได้เผยแพร่คำแนะนำเกี่ยวกับวิธีการติดตั้ง linux บนอุปกรณ์ LVM แบบลูปแบ็คที่บูตจาก USB (ดังนั้นไม่ต้องติดตั้งด้วงบนดิสก์ภายใน นี่คือคำแนะนำ: https://github.com/DareDevil73/linux-on-loopback-usb

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

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

โปรดดูที่https://github.com/DareDevil73/linux-on-loopback-usb#known-issuesเพื่อรับข้อมูลที่ลึกซึ้งยิ่งขึ้น


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