redis內存監控與回收


Redis有自己的內存分配器,當key-value對象被移除時,Redis不會馬上向操作系統釋放其占用內存。redis之所以這樣的設計有兩個原因。

  • OS可能會將釋放內存交換到虛擬內存,但OS的虛擬內存又是物理文件,其IO讀寫效率較低,從而影響Redis性能表現
  • OS的虛擬內存換入換出是基於Page機制,同一Page內的部分數據對象被釋放,但其他數據對象依然被其他應用使用中,導致在該Page內的Redis對象沒有被釋放

而Redis作者應該是考慮到以上問題,不希望Redis由此降低性能,所以在設計上Redis更傾向於自己掌控VM換入的粒度。

內存監控

啟動redis-cli,info命令可以觀察Redis實例的運行情況,其中# Memory塊查看內存使用情況。

# Memory
used_memory:26355360#當前Redis所有key-value值及內部開銷理論上要占用的內存
used_memory_human:25.13M#上一數據的可讀版本
used_memory_rss:28127232##(Resident Set Size常駐數據集大小),可理解為OS為Redis分配的物理內存總量
used_memory_rss_human:26.82M
used_memory_peak:26355360#峰值內存
used_memory_peak_human:25.13M#峰值內存可讀版本
total_system_memory:8253997056
total_system_memory_human:7.69G
used_memory_lua:37888#lua引擎占用內存
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:1.07#內存碎片率,used_memory_rss 和 used_memory 之間的比率
mem_allocator:jemalloc-4.0.3#所使用的內存分配器。可以是 libc 、 jemalloc 或者 tcmalloc

其中mem_fragmentation_ratio(內存碎片率)是分析Redis性能的重要數據指標

  • 大於1:OS為Redis分配的物理內存 > Redis所有key-value值及內部開銷應占用的內存

產生原因:物理內存多出的部分,Redis內移除對象的占用內存,但這部分內存由Redis自帶內存分配器占用,沒有向操作系統返回。這一部分就是內存碎片

  • 小於1:OS為Redis分配的物理內存 < Redis所有key-value值及內部開銷理應占用的內存

產生原因:應占內存比物理內存多出的部分,是被操作系統交換到虛擬內存,說明當前Redis的內存使用已經超出物理內存

內存碎片率保持在1.0至1.5之間是最理想的狀態。假若碎片率超過了1.5,我所知道的最有效解決手段就是重啟Redis服務器,釋放內存回到操作系統;反之,若碎片率為0.9,說明物理內存已不夠用,應增添硬件,或設置Redis最大內存限制maxmemory。

最大內存限制maxmemory的設置非常重要,如果不設置maxmemory,Redis一直會為其分配內存,直至耗盡所有物理內存,直到操作系統進行虛擬內存交換。因此,一般情況下,作者建議還是把峰值設置設上。開啟此配置,當超出限定內存情況發生,Redis會返回異常消息,操作系統不會因內存溢出而奔潰。還有一點建議是,開發者在系統設計之初,就應當制定Redis內存使用划分計划,而划分原則是,為Redis准備系統可能使用的峰值內存,而不是平均使用內存。例如系統大部分情況會以Redis作為分布式緩存寫入10G數據,但大部分情況下只會跑到4G,但Redis依然推薦用戶為其預留10G內存(used_memory_peak峰值)。

maxmemory的單位是bytes,默認為0,即不限制最大內存。

內存限制與Key回收

除maxmemory以外,仍然需要指定Redis在最大內存溢出后的處理行為——maxmemory-policy。同時設置了maxmemory與maxmemory-policy選項,redis內存使用達到上限。可以通過設置LRU算法(Least Recently Used 近期最少使用算法)來刪除部分key,釋放空間

提示:Redis32位實例最大可用內存為3G,64位則無限制,而RDB與AOF持久化文件都兼容支持32位或64位實例,因此可以自由切換在32位與64位之間切換。

  • volatile-lru -> 根據LRU算法生成的過期時間來刪除。
  • allkeys-lru -> 根據LRU算法刪除任何key。
  • volatile-random -> 根據過期設置來隨機刪除key。
  • allkeys-random -> 無差別隨機刪。
  • volatile-ttl -> 根據最近過期時間來刪除(輔以TTL)
  • noeviction -> 誰也不刪,直接在寫操作時返回錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM