Redis 內(nèi)存、CPU規(guī)劃

2018-08-03 11:31 更新

一定要設(shè)置最大內(nèi)存maxmemory參數(shù),否則物理內(nèi)存用爆了就會大量使用Swap,寫RDB文件時的速度很慢。注意這個參數(shù)指的是info中的used_memory,在一些不利于jmalloc的時候,內(nèi)存碎片會很大。

多留55%內(nèi)存是最安全的。重寫AOF文件和RDB文件的進程(即使不做持久化,復(fù)制到Slave的時候也要寫RDB)會fork出一條新進程來,采用了操作系統(tǒng)的Copy-On-Write策略(子進程與父進程共享Page。如果父進程的Page-每頁4K有修改,父進程自己創(chuàng)建那個Page的副本,不會影響到子進程)。

另外,需要考慮內(nèi)存碎片,假設(shè)碎片為1.2,則如果機器為64G,那么64*45%/1.2 = 24G作為maxmemory是比較安全的規(guī)劃。

留意Console打出來的報告,如"RDB: 1215 MB of memory used by copy-on-write"。在系統(tǒng)極度繁忙時,如果父進程的所有Page在子進程寫RDB過程中都被修改過了,就需要兩倍內(nèi)存。

按照Redis啟動時的提醒,設(shè)置

echo "vm.overcommit_memory = 1" >>  /etc/sysctl.conf

使得fork()一條10G的進程時,因為COW策略而不一定需要有10G的free memory。

另外,記得關(guān)閉THP,這個默認的Linux內(nèi)存頁面大小分配策略會導(dǎo)致RDB時出現(xiàn)巨大的latency和巨大的內(nèi)存占用。關(guān)閉方法為:

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

當(dāng)最大內(nèi)存到達時,按照配置的Policy進行處理, 默認策略為volatile-lru,對設(shè)置了expire time的key進行LRU清除(不是按實際expire time)。如果沒有數(shù)據(jù)設(shè)置了expire time或者policy為noeviction,則直接報錯,但此時系統(tǒng)仍支持get之類的讀操作。 另外還有幾種policy,比如volatile-ttl按最接近expire time的,allkeys-lru對所有key都做LRU。注意在一般的緩存系統(tǒng)中,如果沒有設(shè)置超時時間,則lru的策略需要設(shè)置為allkeys-lru,并且應(yīng)用需要做好未命中的異常處理。特殊的,當(dāng)redis當(dāng)做DB時,請使用noneviction策略,但是需要對系統(tǒng)內(nèi)存監(jiān)控加強粒度。

CPU不求核數(shù)多,但求主頻高,Cache大,因為redis主處理模式是單進程的。同時避免使用虛擬機。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號