本文轉載:https://blog.csdn.net/han_cui/article/details/54767208?tdsourcetag=s_pcqq_aiomsg
解決 Redis 只讀不可寫的問題
在 Redis 終端上進行讀寫操作,發現只讀不可寫,GET 操作是正常的,SET 操作提示錯誤:(error)MISCONF Redis is configured to save RDB snapshots,but is currently not able to persist on disk. Commands that may modify the data set are disabled. 如圖所示:
原因:
Redis 在保存數據到硬盤時為了避免主進程假死,需要 Fork 一份主進程,然后在 Fork 進程內完成數據保存到硬盤的操作,如果主進程使用了 4 GB 的內存,Fork 子進程的時候需要額外的 4 GB,此時內存就不夠了,Fork 失敗,進而數據保存硬盤也失敗了。
Linux 內核會根據參數 vm.overcommit_memory 參數的設置決定是否放行。
如果 vm.overcommit_memory = 1,直接放行。
vm.overcommit_memory = 0:則比較此次請求分配的虛擬內存大小和系統當前空閑的物理內存加上swap,決定是否放行。
vm.overcommit_memory = 2:則會比較 進程所有已分配的虛擬內存加上此次請求分配的虛擬內存和系統當前的空閑物理內存加上 swap,決定是否放行。
如圖提示這個錯誤:
[13223] 17 Mar 13:18:02.207 # 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.
錯誤提示明確說明了解決辦法,也是設置 vm.overcommit_memory=1.
Redis內核參數overcommit_memory
它是內存分配策略可選值:0、1、2。
0表示內核將檢查是否有足夠的可用內存供應用進程使用;如果有足夠的可用內存,內存申請允許;否則,內存申請失敗,並把錯誤返回給應用進程。
1表示內核允許分配所有的物理內存,而不管當前的內存狀態如何。
2表示內核允許分配超過所有物理內存和交換空間總和的內存