W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
一定要設(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ī)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: