Redis 內(nèi)存碎片原因及清理
一、Redis 內(nèi)存碎片
內(nèi)存碎片是指在內(nèi)存分配的時(shí)候,產(chǎn)生的不能重復(fù)利用的空間。例如,內(nèi)存空間還有3K,應(yīng)用程序想申請連續(xù)的3K空間,雖然內(nèi)存空間夠,但是空間分配為2K,1K,總空間夠,但是不連續(xù),導(dǎo)致應(yīng)用程序申請失敗,這種無法利用的內(nèi)存空間稱之為"內(nèi)存碎片"。內(nèi)存分片會(huì)占用操作系統(tǒng)分配給redis的內(nèi)存空間,嚴(yán)重影響redis性能。
二、內(nèi)存碎片形成原因
1.內(nèi)因
內(nèi)存分片策略引發(fā):redis默認(rèn)使用jemalloc分配器分配內(nèi)存。jemalloc每次分配2*N固定空間,例如寫入數(shù)據(jù)申請10K空間,jemalloc會(huì)分配16K空間,優(yōu)點(diǎn):下次寫入>=6K數(shù)據(jù)不需要申請內(nèi)存空間,缺點(diǎn)造成內(nèi)存浪費(fèi)。
2.外因
修改內(nèi)存中數(shù)據(jù):修改包括增加和減少內(nèi)存占用,例如原來的16K空間數(shù)據(jù),增加或減少1K都會(huì)造成內(nèi)存浪費(fèi)。大量內(nèi)存碎片的存在,會(huì)造成redis實(shí)際內(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計(jì)算公式為:used_memory_rss/used_memory 該值大于1但小于1.5。這種情況是合理的。該值過高時(shí)考慮清理內(nèi)存,例如該值大于1.5表示有50%空間浪費(fèi),需要清理內(nèi)存碎片。
四、內(nèi)存碎片清理
內(nèi)存碎片清理,就是將不連續(xù)的內(nèi)存空間重新整理為連續(xù)空間,由于redis是單線程,在清理過程中會(huì)造成堵塞,降低性能??赏ㄟ^以下三種方式清理:
1.手動(dòng)清理內(nèi)存碎片
memory purge 只支持jemalloc內(nèi)存分配器
2.自動(dòng)清理
修改redis.conf配置文件
activedefrag yes 開啟自動(dòng)清理內(nèi)存碎片,命令開啟:config set activedefrag yes active-defrag-ignore-bytes 100mb 內(nèi)存碎片的字節(jié)數(shù)達(dá)到100M時(shí)開始清理 active-defrag-threshold-lower 10 內(nèi)存碎片空間占操作系統(tǒng)分配給redis的總空間比例達(dá)到 10% 時(shí)開始清理 active-defrag-ignore-bytes與active-defrag-threshold-lower 兩個(gè)條件同時(shí)滿足會(huì)觸發(fā)內(nèi)存碎片清理,當(dāng)有一個(gè)不滿足則停止清理 active-defrag-threshold-upper 100 內(nèi)存碎片超過 100%,則盡最大努力整理 active-defrag-cycle-min 1 自動(dòng)清理過程所用CPU時(shí)間的比例不低于1%,保證能正常清理 active-defrag-cycle-max 25 自動(dòng)清理過程所用CPU時(shí)間的比例不高于25%,超過25%停止清理,避免redis主線程阻塞 active-defrag-max-scan-fields 1000 自動(dòng)清理過程中長度小于1000的set/hash/zset/list才會(huì)進(jìn)行自動(dòng)清理
----以上參數(shù)默認(rèn)注釋----
3.重啟redis
到此這篇關(guān)于Redis 內(nèi)存碎片原因及清理的文章就介紹到這了,更多相關(guān)Redis 內(nèi)存碎片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談redis的maxmemory設(shè)置以及淘汰策略
下面小編就為大家?guī)硪黄獪\談redis的maxmemory設(shè)置以及淘汰策略。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03
Redis有序集合類型的操作_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
今天通過本文給大家說一下Redis中最后一個(gè)數(shù)據(jù)類型 “有序集合類型”,需要的的朋友參考下吧2017-08-08
使用Redis實(shí)現(xiàn)實(shí)時(shí)排行榜的示例
為了實(shí)現(xiàn)一個(gè)實(shí)時(shí)排行榜系統(tǒng),我們可以使用Redis的有序集合,本文主要介紹了使用Redis實(shí)現(xiàn)實(shí)時(shí)排行榜的示例,具有一定的參考價(jià)值,感興趣的可以了解一下2025-04-04
基于redis實(shí)現(xiàn)定時(shí)任務(wù)的方法詳解
這篇文章主要給大家介紹了基于redis實(shí)現(xiàn)定時(shí)任務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
一起raid數(shù)據(jù)恢復(fù)及回遷成功的案例
這篇文章主要介紹了一起raid數(shù)據(jù)恢復(fù)及回遷成功的案例,需要的朋友可以參考下2017-04-04
Redis實(shí)現(xiàn)分布式鎖的實(shí)例講解
在本篇文章里小編給大家整理了一篇關(guān)于Redis實(shí)現(xiàn)分布式鎖的實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。2021-12-12
Redis中的String類型及使用Redis解決訂單秒殺超賣問題
這篇文章主要介紹了Redis中的String類型及使用Redis解決訂單秒殺超賣問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
RedisDesktopManager?連接redis的方法
這篇文章主要介紹了RedisDesktopManager?連接redis,需要的朋友可以參考下2023-08-08
從原理到實(shí)踐分析?Redis?分布式鎖的多種實(shí)現(xiàn)方案
在分布式系統(tǒng)中,為了保證多個(gè)進(jìn)程或線程之間的數(shù)據(jù)一致性和正確性,需要使用鎖來實(shí)現(xiàn)互斥訪問共享資源,然而,使用本地鎖在分布式系統(tǒng)中存在問題,這篇文章主要介紹了從原理到實(shí)踐分析?Redis?分布式鎖的多種實(shí)現(xiàn)方案,需要的朋友可以參考下2024-07-07

