Redis 是一個高效能的記憶體數據庫,常用於快取快存、資料緩存,以及快速依譜等報錯。而在 Redis 啟動時,如果看到一個警告訊息:
WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition.
那麼表示你所在的 Linux 系統,目前沒有啟用「記憶體超額分配 (overcommit_memory)」功能,這會帶來較高風險。以下將詳細解釋原因,以及如何解決。
問題原因
Redis 需要對記憶體有較高度的控制權,在執行背景儲存 (background save)或複製 (replication) 時,會用 fork() 複製一個記憶體存備。
如果 Linux 系統的 vm.overcommit_memory
設為 0 (預設),會根據數字系統內部算法判斷是否允許分配記憶體,有機率會導致 Redis fork 失敗,最終造成儲存或複製失敗,並帶來數據存取完整性的問題。
而即使記憶體不缺,在特定條件下,也會出現失敗,不是總是與記憶體剩餘相關。
解決方法
1.快速修正 (重啟就失效)
使用 sysctl
指令直接轉換設定:
sudo sysctl vm.overcommit_memory=1
這個設定會立即生效,但重開機後會回到預設值。
2.永久生效設定
編輯 /etc/sysctl.conf
,加入一行:
vm.overcommit_memory=1
然後套用設定:
sudo sysctl -p
或重開機使設定生效。
如此一來,Redis 就會在啟動時不再警告,而背景儲存或複製更加穩定。
附加知識:vm.overcommit_memory
說明
設定值 | 意義 |
0 | Linux 根據內部算法決定是否允許分配記憶體 (預設) |
1 | 總是允許請求,不考慮目前記憶體狀態 |
2 | 只允許有註明不保留記憶體計劃的請求 |
Redis 定記建議使用 vm.overcommit_memory=1
,最適合 Redis 性質,並能最大限度保護數據存取完整性。
結論
遇到 Redis 啟動時出現「WARNING Memory overcommit must be enabled」,並不是總是緊急的問題,但為了保障系統不會因為一個 fork 失敗而造成 Redis 數據失蹤,將 vm.overcommit_memory
設成 1 是很重要的操作。