【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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM