Redis 內(nèi)存碎片原因及清理
一、Redis 內(nèi)存碎片
內(nèi)存碎片是指在內(nèi)存分配的時候,產(chǎn)生的不能重復(fù)利用的空間。例如,內(nèi)存空間還有3K,應(yīng)用程序想申請連續(xù)的3K空間,雖然內(nèi)存空間夠,但是空間分配為2K,1K,總空間夠,但是不連續(xù),導致應(yīng)用程序申請失敗,這種無法利用的內(nèi)存空間稱之為"內(nèi)存碎片"。內(nèi)存分片會占用操作系統(tǒng)分配給redis的內(nèi)存空間,嚴重影響redis性能。
二、內(nèi)存碎片形成原因
1.內(nèi)因
內(nèi)存分片策略引發(fā):redis默認使用jemalloc分配器分配內(nèi)存。jemalloc每次分配2*N固定空間,例如寫入數(shù)據(jù)申請10K空間,jemalloc會分配16K空間,優(yōu)點:下次寫入>=6K數(shù)據(jù)不需要申請內(nèi)存空間,缺點造成內(nèi)存浪費。
2.外因
修改內(nèi)存中數(shù)據(jù):修改包括增加和減少內(nèi)存占用,例如原來的16K空間數(shù)據(jù),增加或減少1K都會造成內(nèi)存浪費。大量內(nèi)存碎片的存在,會造成redis實際內(nèi)存使用率降低,影響性能。
三、查看內(nèi)存碎片
info memory 查看redis內(nèi)存使用情況,主要關(guān)注以下參數(shù)
used_memory: redis分配的內(nèi)存總量單位為b
used_memory_human: redis分配的內(nèi)存總量單位為M
used_memory_rss: redis向操作系統(tǒng)申請的內(nèi)存總量單位為b
used_memory_rss_human: redis向操作系統(tǒng)申請的內(nèi)存總量單位為M
mem_fragmentation_ratio: 內(nèi)存碎片率
mem_allocator:jemalloc-5.1.0 內(nèi)存分配器
mem_fragmentation_ratio計算公式為:used_memory_rss/used_memory 該值大于1但小于1.5。這種情況是合理的。該值過高時考慮清理內(nèi)存,例如該值大于1.5表示有50%空間浪費,需要清理內(nèi)存碎片。
四、內(nèi)存碎片清理
內(nèi)存碎片清理,就是將不連續(xù)的內(nèi)存空間重新整理為連續(xù)空間,由于redis是單線程,在清理過程中會造成堵塞,降低性能??赏ㄟ^以下三種方式清理:
1.手動清理內(nèi)存碎片
memory purge 只支持jemalloc內(nèi)存分配器
2.自動清理
修改redis.conf配置文件
activedefrag yes 開啟自動清理內(nèi)存碎片,命令開啟:config set activedefrag yes active-defrag-ignore-bytes 100mb 內(nèi)存碎片的字節(jié)數(shù)達到100M時開始清理 active-defrag-threshold-lower 10 內(nèi)存碎片空間占操作系統(tǒng)分配給redis的總空間比例達到 10% 時開始清理 active-defrag-ignore-bytes與active-defrag-threshold-lower 兩個條件同時滿足會觸發(fā)內(nèi)存碎片清理,當有一個不滿足則停止清理 active-defrag-threshold-upper 100 內(nèi)存碎片超過 100%,則盡最大努力整理 active-defrag-cycle-min 1 自動清理過程所用CPU時間的比例不低于1%,保證能正常清理 active-defrag-cycle-max 25 自動清理過程所用CPU時間的比例不高于25%,超過25%停止清理,避免redis主線程阻塞 active-defrag-max-scan-fields 1000 自動清理過程中長度小于1000的set/hash/zset/list才會進行自動清理
----以上參數(shù)默認注釋----
3.重啟redis
到此這篇關(guān)于Redis 內(nèi)存碎片原因及清理的文章就介紹到這了,更多相關(guān)Redis 內(nèi)存碎片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis?緩存淘汰策略和事務(wù)實現(xiàn)樂觀鎖詳情
這篇文章主要介紹了Redis緩存淘汰策略和事務(wù)實現(xiàn)樂觀鎖詳情,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下2022-07-07Redis02 使用Redis數(shù)據(jù)庫(String類型)全面解析
這篇文章主要介紹了Redis02 使用Redis數(shù)據(jù)庫(String類型)全面解析的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-07-07Redis數(shù)據(jù)庫的使用場景介紹(避免誤用Redis)
這篇文章主要介紹了Redis數(shù)據(jù)庫的使用場景介紹(避免誤用Redis),本文用簡要的語言總結(jié)了Redis數(shù)據(jù)庫的適應(yīng)場合,人而避免錯誤的使用它而產(chǎn)生昂貴的維護代價,需要的朋友可以參考下2015-03-03Redis數(shù)據(jù)庫分布式設(shè)計方案介紹
大家好,本篇文章主要講的是Redis數(shù)據(jù)庫分布式設(shè)計方案介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01