เคอร์เนลจะบันทึกสิ่งต่าง ๆ ไว้ก่อนที่สิ่งนี้จะเกิดขึ้น แต่ส่วนใหญ่มันอาจจะไม่อยู่ใน/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
จะทำอะไรผิด คุณสามารถดูตารางเพื่อดูว่ามีอะไรอื่นหลุดพ้นไปตามเวลาหรือไม่ แต่อาจไม่มีผู้ร้ายคนใดที่ชัดเจน: ระบบสามารถเรียกใช้หน่วยความจำไม่เพียงพอเพียงเพราะคุณทำผิดหรือกำหนดค่ากระบวนการที่กำลังทำงานผิด
dmesg
อะไร