天天看點

REDIS持久化報錯失敗

redis log報錯:

[7666] 15 Jan 00:22:36.028 # Error moving temp DB file on the final destination: Invalid cross-device link

[1937] 15 Jan 00:22:36.513 # Background saving error

[1937] 15 Jan 00:22:36.614 * 1 changes in 900 seconds. Saving...

[7679] 15 Jan 00:27:15.659 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

[7679] 15 Jan 00:27:35.287 * DB loaded from disk: 19.629 seconds

處理方案:

根據提示,在配置檔案/etc/sysctl.conf中加入:

vm.overcommit_memory=1

重新開機REDIS即可

關于overcommit_memory說明:

取值為0,系統在為應用程序配置設定虛拟位址空間時,會判斷目前申請的虛拟位址空間大小是否超過剩餘記憶體大小,如果超過,則虛拟位址空間配置設定失敗。是以,也就是如果程序本身占用的虛拟位址空間比較大或者剩餘記憶體比較小時,fork、malloc等調用可能會失敗。

取值為1,系統在為應用程序配置設定虛拟位址空間時,完全不進行限制,這種情況下,避免了fork可能産生的失敗,但由于malloc是先配置設定虛拟位址空間,而後通過異常陷入核心配置設定真正的實體記憶體,在記憶體不足的情況下,這相當于完全屏蔽了應用程序對系統記憶體狀态的感覺,即malloc總是能成功,一旦記憶體不足,會引起系統OOM殺程序,應用程式對于這種後果是無法預測的

取值為2,則是根據系統記憶體狀态确定了虛拟位址空間的上限,由于很多情況下,程序的虛拟位址空間占用遠大小其實際占用的實體記憶體,這樣一旦記憶體使用量上去以後,對于一些動态産生的程序(需要複制父程序位址空間)則很容易建立失敗,如果業務過程沒有過多的這種動态申請記憶體或者建立子程序,則影響不大,否則會産生比較大的影響

學習時的痛苦是暫時的 未學到的痛苦是終生的

繼續閱讀