ดีบักหน่วยความจำไม่เพียงพอด้วย / var / log / messages


42

รายงานต่อไปนี้จะถูกโยนลงในบันทึกข้อความของฉัน:

kernel: Out of memory: Kill process 9163 (mysqld) score 511 or sacrifice child
kernel: Killed process 9163, UID 27, (mysqld) total-vm:2457368kB, anon-rss:816780kB, file-rss:4kB

ไม่สำคัญว่าถ้าปัญหานี้คือสำหรับhttpd, mysqldหรือpostfixแต่ผมอยากรู้ว่าฉันสามารถดำเนินการต่อการแก้จุดบกพร่องปัญหา

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

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

# free -m

             total       used       free     shared    buffers     cached
Mem:          1655        934        721          0         10         52
-/+ buffers/cache:        871        784
Swap:          109          6        103`

ข้อความทั้งหมดเกี่ยวกับปัญหาปรากฏในdmesgอะไร
Stark07

รายละเอียดที่เป็นประโยชน์เกี่ยว OOM - linux-mm.org/OOM_Killer
slm

คำตอบ:


57

เคอร์เนลจะบันทึกสิ่งต่าง ๆ ไว้ก่อนที่สิ่งนี้จะเกิดขึ้น แต่ส่วนใหญ่มันอาจจะไม่อยู่ใน/var/log/messagesนั้นขึ้นอยู่กับการ(r)syslogdกำหนดค่าของคุณ ลอง:

grep oom /var/log/*
grep total_vm /var/log/*

อดีตควรปรากฏขึ้นหลายครั้งและหลังในเพียงหนึ่งหรือสองแห่ง นั่นคือไฟล์ที่คุณต้องการดู

ค้นหาบรรทัด "หน่วยความจำไม่พอ" ต้นฉบับในไฟล์ใดไฟล์หนึ่งที่มีtotal_vmอยู่ด้วย สามสิบวินาทีถึงนาที (อาจมากกว่าหรือน้อยกว่า) ก่อนถึงบรรทัดนั้นคุณจะพบสิ่งต่อไปนี้:

kernel: foobar invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0

คุณควรหาตารางที่อยู่ระหว่างบรรทัดนั้นกับบรรทัด "หน่วยความจำไม่พอ" ที่มีส่วนหัวดังนี้:

[ pid ]   uid  tgid total_vm      rss nr_ptes swapents oom_score_adj name

สิ่งนี้อาจไม่บอกอะไรคุณได้มากกว่าที่คุณเคยรู้มาบ้าง แต่มีหลายสาขาที่:

  • pid ID กระบวนการ
  • ID ผู้ใช้uid
  • tgid ID กลุ่มกลุ่มข้อความ
  • total_vmใช้หน่วยความจำเสมือน (ใน 4 kB หน้า)
  • rssใช้หน่วยความจำแบบ Resident (ใน 4 kB หน้า)
  • nr_ptesรายการตารางหน้า
  • swapentsสลับรายการ
  • oom_score_adjปกติ 0; จำนวนที่ต่ำกว่าบ่งชี้ว่ากระบวนการจะมีโอกาสน้อยที่จะตายเมื่อมีการเรียกใช้ OOM killer

คุณส่วนใหญ่สามารถเพิกเฉยnr_ptesและswapentsแม้ว่าฉันเชื่อว่าสิ่งเหล่านี้เป็นปัจจัยในการพิจารณาว่าใครถูกฆ่า นี่ไม่จำเป็นต้องเป็นกระบวนการที่ใช้หน่วยความจำส่วนใหญ่ แต่เป็นไปได้มากว่า สำหรับข้อมูลเพิ่มเติมเกี่ยวกับขั้นตอนการเลือกดูที่นี่ โดยพื้นฐานแล้วกระบวนการที่ลงท้ายด้วยคะแนน oom สูงสุดจะถูกฆ่า - นั่นคือ "คะแนน" ที่รายงานในบรรทัด "หน่วยความจำไม่พอ"; น่าเสียดายที่คะแนนอื่น ๆ ไม่ได้รายงาน แต่ตารางนั้นให้เบาะแสบางอย่างในแง่ของปัจจัย

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


5
dmesgนี่คือสิ่งที่รับประกันได้ว่าเป็น มันจะอยู่ใน/var/logถ้า syslog daemon อ่านจาก/dev/kmsg(ซึ่งมักจะทำ)
Patrick

2
@ แพทริคนั้นขึ้นอยู่กับว่าคุณจะไปดูเมื่อไหร่ ถ้ามันถูกบันทึกในหนึ่งในบันทึกไฟล์ปกติ (ควรหรือคุณทำอะไรโง่ ๆ กับคนตัดไม้) มันจะอยู่ที่นั่นเป็นเวลานานโดย ณ จุดนี้ถ้า OP ต้องการวินิจฉัยปัญหาที่เกิดขึ้น เมื่อวานนี้หรือวันก่อนเป็นต้นบันทึกอาจไม่ได้อยู่dmesgอีกต่อไปแม้ว่าระบบจะยังคงทำงานอยู่
goldilocks

6

กุญแจสำคัญในการนี้อยู่ในข้อความของตัวเอง - หน่วยความจำ เมื่อเคอร์เนลลินุกซ์ได้รับความหิวโหยของหน่วยความจำเสมือน (RAM จริงบวกกับการแลกเปลี่ยน) มันจะเริ่มฆ่ากระบวนการและนั่นคือสิ่งที่เกิดขึ้นตรงนี้ ดูเหมือนว่าmysqldใช้หน่วยความจำเสมือนมากกว่า 2GB

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

อัปเดต:ดูจำนวน RAM ที่คุณมีคุณสามารถเห็นปัญหาได้ทันที คุณมี RAM ~ 1.6GB และการแลกเปลี่ยน 100MB แต่ MySQL ใช้ RAM มากกว่านั้น นั่นอธิบายว่าทำไมคุณถึงเห็นกระบวนการถูกยกเลิก


total used free shared buffers cached Mem: 1655 934 721 0 10 52 -/+ buffers/cache: 871 784 Swap: 109 6 103 นี่คือเอาต์พุตหน่วยความจำในเวลาเดียวกันเมื่อกระบวนการถูกฆ่า
ibedelovski

คุณสามารถวางสิ่งนั้นลงในข้อความต้นฉบับโดยยังคงรูปแบบไว้ได้หรือไม่? จะทำให้อ่านง่ายขึ้น
mjturner

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