Laporan berikut dimasukkan ke dalam log pesan saya:
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
Tidak masalah jika masalah ini untuk httpd
, mysqld
atau postfix
tetapi saya ingin tahu bagaimana saya bisa melanjutkan debug masalah.
Bagaimana saya bisa mendapatkan lebih banyak info tentang mengapa PID 9163 terbunuh dan saya tidak yakin apakah linux menyimpan sejarah untuk PID yang dihentikan di suatu tempat.
Jika ini terjadi di file log pesan Anda, bagaimana Anda akan memecahkan masalah ini langkah demi langkah?
# free -m
total used free shared buffers cached
Mem: 1655 934 721 0 10 52
-/+ buffers/cache: 871 784
Swap: 109 6 103`
linux
logs
memory
out-of-memory
ibedelovski
sumber
sumber
dmesg
?Jawaban:
Kernel akan mencatat banyak hal sebelum ini terjadi, tetapi sebagian besar mungkin tidak akan masuk
/var/log/messages
, tergantung pada bagaimana Anda(r)syslogd
dikonfigurasikan. Mencoba:Yang pertama harus muncul beberapa kali dan yang terakhir hanya di satu atau dua tempat. Itu adalah file yang ingin Anda lihat.
Temukan baris "Kehabisan memori" asli di salah satu file yang juga berisi
total_vm
. Tiga puluh detik hingga satu menit (bisa lebih banyak, bisa lebih sedikit) sebelum garis itu Anda akan menemukan sesuatu seperti:Anda juga harus menemukan tabel di suatu tempat antara garis itu dan garis "Kehabisan memori" dengan header seperti ini:
Ini mungkin tidak memberi tahu Anda lebih dari yang Anda tahu, tetapi bidangnya adalah:
Anda sebagian besar dapat mengabaikan
nr_ptes
danswapents
meskipun saya percaya ini adalah faktor dalam menentukan siapa yang terbunuh. Ini belum tentu proses menggunakan sebagian besar memori, tetapi sangat mungkin. Untuk lebih lanjut tentang proses seleksi, lihat di sini . Pada dasarnya, proses yang berakhir dengan skor oom tertinggi terbunuh - itulah "skor" yang dilaporkan pada baris "Kehabisan memori"; sayangnya skor lainnya tidak dilaporkan tetapi tabel itu memberikan beberapa petunjuk dalam hal faktor.Sekali lagi, ini mungkin tidak akan melakukan lebih dari menerangi yang sudah jelas: sistem kehabisan memori dan
mysqld
dipilih untuk mati karena membunuh itu akan melepaskan sebagian besar sumber daya . Ini tidak perlu berartimysqld
melakukan kesalahan. Anda dapat melihat tabel untuk melihat apakah ada hal lain yang keluar dari jalur pada saat itu, tetapi mungkin tidak ada penyebab yang jelas: sistem dapat kehabisan memori hanya karena Anda salah menilai atau salah mengkonfigurasi proses yang sedang berjalan.sumber
dmesg
Di sinilah dijamin. Itu hanya akan ada/var/log
jika daemon syslog membaca dari/dev/kmsg
(yang biasanya memang demikian).dmesg
lagi bahkan jika sistem dibiarkan berjalan.Kunci untuk ini ada di dalam pesan itu sendiri - Kehabisan memori . Ketika kernel Linux kekurangan memori virtual (RAM fisik plus swap), kernel itu akan mulai mematikan proses dan itulah yang terjadi di sini. Sepertinya
mysqld
menggunakan lebih dari 2GB memori virtual.Berapa banyak RAM dan swap yang dimiliki sistem? Saya akan mempertimbangkan untuk menambahkan RAM ekstra atau, jika itu tidak mungkin, menambahkan swap tambahan. Sebagai perbaikan cepat untuk setidaknya mencegah proses dihentikan Anda bisa menambahkan file swap.
Pembaruan: Melihat jumlah RAM yang Anda miliki, Anda dapat langsung melihat masalahnya. Anda memiliki ~ 1,6GB RAM dan 100MB swap namun MySQL menggunakan lebih banyak RAM daripada itu. Itu menjelaskan mengapa Anda melihat proses dihentikan.
sumber
total used free shared buffers cached Mem: 1655 934 721 0 10 52 -/+ buffers/cache: 871 784 Swap: 109 6 103
ini adalah output memori pada saat yang sama ketika proses itu dibunuh