嘗試將相當大的資料夾 (450G) 備份到該伺服器中的 2TB 磁碟機時,該磁碟機僅作為備份目標rdiff-backup
(版本 1.2.8 - 最後標記為穩定的)導致內核恐慌。
系統:
Linux giorgio 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64 GNU/Linux
磁碟:2個1TB磁碟,軟體鏡像RAID模式,1個2TB磁碟專用於備份。
我有一個懷疑:伺服器上的記憶體是2G RAM + 2G swap = 4G。檔案大小最大為 16G。是否有可能rdiff-backup
在某個時刻將整個文件載入到記憶體中?
無論如何,內核恐慌不應該發生(因為 rdiff 進程被殺死?所以內存應該再次可用?),所以我想我的問題有兩個部分,一:關於我的懷疑,二:關於內核恐慌。
順便說一句,恐慌是最近開始的,相當多的備份已經成功——完整的和增量的——而且那些大GB檔案已經在那裡了。所以我猜這是新的 Debian 核心的錯誤而不是 rdiff-backup 的錯誤?
發生恐慌時的日誌檔案部分http://pastebin.com/e9a5fQdh
螢幕上的最後一件事:
編輯/更新:我剛剛嘗試創建一個 20GB 交換文件(使用 dd 來自 /dev/zero),伺服器再次關閉,對ping
.
從查看日誌來看:似乎內核已經殺死了一些進程 - 包括我懷疑導致這一切的進程(rdiff-backup) -但說「耗盡了可殺死的進程」。好像殺死進程並沒有釋放記憶體?
答案1
它沒有殺死 rdiff-backup,它應該有,但它oom_score_adj
是 -1000。
這是由 sshd 中的錯誤引起的。該錯誤已修復,但要到下一個版本 openssh 6.5 才能使用。
如果重新加載,sshd 無法將它創建的新 shell 的 oom_score_adj 設定回 0,導致透過 SSH 產生的所有子進程(因此您的 bash shell 和創建的任何子進程)的值為 -1000 oom_score_adj
,隨後可以佔用所有內存沒有oom-killer 殺死它們。
解決此問題的最快方法是(假設 7567 是 sshd 的 pid,就像您的情況一樣):-
- 跑步
echo 0 >/proc/7567/oom_adj_score
- 重新啟動 sshd。
不要重新載入 sshd,重新啟動它直到修復到位。 (openssh 6.5應該有)
該錯誤已在此處報告並修復。https://bugzilla.mindrot.org/show_bug.cgi?id=2156