1. 程式人生 > 其它 >【Redis】Redis BGSAVE記憶體不足異常

【Redis】Redis BGSAVE記憶體不足異常

【Redis】Redis BGSAVE記憶體不足異常

專案不能正常登陸,檢查日誌發現是訪問Redis異常。

Handling error: RedisPipelineException, Pipeline contained one or more invalid commands; nested exception is io.lettuce.core.RedisCommandExecutionException: MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error

通過日誌,發現是Redis將快照儲存到硬碟上報錯。

將錯誤在瀏覽器上檢索一下,發現一種比較快速解決方法(治標不治本),先保障能夠正常訪問。

[root@HH]# redis-cli 
127.0.0.1:6379>config set stop-writes-on-bgsave-error no 

檢視 Redis日誌,顯示異常資訊如下

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.

結合上面專案中的日誌。報錯的根本原因:

Redis在fork子程序,把資料持久化到硬碟上時,系統分配不到足夠的記憶體給子程序。所有報錯。而使用stop-writes-on-bgsave-error no忽略此錯誤,讓Redis出來正常的請求。

設定vm.overcommit_memory意義

這時候就是記憶體不足,到了這裡,作業系統要怎麼辦,就要祭出我們的主角“overcommit_memory”引數了(/proc/sys/vm/overcommit_memory);

vm.overcommit_memory = 0 啟發策略
比較 此次請求分配的虛擬記憶體大小和系統當前空閒的實體記憶體加上swap,決定是否放行。系統在為應用程序分配虛擬地址空間時,會判斷當前申請的虛擬地址空間大小是否超過剩餘記憶體大小,如果超過,則虛擬地址空間分配失敗。因此,也就是如果程序本身佔用的虛擬地址空間比較大或者剩餘記憶體比較小時,fork、malloc等呼叫可能會失敗。

vm.overcommit_memory = 1 允許overcommit
直接放行,系統在為應用程序分配虛擬地址空間時,完全不進行限制,這種情況下,避免了fork可能產生的失敗,但由於malloc是先分配虛擬地址空間,而後通過異常陷入核心分配真正的實體記憶體,在記憶體不足的情況下,這相當於完全遮蔽了應用程序對系統記憶體狀態的感知,即malloc總是能成功,一旦記憶體不足,會引起系統OOM殺程序,應用程式對於這種後果是無法預測的。

vm.overcommit_memory = 2 禁止overcommit
根據系統記憶體狀態確定了虛擬地址空間的上限,由於很多情況下,程序的虛擬地址空間佔用遠大於其實際佔用的實體記憶體,這樣一旦記憶體使用量上去以後,對於一些動態產生的程序(需要複製父程序地址空間)則很容易建立失敗,如果業務過程沒有過多的這種動態申請記憶體或者建立子程序,則影響不大,否則會產生比較大的影響 。這種情況下系統所能分配的記憶體不會超過上面提到的CommitLimit大小,如果這麼多資源已經用光,那麼後面任何嘗試申請記憶體的行為都會返回錯誤,這通常意味著此時沒法執行任何新程式。
————————————————
版權宣告:本文為CSDN博主「朱清震」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/zqz_zqz/article/details/53384854

vim /etc/sysctl.conf
vm.overcommit_memory=1
sysctl -p
好學若飢,謙卑若愚