安裝 Redis 后,默認配置下啟動會得到如下日志:
[3077] 05 Sep 10:01:54.181 # 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.
該輸出信息大致的意思是: overcommit_memory 值目前設置為 0 !在可用內存比較少時,后台執行的 save 命令可能會失敗。為了修復該問題,需要添加 'vm.overcommit_memory = 1' 到 /etc/sysctl.conf 文件中,並 通過 重啟系統或執行 'cysctl vm.overcommit_memory=1' 命令使得該配置生效。
網絡對於上面vm.overcommit_memory的值解釋:
0, 表示內核將檢查是否有足夠的可用內存供應用進程使用;如果有足夠的可用內存,則允許內存申請;否則,內存申請失敗,並把錯誤返回給應用進程。 1, 表示內核允許分配所有的物理內存,而不管當前的內存狀態如何。 2, 表示內核允許分配超過所有物理內存和交換空間總和的內存
Redis的數據回寫機制分同步和異步兩種:
- 同步回寫即SAVE命令,主進程直接向磁盤回寫數據。在數據大的情況下會導致系統假死很長時間,所以一般不是推薦的。
- 異步回寫即BGSAVE命令,主進程fork后,復制自身並通過這個新的進程回寫磁盤,回寫結束后新進程自行關閉。由於這樣做不需要主進程阻塞,系統不會假死,一般默認會采用這個方法。
找到原因之后,直接修改/etc/sysctl.conf內核參數
vm.overcommit_memory= 1 sysctl -p ##生效配置