Kernel sẽ ghi lại một loạt các thứ trước khi điều này xảy ra, nhưng hầu hết trong số đó có thể sẽ không ở trong /var/log/messages
, tùy thuộc vào cách (r)syslogd
cấu hình của bạn . Thử:
grep oom /var/log/*
grep total_vm /var/log/*
Cái trước sẽ xuất hiện một loạt các lần và cái sau chỉ ở một hoặc hai nơi. Đó là tập tin bạn muốn xem.
Tìm dòng "Hết bộ nhớ" ban đầu trong một trong các tệp cũng chứa total_vm
. Ba mươi giây đến một phút (có thể nhiều hơn, có thể ít hơn) trước khi dòng đó bạn sẽ tìm thấy một cái gì đó như:
kernel: foobar invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0
Bạn cũng nên tìm một bảng ở đâu đó giữa dòng đó và dòng "Hết bộ nhớ" với các tiêu đề như thế này:
[ pid ] uid tgid total_vm rss nr_ptes swapents oom_score_adj name
Điều này có thể không cho bạn biết nhiều hơn những gì bạn đã biết, nhưng các trường là:
- pid ID tiến trình.
- uid User ID.
- tgid ID nhóm chủ đề.
- Total_vm Sử dụng bộ nhớ ảo (trong 4 trang kB)
- rss Sử dụng bộ nhớ thường trú (trong 4 trang kB)
- nr_ptes Mục trang bảng
- swapents Trao đổi mục
- oom_score_adj Thường là 0; một con số thấp hơn cho thấy quá trình sẽ ít có khả năng chết hơn khi kẻ giết OOM được gọi.
Bạn hầu như có thể bỏ qua nr_ptes
và swapents
mặc dù tôi tin rằng đây là những yếu tố quyết định ai sẽ bị giết. Đây không nhất thiết là quá trình sử dụng nhiều bộ nhớ nhất, nhưng rất có khả năng là vậy. Để biết thêm về quá trình lựa chọn, xem tại đây . Về cơ bản, quá trình kết thúc với số điểm oom cao nhất sẽ bị giết - đó là "điểm số" được báo cáo trên dòng "Hết bộ nhớ"; Thật không may, các điểm số khác không được báo cáo nhưng bảng đó cung cấp một số manh mối về các yếu tố.
Một lần nữa, điều này có lẽ sẽ không làm được gì nhiều ngoài việc làm sáng tỏ điều hiển nhiên: hệ thống hết bộ nhớ và mysqld
được chọn chết vì giết nó sẽ giải phóng nhiều tài nguyên nhất . Điều này không cần thiết có nghĩa mysqld
là làm bất cứ điều gì sai. Bạn có thể nhìn vào bảng để xem liệu có bất cứ điều gì khác xảy ra vào thời điểm đó không, nhưng có thể không có thủ phạm rõ ràng nào: hệ thống có thể hết bộ nhớ chỉ vì bạn đánh giá sai hoặc định cấu hình sai các quy trình đang chạy.
dmesg
?