info memory參數簡介
used_memory_human:262.89M
used_memory_rss:267489280
mem_fragmentation_ratio:0.97
(Redis在編譯時便會指定內存分配器;內存分配器可以是 libc 、jemalloc或者tcmalloc,默認是jemalloc。)
used_memory:Redis分配器分配的內存總量(單位是字節),包括使用的虛擬內存(即swap);used_memory_human:以人類可讀的格式返回 Redis 分配的內存總量。
used_memory_rss:Redis進程占據操作系統的內存(單位是字節),與top及ps命令看到的值是一致的;除了分配器分配的內存之外,used_memory_rss還包括進程運行本身需要的內存、內存碎片等,但是不包括虛擬內存。
因此,used_memory和used_memory_rss,前者是從Redis角度得到的量,后者是從操作系統角度得到的量。二者之所以有所不同,一方面是因為內存碎片和Redis進程運行需要占用內存,使得前者可能比后者小,另一方面虛擬內存的存在,使得前者可能比后者大。
Redis內存碎片率的參數 mem_fragmentation_ratio:由於在實際應用中,Redis的數據量會比較大,此時進程運行占用的內存與Redis數據量和內存碎片相比,都會小得多,ratio指數>1表明有內存碎片,越大表明越多,<1表明正在使用虛擬內存,虛擬內存其實就是硬盤,性能比內存低得多,這是應該增強機器的內存以提高性能。一般來說,mem_fragmentation_ratio的數值在1 ~ 1.5之間是比較健康的。
內存碎片清理方法
1、重啟Redis服務;
2、使用指令來手動回收內存碎片。
自動內存碎片整理相關參數
config set activedefrag yes 自動(實時)碎片整理
允許Redis服務器壓縮內存中小數據分配和數據釋放之間的空間,從而允許回收內存,官方默認設置內存碎片率大於10%且內存碎片大小超過100mb開始回收。
#Enabled active defragmentation
#碎片整理總開關
#activedefrag yes
#Minimum amount of fragmentation waste to start active defrag
#當碎片達到 100mb 時,開啟內存碎片整理
active-defrag-ignore-bytes 100mb
#Minimum percentage of fragmentation to start active defrag
#當碎片超過 10% 時,開啟內存碎片整理
active-defrag-threshold-lower 10
#Maximum percentage of fragmentation at which we use maximum effort
#內存碎片超過 100%,則盡最大努力整理
active-defrag-threshold-upper 100
#Minimal effort for defrag in CPU percentage
#內存自動整理占用資源最小百分比
active-defrag-cycle-min 25
#Maximal effort for defrag in CPU percentage
#內存自動整理占用資源最大百分比
active-defrag-cycle-max 75
PS:自動內存回收會使Redis集群的響應變高,因為內存碎片整理是在主線程中執行的,通過源碼發現,內存碎片整理操作會 scan (通過迭代進行)整個 redis 節點,並進行內存復制、轉移等操作,因為 redis 是單線程的,所以會導致 redis 性能下降(通過調整相關配置可以控制內存整理對 redis 集群的影響)。
參數詳細介紹:
(1)調整active-defrag-ignore-bytes和active-defrag-threshold-lower
當兩個條件都滿足時,則會進入內存碎片整理邏輯,這兩個參數僅用來判斷是否進入內存碎片整理邏輯,如果將碎片率或碎片大小調大至一個能接受的閾值,redis 不進行內存碎片整理,則不會對集群有過多的影響(注:frag_pct 是從 jemalloc 獲取的,不能完全依靠info中獲取的碎片值)。
(2)調整active-defrag-cycle-min和active-defrag-cycle-max
這兩個參數是占用主線程資源比率的上下限,如果想保證內存碎片整理功能不過度影響 redis 集群性能,則需要仔細斟酌着兩個參數的配置,通過觀察內存整理時的耗時、資源占用、redis響應等情況發現,當資源占用越多時,內存碎片整理力度越大,時間越短,當然對redis性能的影響也更大。