資料庫自治服務DAS的巡檢評分功能,支援對Redis的記憶體片段率進行健康評分,本文介紹什麼是Redis記憶體片段,Redis記憶體片段如何形成,以及如何通過Redis記憶體片段率判斷Redis是否存在記憶體片段。
什麼是Redis記憶體片段?
作業系統的剩餘空間總量足夠,但申請一塊N位元組連續地址的空間時,剩餘記憶體空間中沒有大小為N位元組的連續空間,那麼這些剩餘記憶體空間中,小於N位元組的連續記憶體空間就是記憶體片段。
若資料庫執行個體為阿里雲資料庫 Tair(相容 Redis)執行個體,記憶體片段帶來的膨脹不會影響該執行個體的記憶體配額,也不會產生額外的費用。
例如配額為1 GB的雲資料庫 Tair(相容 Redis)執行個體,已使用700 MB記憶體,記憶體片段率為2倍,實際佔用系統記憶體為2 GB,但該執行個體剩餘可用容量仍為300 MB(1 GB減去700 MB)。
Redis記憶體片段是如何形成的?
記憶體片段形成有內部原因和外部原因:
內部原因:記憶體 Clerk的分配策略決定作業系統無法做到“按需分配”。
Redis使用libc、jemalloc、tcmalloc多種記憶體 Clerk來分配記憶體,預設使用jemalloc。
記憶體 Clerk是按照固定大小來分配記憶體空間,不是完全按照應用程式申請的記憶體大小來分配。
以jemalloc為例,是按照一系列固定的大小劃分記憶體空間,例如8位元組、16位元組、32位元組、...、2KB、4KB等。當程式申請的記憶體最接近某個固定值時,jemalloc就會給它分配相應大小的空間。
外部原因:索引值對大小不一樣,並且索引值對可以被修改和刪除。
Redis申請記憶體空間分配時,對於大小不一的記憶體空間需求,記憶體 Clerk按照固定大小分配記憶體空間,分配的記憶體空間一般都會比申請的記憶體空間大一些,這會產生一定的記憶體片段。
索引值對會被修改和刪除,會導致空間的擴容和釋放。
如何判斷Redis是否有記憶體片段?
DAS通過Redis提供的INFO命令,查詢記憶體使用量的詳細資料,命令如下:
INFO memory
# Memory
used_memory:350458970752
used_memory_human:326.39G
used_memory_rss:349066919936
used_memory_rss_human:325.09G
…
mem_fragmentation_ratio:1.00
used_memory:表示Redis為了儲存資料實際申請使用的記憶體空間。
used_memory_rss:表示作業系統實際分配給Redis的實體記憶體空間,其中包含了記憶體空間片段。
mem_fragmentation_ratio:表示Redis當前的記憶體片段率。
計算公式:mem_fragmentation_ratio=used_memory_rss/used_memory
mem_fragmentation_ratio大於等於1但小於等於1.5,這種情況是合理的。
mem_fragmentation_ratio大於1.5,表明記憶體片段率已經超過了50%。