OOM killer ทำงานไม่ถูกต้องนำไปสู่ระบบปฏิบัติการที่ตรึงไว้


23

เป็นเวลาหลายปีที่นักฆ่า OOMของระบบปฏิบัติการของฉันทำงานไม่ถูกต้องและนำไปสู่ระบบที่หยุดชะงัก
เมื่อการใช้หน่วยความจำสูงมากทั้งระบบมีแนวโน้มที่จะ "หยุด" (อันที่จริง: ช้ามาก ) เป็นเวลาหลายชั่วโมงหรือหลายวันแทนที่จะฆ่ากระบวนการเพื่อเพิ่มหน่วยความจำ
จำนวนสูงสุดที่ฉันบันทึกไว้คือ 7 วันก่อนลาออกเพื่อทำการรีเซ็ต
เมื่อ OOM ใกล้จะถึงแล้วiowaitนั้นสูงมาก (~ 70%) ก่อนที่จะกลายเป็นจำนวนที่ไม่สามารถวัดได้
เครื่องมือ: iotopแสดงให้เห็นว่าทุกโปรแกรมกำลังอ่านที่ปริมาณงานสูงมาก (ต่อสิบ MB / วินาที) จากฮาร์ดไดรฟ์ของฉัน
โปรแกรมเหล่านั้นกำลังอ่านอะไร
- ลำดับชั้นไดเรกทอรี?
- รหัสปฏิบัติการเอง?
ฉันไม่ได้ตอนนี้

[แก้ไข] ในเวลาที่ฉันเขียนข้อความนี้ (ในปี 2560) ฉันใช้ ArchLinux uptodate (4.9.27-1-lts) แต่เคยประสบปัญหานี้มาหลายปีแล้ว
ฉันประสบปัญหาเดียวกันกับลีนุกซ์รุ่นต่างๆและการตั้งค่าฮาร์ดแวร์ที่แตกต่างกัน
ปัจจุบัน (2019) ฉันใช้ Debian 9.6 (4.9.0) uptodate ฉันมีRAM จริง16 GB , SSD ที่ติดตั้งระบบปฏิบัติการของฉันและไม่มีพาร์ติชั่นการ สลับใด ๆ

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

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

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

ฉันได้ลองหลายอย่างแล้วโดยหวังว่าจะแก้ไขปัญหานี้
หนึ่งคือการตั้งค่า/proc/sys/vm/min_free_kbytesเป็น1000000(1 GB)
เนื่องจาก1 GBนี้ควรจะว่างฉันจึงคิดว่า Linux จะสงวนหน่วยความจำนี้เพื่อแคชข้อมูลสำคัญ
แต่มันก็ไม่ได้ผล

นอกจากนี้ฉันคิดว่ามีประโยชน์ที่จะเพิ่มว่าแม้ว่ามันจะฟังดูยอดเยี่ยมในทางทฤษฎีการ จำกัด ขนาดของหน่วยความจำเสมือนกับขนาดของหน่วยความจำกายภาพโดยการกำหนด/proc/sys/vm/overcommit_memoryให้2เป็นไปไม่ได้ในทางเทคนิคในสถานการณ์ของฉันเพราะชนิดของแอปพลิเคชัน ที่ฉันใช้ต้องการหน่วยความจำเสมือนมากกว่าที่พวกเขาใช้อย่างมีประสิทธิภาพด้วยเหตุผลบางอย่าง
ตามไฟล์/proc/meminfoที่Commited_ASคุ้มค่ามักจะสูงขึ้นกว่าสองเท่าของ RAM ที่มีอยู่จริงในระบบของฉัน (16 GB, Commited_ASมักจะ> 32 GB)

ฉันเคยประสบปัญหานี้กับ/proc/sys/vm/overcommit_memoryค่าเริ่มต้นของ: 0และในขณะที่ฉันได้กำหนดเป็น: 1เพราะฉันต้องการโปรแกรมที่จะถูกฆ่าโดยOOM killerแทนที่จะทำผิดเพราะพวกเขาไม่ได้ตรวจสอบค่าตอบแทนmallocเมื่อ การจัดสรรถูกปฏิเสธ

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

หากคุณต้องการข้อมูลเพิ่มเติมมีข้อเสนอแนะโปรดบอกฉัน

เอกสารประกอบ:
https://en.wikipedia.org/wiki/Thrashing_%28computer_science%29
https://en.wikipedia.org/wiki/Memory_overcommitment
https://www.kernel.org/doc/Documentation/sysctl/vm txt
https://www.kernel.org/doc/Documentation/vm/overcommit-accounting
https://lwn.net/Articles/317814/

พวกเขาพูดเกี่ยวกับเรื่องนี้:
ทำไม killer linux out-of-memory (OOM) จึงไม่ทำงานโดยอัตโนมัติ แต่ทำงานบน sysrq-key
ทำไมบางครั้ง OOM-killer จึงไม่สามารถฆ่าหมูทรัพยากรได้
การโหลด OOM Killer
ไว้ล่วงหน้าเป็นไปได้ไหมที่จะเรียกใช้ OOM-killer ในการบังคับให้สลับสับเปลี่ยน?
จะหลีกเลี่ยงเวลาแฝงที่สูงใกล้กับสถานการณ์ OOM ได้อย่างไร?
https://lwn.net/Articles/104179/
https://bbs.archlinux.org/viewtopic.php?id=233843


1
ฉันคิดว่านี่คือสิ่งที่คุณควรคาดหวังหากคุณกำลังตี แต่คุณไม่ได้เข้าใกล้ "ใช้แล้ว" 100% นั่นคือมีการใช้หน่วยความจำมากเกินไปซึ่งสำรองไฟล์ไว้นับเป็น "buff / cache" (อืมการใช้ถ้อยคำนี้ถือว่าการจัดสรร tmpfs ของคุณเป็นเรื่องเล็กน้อยเนื่องจากสิ่งเหล่านี้แสดงเป็น "buff / cache" แต่ไม่สามารถเพจออกเป็นระบบไฟล์ทางกายภาพ) min_free_kbytesไม่เกี่ยวข้องไม่ใช่การสำรองสำหรับหน้าแคช AFAICT ไม่มี vm sysctls อนุญาตให้จองหน่วยความจำใด ๆ โดยเฉพาะสำหรับหน้าแคชเช่น จำกัด MAP_ANONYMOUS การจัดสรร :(.
sourcejedi

2
ฉันกำลังมองหาวิธีแก้ไขปัญหาที่แน่นอนนี้มาหลายปีแล้วโดยไม่ประสบความสำเร็จ ฉันเชื่อว่าฉันสังเกตเห็นปัญหาครั้งแรกหลังจากเปลี่ยน HDD ของฉันเป็น SSD ซึ่งยังมอบให้ฉันปิดการใช้งานการแลกเปลี่ยนทั้งหมด แต่ฉันไม่สามารถรับประกันได้เลยว่ามันจะไม่เกิดขึ้นก่อนการเปลี่ยนแปลงเหล่านี้ดังนั้นจึงอาจไม่เกี่ยวข้อง ฉันใช้ Archlinux btw
brunocodutra

2
ฉันเพิ่งโพสต์บนฟอรัม Arch Linuxเกี่ยวกับเรื่องนี้
Ignat Insarov

1
@ dsstorefile1 ขอบคุณฉันจะลองดู แต่มันจะทริกเกอร์ OOM killer ได้อย่างไรเมื่อเคอร์เนลในสถานการณ์นี้ไม่สามารถทำได้อย่างถูกต้อง?
M89

1
มันช่วยได้เมื่อโครเมี่ยมจัดการให้รั่วไหลผ่าน RAM ทั้งหมดของฉัน ... (แม้ว่าในที่สุดฉันก็เพิ่มพาร์ติชั่นการสลับดิสก์จริงเช่นกันและในที่สุดก็อัพเกรดเป็น RAM ที่เหมาะสม)
Gert van den Berg

คำตอบ:


5

ฉันได้พบคำอธิบายสองประการ (จากสิ่งเดียวกัน) ว่าทำไมkswapd0 ทำการอ่านดิสก์อย่างต่อเนื่องจึงเกิดขึ้นได้ดีก่อนที่ OOM-killer จะฆ่ากระบวนการที่กระทำผิด:

  1. ดูคำตอบและความคิดเห็นของคำตอบ askubuntu SE นี้
  2. ดูคำตอบและความเห็นของ David Schwartz เกี่ยวกับคำตอบนี้ในยูนิกซ์ SE

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

ตัวอย่างเช่นพิจารณากรณีที่คุณมีการแลกเปลี่ยนเป็นศูนย์และระบบใกล้จะหมด RAM เคอร์เนลจะใช้หน่วยความจำจากเช่น Firefox (สามารถทำได้เนื่องจาก Firefox กำลังเรียกใช้รหัสปฏิบัติการที่โหลดจากดิสก์ - รหัสสามารถโหลดได้จากดิสก์อีกครั้งหากจำเป็น) หาก Firefox ต้องการเข้าถึงแรมนั้นอีกครั้งในภายหลัง N วินาที CPU จะสร้าง "ข้อผิดพลาดอย่างหนัก" ซึ่งบังคับให้ Linux เพิ่ม RAM บางตัว (เช่นใช้ RAM บางส่วนจากกระบวนการอื่น) โหลดข้อมูลที่หายไปจากดิสก์แล้วอนุญาตให้ Firefox ดำเนินการต่อ ตามปกติ. นี่คล้ายกับการแลกเปลี่ยนปกติและ kswapd0 ทำเช่นนั้น - Mikko Rantalainen 15 ก.พ. เวลา 13:08 น

หากใครมีวิธีการปิดการใช้งานพฤติกรรมนี้ (อาจจะคอมไพล์เคอร์เนลด้วยตัวเลือกอะไร? ) โปรดแจ้งให้เราทราบโดยเร็วที่สุด! ชื่นชมมากขอบคุณ!

อัปเดต:วิธีเดียวที่ฉันค้นพบในตอนนี้ก็คือการแก้ไขเคอร์เนลและมันใช้งานได้สำหรับฉันเมื่อปิดการใช้งาน swap (เช่น. CONFIG_SWAP is not set) แต่ไม่ได้ผลสำหรับคนอื่น ๆ ที่เปิดใช้งาน swap ดูเหมือนว่า ; ดูแพทช์ด้านในคำถามนี้


โปรดลบข้อความที่ไม่ถูกต้อง อย่าแท็กการแก้ไขด้วย "EDIT" ในข้อความ พวกเขาจะเห็นได้ชัดจากประวัติการแก้ไข
Kusalananda

1
@Kusalananda ผู้ใช้รายนี้ควรได้รับการสนับสนุนเนื่องจากเขาน่าจะเป็นผู้มีส่วนร่วมมากที่สุด
M89

@ Kusalananda ฉันคิดว่ามันเป็นสิ่งสำคัญที่จะรักษาพวกเขาไว้เพื่อให้คนอื่นเห็นว่ามีอะไรที่พยายามและไม่ได้ผล บางทีUPDATEแทนที่จะEDITดีกว่านี้ไหม

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

0

memory.minพารามิเตอร์ในcgroups-v2ควบคุมหน่วยความจำจะช่วยให้

คือให้ฉันพูด:

การป้องกันหน่วยความจำอย่างหนัก หากการใช้หน่วยความจำของ cgroup อยู่ในขอบเขตขั้นต่ำที่มีประสิทธิภาพหน่วยความจำของ cgroup จะไม่ถูกเรียกคืนภายใต้เงื่อนไขใด ๆ หากไม่มีหน่วยความจำที่สามารถเรียกคืนได้ซึ่งไม่มีการป้องกันตัวเรียกคืน OOM killer จะถูกเรียกใช้

ที่มา: https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html


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