redis-記憶體異常 Redis is configured to save RDB snapshots解決

來源:互聯網
上載者:User

標籤:

串連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解決

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.