ระบบค้างเมื่อหน่วยความจำไม่เพียงพอ


34

ฉันมี eeePC 900a: มันมีแฟลช 8GB เป็นดิสก์และ RAM เพียง 1GB การกระจาย Linux ที่ติดตั้งในนั้นคือ ArchLinux

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

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

เคอร์เนลไม่ควรฆ่าแอปพลิเคชั่นแบบสุ่มเมื่อหน่วยความจำไม่เพียงพอหรือไม่ ทำไมมันจึงล้มเหลว (หรือใช้เวลานาน) ในการทำเช่นนั้น?

ไม่กี่เดือน / ปีที่ผ่านมาฉันพยายามมองลึกเข้าไปในเรื่องนี้ แต่ไม่พบสิ่งใดที่จะใช้งานได้จริง ...


1
คุณใช้ DE / WM ใดในการตั้งค่าคุณใช้บริการ / daemons ใดอยู่ การใช้สภาพแวดล้อมเดสก์ท็อปเต็มรูปแบบและเรียกดูด้วย Chromium หรือ Firefox เช่นกิน RAM ของคุณสำหรับอาหารก่อนเที่ยง RAM ขนาด 1GB น่าจะเพียงพอในการใช้งาน Arch Linux เอง แต่สิ่งที่สำคัญจริงๆคือสิ่งที่คุณวางไว้บนสุด

1
ฉันใช้ LXDE Chromium เป็นโปรแกรมที่มักใช้แรมส่วนใหญ่ อย่างไรก็ตามนี่ไม่ใช่ประเด็น ไม่ใช่ฉันที่ต้องสนใจว่าระบบของฉันใช้หน่วยความจำมากแค่ไหน แต่เป็นระบบของฉันที่ไม่ควรตายเพราะสิ่งนั้น หากระบบของฉันมีหน่วยความจำสั้นมันสามารถฆ่าแอปพลิเคชันที่ต้องการได้ฉันแค่ต้องการให้มันไม่หยุด !
peoro

5
ฉันหมายความว่าฉันคิดอย่างจริงจังเกี่ยวกับการทำงานสคริปต์เช่นนี้ (ใน pseudocode) while(true){ if( $FREE_MEMORY<10MB ){ kill -9 $RANDOM_PID; } }A: นี่จะแก้ไขปัญหาของฉันอย่างแน่นอน แต่เดี๋ยวก่อนเคอร์เนลไม่ควรทำอย่างนั้น (และในทางที่ดีกว่าสคริปต์ของฉัน)? ทำไมมันไม่ทำงาน
peoro

2
@Marcin ที่จะย้ายปัญหาไม่สามารถแก้ไขได้ แม้ว่าฉันจะมีหน่วยความจำ 4GB (ขอบคุณ swap บางอย่าง) ระบบของฉันอาจมีหน่วยความจำไม่เพียงพอ สิ่งที่ฉันต้องการหลีกเลี่ยงคือระบบของฉันค้างเมื่อ RAM ไม่เพียงพอ หากเคอร์เนลของฉันจะฆ่าโครเมียมในทันใดทันทีที่ RAM ของฉันหมดฉันจะมีความสุขแม้ว่าจะมี 1GB แล้วก็ตาม
peoro

4
@Lee "magic sysrq" เป็นคีย์ผสมที่ไปยังเคอร์เนลโดยตรง วิธีนี้จะใช้งานได้แม้ว่าแป้นพิมพ์และเมาส์จะไม่ตอบสนอง ดูen.wikipedia.org/wiki/Magic_SysRq_key
Raman

คำตอบ:


14

เป็นไปได้ที่จะเรียกใช้ OOM-killer โดยตรง

SysRq-F

โดยปกติแล้วคีย์ SysRq จะรวมอยู่ในคีย์ PrtSc บนคีย์บอร์ด

OOM-killer ฆ่ากระบวนการบางอย่าง (-es) และระบบจะตอบสนองอีกครั้ง

ขอบคุณสำหรับคำแนะนำเกี่ยวกับคุณลักษณะนี้ในความคิดเห็นด้านบน

PS: สิ่งนี้ช่วยฉันได้มาก ฉันเห็นด้วยกับความเห็นว่านี่เป็นคำแนะนำที่มีประโยชน์ที่สุดเกี่ยวกับปัญหานั้นถ้ามันเกิดจาก Chrome หรือซอฟต์แวร์โลภหน่วยความจำใด ๆ แต่คุณต้องจำไว้ว่า OOM-killer สามารถฆ่ากระบวนการที่สำคัญบางอย่างใช้อย่างระมัดระวัง


2
PrtScn|SysRqฉันมีกุญแจ แต่การกดSysRq - Fเพียงได้รับหน้าจอ
ลี

2
เนื่องจากคุณมักจะแสดงความคิดเห็นของฉันด้านบนและทำให้มันเป็นคำตอบการแสดงตัวเล็ก ๆ น่าจะดี ฉัน upvoting คุณต่อไป :-)
รามัน

3
@ ชอบคุณต้องเปิดใช้งาน Distros บางตัวไม่มี Magic sysrq เปิดใช้งานโดยค่าเริ่มต้น สิ่งนี้น่าจะช่วยได้: google.ca/search?q=sysrq+enable
Raman

2
@Raman ฉันวางเดิมพัน 99% ผู้ที่พบว่าสิ่งนี้ไม่สามารถ "เปิดใช้งาน" โดยค่าเริ่มต้นเพราะเครื่องของพวกเขาค้างไว้แล้ว ... ทำไมไม่เปิดใช้งานโดยค่าเริ่มต้น
themihai

3
@themihai เพราะหลายคนคิดว่าเป็นความเสี่ยงด้านความปลอดภัย - ช่วยให้คุณเข้าถึงเคอร์เนลโดยตรงผ่านการเข้าถึงทางกายภาพไปยังอุปกรณ์อินพุตโดยไม่คำนึงถึงสถานะของแอปพลิเคชันเช่นหน้าจอล็อคและเช่นนั้น
Raman

11

สถานะธรรมชาติของสิ่งต่าง ๆ คือข้อมูลแอปพลิเคชันอยู่ใน RAM และไฟล์อยู่บนดิสก์
สถานะที่สมบูรณ์แบบของสิ่งต่าง ๆ ประสิทธิภาพที่ชาญฉลาดคือข้อมูลที่ใช้บ่อยคือ RAM และข้อมูลที่ไม่ต้องการในขณะนี้คือบนดิสก์
ในระบบปกติเคอร์เนลทำสองสิ่งเพื่อพยายามเข้าถึงอุดมคตินี้:

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

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

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

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับปัญหานี้โปรดดูการสนทนา lkmlและบล็อกโพสต์นี้

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


1
ขอบคุณสำหรับคำอธิบายและการเชื่อมโยงพวกเขาช่วยล้างข้อสงสัยเกี่ยวกับการแลกเปลี่ยน ต่อไปนี้ @Marcin ตอบคำถามของฉันฉันตั้ง 256MB ของการสลับเสมือนแบบบีบอัด (compcache) ใน RAM ของฉัน อย่างไรก็ตามนี่ไม่ได้ตอบคำถามของฉันอย่างเต็มที่: ฉันเข้าใจว่าระบบของฉันจะช้าเมื่อใช้งานทั้ง RAM โดยแอปพลิเคชันเท่านั้นและไม่มีแคชใด ๆ ฉันยังคงไม่เข้าใจว่าทำไมระบบนี้ถึงหยุดทำงานเป็นนาที / ชั่วโมง (อาจจะตลอดไป?) เมื่อฉันหมด RAM ฉันคิดว่าเคอร์เนลของฉันไม่ทำงานในการฆ่าแอปพลิเคชันเมื่อหน่วยความจำไม่เพียงพอหาก 3 ชั่วโมงไม่เพียงพอที่จะเปลี่ยนเป็น TTY1
peoro

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

6

ปัญหานี้เป็นปัญหาที่รู้จักกันมาตั้งแต่ปี 2007 - เห็นแช่แข็งระบบการใช้งานหน่วยความจำสูง

ในสถานการณ์นี้ Windows จะแสดงกล่องโต้ตอบเตือนผู้ใช้ให้ปิดแอปพลิเคชั่นอย่างน้อยหนึ่งรายการ


2
ดูเหมือนว่าจะเป็น "Unassigned" ใน Ubuntu บางที DE ควรเตือนผู้ใช้หรือตรึงแอพที่ใช้หน่วยความจำมาก?
nkkollaw

1
@nbrogi - ทุกอย่างยกเว้นเงียบ ๆ แต่ขอให้โชคดีที่ Ubuntu เชื่อมั่นในการทำเช่นนั้น
Dan Dascalescu

6

เมื่อเร็ว ๆ นี้ฉันพบวิธีแก้ไขปัญหาของฉัน

เนื่องจากนักฆ่าลินุกซ์ OOM จะไม่สามารถทำผลงานได้อย่างถูกต้องผมก็เริ่มใช้ userspace OOM Killer: earlyoom มันเขียนด้วยภาษา C ตั้งค่าได้พอสมควรและมันใช้งานได้ดีสำหรับฉัน

ฉันเคยได้ยินเกี่ยวกับทางเลือกอื่นเช่นOOMD ของ Facebook ที่พัฒนาขึ้นเพื่อให้ทำงานบนเซิร์ฟเวอร์ของพวกเขา แต่ฉันไม่ได้ลองสิ่งนี้

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