標籤:
串連reids擷取資料時提示
Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands t
網上搜尋資料http://www.cnblogs.com/qq78292959/p/3994349.html提示
在在/etc/sysctl.conf 添加一項 ‘vm.overcommit_memory = 1‘ 重啟or 運行命令‘sysctl vm.overcommit_memory=1‘
問題解決。
追究緣由:
簡單地說:Redis在儲存資料到硬碟時為了避免主進程假死,需要Fork一份主進程,然後在Fork進程內完成資料儲存到硬碟的操作,如果主進程使用了4GB的記憶體,Fork子進程的時候需要額外的4GB,此時記憶體就不夠了,Fork失敗,進而資料儲存硬碟也失敗了。
Redis的資料丟失問題
網址:http://www.linuxidc.com/Linux/2012-07/66079.htm
Redis的資料回寫機制分同步和非同步兩種
同步回寫即SAVE命令,主進程直接向磁碟回寫資料。在資料大的情況下會導致系統假死很長時間,所以一般不是推薦的。非同步回寫即BGSAVE命令,主進程fork後,複製自身並通過這個新的進程回寫磁碟,回寫結束後新進程自行關閉。由於這樣做不需要主進程阻塞,系統不會假死,一般預設會採用這個方法。
個人感覺方法2採用fork主進程的方式很拙劣,但似乎是唯一的方法。記憶體中的熱資料隨時可能修改,要在磁碟上儲存某個時間的記憶體鏡像必須要凍結。凍結就會導致假死。fork一個新的進程之後等於複製了當時的一個記憶體鏡像,這樣主進程上就不需要凍結,只要子進程上操作就可以了。
在小記憶體的進程上做一個fork,不需要太多資源,但當這個進程的記憶體空間以G為單位時,fork就成為一件很恐怖的操作。何況在16G記憶體的主機上fork 14G記憶體的進程呢?肯定會報記憶體無法分配的。更可氣的是,越是改動頻繁的主機上fork也越頻繁,fork操作本身的代價恐怕也不會比假死好多少。
找到原因之後,直接修改核心參數vm.overcommit_memory = 1
Linux核心會根據參數vm.overcommit_memory參數的設定決定是否允許存取。
如果 vm.overcommit_memory = 1,直接允許存取vm.overcommit_memory = 0:則比較 此次請求分配的虛擬記憶體大小和系統當前閒置實體記憶體加上swap,決定是否允許存取。vm.overcommit_memory = 2:則會比較 進程所有已指派的虛擬記憶體加上此次請求分配的虛擬記憶體和系統當前的空閑實體記憶體加上swap,決定是否允許存取。
redis-記憶體異常 Redis is configured to save RDB snapshots解決