2017-02-28 58 views
4

我有兩臺運行在同一臺機器上的redis服務器。第二個的日誌文件與通知幾個實例,如這些:無法在後臺保存(redis-server)

[50818] 19 Feb 06:41:05.007 * 10 changes in 300 seconds. Saving... 
[50818] 19 Feb 06:41:05.007 # Can't save in background: fork: Cannot allocate memory 

相比之下,第一個日誌文件僅包含成功DB撲救。如果我內存不足,我認爲兩者都會有類似的日誌。它讓我困惑,只有一個人有這個問題,另一個沒有。任何線索?

此外,研究導致我到this blog post,它爭辯說,如果我在命令行上執行sysctl vm.overcommit_memory=1,問題可以改善。沒有解釋如何幫助。有人可以在redis的背景下解釋這裏發生了什麼嗎?

+4

可能重複[redis bgsave失敗,因爲fork無法分配內存](http://stackoverflow.com/questions/11752544/redis-bgsave-failed-because-fork-cannot-allocate-memory) – kennytm

回答

14

Redis FAQs

背景節約用叉子失敗()Linux下的錯誤,即使我有很多的空閒內存!

簡短的回答:echo 1 > /proc/sys/vm/overcommit_memory :)

現在長一個:

Redis的背景節能模式依賴於寫入時複製語義在現代操作系統 叉:Redis的叉子(創建一個孩子 進程),這是父母的確切副本。子進程在磁盤上轉儲數據庫 並最終退出。從理論上講,孩子應該使用大量內存作爲副本,但實際上要感謝大多數現代操作系統 實現的寫入時複製語義,父進程和子進程將共享公用內存頁面。一個 頁面僅在其子代或 父級中發生更改時纔會被複制。由於理論上所有頁面可能會改變,而子進程正在保存,Linux無法預先告知子進程需要多少內存,所以如果overcommit_memory設置爲零, fork將會失敗,除非有這麼多根據需要釋放內存以真正地 複製所有父內存頁面,結果如果您的 具有3 GB的Redis數據集並且只有2 GB的空閒內存,則會導致 失敗。將overcommit_memory設置爲1表示Linux將以更樂觀的分配方式放鬆並執行 分叉,而這的確是 Redis所需的。

的良好來源,瞭解Linux虛擬內存的工作和其他 替代品overcommit_memoryovercommit_ratio是如何從紅帽雜誌這個 經典,「瞭解虛擬內存」。當心, 這篇文章有1和2配置值爲overcommit_memory 顛倒過來:請參閱proc(5)手冊頁的正確含義爲 的可用值。