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

2018-08-03 11:31 更新

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

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

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

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

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

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

使得fork()一條10G的進(jìn)程時(shí),因?yàn)镃OW策略而不一定需要有10G的free memory。

另外,記得關(guān)閉THP,這個(gè)默認(rèn)的Linux內(nèi)存頁(yè)面大小分配策略會(huì)導(dǎo)致RDB時(shí)出現(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)存到達(dá)時(shí),按照配置的Policy進(jìn)行處理, 默認(rèn)策略為volatile-lru,對(duì)設(shè)置了expire time的key進(jìn)行LRU清除(不是按實(shí)際expire time)。如果沒(méi)有數(shù)據(jù)設(shè)置了expire time或者policy為noeviction,則直接報(bào)錯(cuò),但此時(shí)系統(tǒng)仍支持get之類(lèi)的讀操作。 另外還有幾種policy,比如volatile-ttl按最接近expire time的,allkeys-lru對(duì)所有key都做LRU。注意在一般的緩存系統(tǒng)中,如果沒(méi)有設(shè)置超時(shí)時(shí)間,則lru的策略需要設(shè)置為allkeys-lru,并且應(yīng)用需要做好未命中的異常處理。特殊的,當(dāng)redis當(dāng)做DB時(shí),請(qǐng)使用noneviction策略,但是需要對(duì)系統(tǒng)內(nèi)存監(jiān)控加強(qiáng)粒度。

CPU不求核數(shù)多,但求主頻高,Cache大,因?yàn)閞edis主處理模式是單進(jìn)程的。同時(shí)避免使用虛擬機(jī)。


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)