我的訊息日誌中拋出以下報告:
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`
答案1
在此發生之前,核心將記錄一堆內容,但其中大部分可能不會記錄在 中/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。
- uid用戶身份。
- tgid線程組 ID。
- 總虛擬機器數虛擬記憶體使用(以 4 kB 頁為單位)
- RSS常駐記憶體使用(以 4 kB 頁為單位)
- nr_ptes頁表條目
- 交換貨幣交換條目
- oom_score_adj通常為 0;較低的數字表示呼叫 OOM Killer 時進程終止的可能性較小。
你基本上可以忽略nr_ptes
,swapents
儘管我相信這些是決定誰被殺的因素。這不一定是使用最多記憶體的進程,但很可能是。有關選擇過程的更多信息,看這裡。基本上,最終獲得最高 oom 分數的進程將被終止——這是「記憶體不足」行上報告的「分數」;不幸的是,其他分數沒有報告,但該表提供了一些因素方面的線索。
再說一次,這可能只會說明一個顯而易見的事實:系統記憶體不足並被mysqld
選擇死亡因為殺死它會釋放最多的資源。這並不一定意味著mysqld
做錯了什麼。您可以查看該表,看看當時是否有任何其他問題,但可能沒有任何明顯的罪魁禍首:系統可能會耗盡內存,僅僅是因為您錯誤判斷或錯誤配置了正在運行的進程。
答案2
關鍵在於訊息本身 -記憶體不足。當 Linux 核心缺乏虛擬記憶體(實體 RAM 加交換)時,它會開始殺死進程,而這正是這裡發生的情況。看起來mysqld
使用了超過 2GB 的虛擬記憶體。
系統有多少 RAM 和交換空間?我會考慮添加額外的內存,或者如果不可能的話,添加額外的交換空間。作為至少防止進程終止的快速修復,您可以新增交換文件。
更新:查看您擁有的 RAM 量,您可以立即看到問題所在。你有大約 1.6GB 的 RAM 和 100MB 的交換空間,但 MySQL 使用的 RAM 比這多得多。這解釋了為什麼您會看到進程被終止。