Redis Cannot allocate memory

問題描述

公司的產品架構在不同的區域有不同的主機配置,有些區域的 Redis 服務會出現 Can‘t save in background: fork: Cannot allocate memory 的錯誤,但是在其他區域的 Redis 服務卻沒有這個問題,這是因為 Redis 的記憶體配置不夠,所以會出現這個錯誤。

解決方法

在 /etc/sysctl.conf 中加入以下內容:

1
vm.overcommit_memory=1

然後執行,讓設定值生效:

1
$ sudo sysctl -p

參考資料

vm.overcommit_memory = 1
允許 overcommit 直接放行。系統完全不限制 process 分配虛擬記憶體空間,避免了 fork 可能產生的失敗,但由於 malloc 是先分配虛擬記憶體空間,而後通過中斷異常分配真正的物理記憶體,在記憶體不足的情況下,相當於完全屏蔽了 process 對系統記憶體狀態的感知,即 malloc 總是能成功,一旦記憶體不足會引起系統 OOM kill process,而 process 對於這種行為是無法預測的。