閱讀388 返回首頁    go 小米 go 小米6


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主處理模式是單進程的。同時避免使用虛擬機。



最後更新:2017-05-08 10:31:37

  上一篇:go Redis開發運維實踐上線部署規劃之持久化設置
  下一篇:go Redis開發運維實踐上線部署規劃之服務器部署位置