天天看點

Redis開發運維實踐上線部署規劃之記憶體規劃5.1 記憶體、CPU規劃

一定要設定最大記憶體maxmemory參數,否則實體記憶體用爆了就會大量使用swap,寫rdb檔案時的速度很慢。注意這個參數指的是info中的used_memory,在一些不利于jmalloc的時候,記憶體碎片會很大。

多留55%記憶體是最安全的。重寫aof檔案和rdb檔案的程序(即使不做持久化,複制到slave的時候也要寫rdb)會fork出一條新程序來,采用了作業系統的copy-on-write政策(子程序與父程序共享page。如果父程序的page-每頁4k有修改,父程序自己建立那個page的副本,不會影響到子程序)。

另外,需要考慮記憶體碎片,假設碎片為1.2,則如果機器為64g,那麼64*45%/1.2 = 24g作為maxmemory是比較安全的規劃。

留意console打出來的報告,如"rdb: 1215 mb of memory used by copy-on-write"。在系統極度繁忙時,如果父程序的所有page在子程序寫rdb過程中都被修改過了,就需要兩倍記憶體。

按照redis啟動時的提醒,設定

使得fork()一條10g的程序時,因為cow政策而不一定需要有10g的free memory。

另外,記得關閉thp,這個預設的linux記憶體頁面大小配置設定政策會導緻rdb時出現巨大的latency和巨大的記憶體占用。關閉方法為:

當最大記憶體到達時,按照配置的policy進行處理, 預設政策為volatile-lru,對設定了expire time的key進行lru清除(不是按實際expire time)。如果沒有資料設定了expire time或者policy為noeviction,則直接報錯,但此時系統仍支援get之類的讀操作。 另外還有幾種policy,比如volatile-ttl按最接近expire time的,allkeys-lru對所有key都做lru。注意在一般的緩存系統中,如果沒有設定逾時時間,則lru的政策需要設定為allkeys-lru,并且應用需要做好未命中的異常處理。特殊的,當redis當做db時,請使用noneviction政策,但是需要對系統記憶體監控加強粒度。

cpu不求核數多,但求主頻高,cache大,因為redis主處理模式是單程序的。同時避免使用虛拟機。

<b>redis開發運維實踐指南</b>

<b>本文為《redis開發運維實踐指南》内容,該書作者為黃鵬程,已授權雲栖社群轉載。</b>

繼續閱讀