redis-3.0.7メモリフラグメントが高すぎるmem_fragmentation_ratio >1.5
3205 ワード
redis-3.0.7メモリフラグメントが高すぎるmem_fragmentation_ratio >1.5
一、メモリ断片化率
mem_fragmentation_ratio = used_memory_rss/used_memory
used_memory:Redisはそのディスペンサを使用して割り当てられたメモリサイズ
used_memory_rss:オペレーティングシステムがRedisインスタンスに割り当てたメモリサイズ.このプロセスが占める物理メモリのサイズを示します.
両方には、実際のキャッシュで使用されたメモリとRedis自身の実行で使用されたメモリが含まれています.used_memory_rss指標には、オペレーティングシステムの非効率な物理メモリの割り当て/回収によるメモリフラグメントのオーバーヘッドも含まれています.
二、メモリの断片化率が高い原因
実際の環境を分析すると、このredisは主に頻繁に更新されたデータを格納しているため、データを更新するたびに古いデータが削除され、実際には、Redisがメモリブロックを解放したため、メモリディスペンサはオペレーティングシステムにメモリを返さず、このメモリディスペンサはコンパイル時に指定され、libc、jemalloc、またはtcmallocであってもよい.used_memory_rssはますます大きくなりmem_fragmentation_ratioはますます高くなる
三、解決方法
1.Redisサーバを再起動すると、追加で発生したメモリフラグメントが失効し、新しいメモリとして再利用され、オペレーティングシステムが効率的なメモリ管理を回復してメモリディスペンサを変更することができます.
Redisはglibc’s malloc、jemalloc 11、tcmallocのいくつかの異なるメモリディスペンサをサポートし、各ディスペンサはメモリの割り当てと断片化において異なる実装を有する.通常の管理者は、Redisのデフォルトのメモリディスペンサを変更することをお勧めしません.これは、これらのメモリディスペンサの違いを完全に理解し、Redisを再コンパイルする必要があるためです.
2、redis4.0以上では、メモリフラグメントを手動で回収するための新規コマンドを使用できます.モニタリングの使用性能が向上します.
自動メモリフラグメント整理config set activedefrag yesを開く
メモリフラグメントを手動でクリーンアップするmemory purge
プロファイルは次のとおりです.
# Enabled active defragmentation
#
# activedefrag yes
# Minimum amount of fragmentation waste to start active defrag
#
active-defrag-ignore-bytes 100mb
# Minimum percentage of fragmentation to start active defrag
#
active-defrag-threshold-lower 10
# Maximum percentage of fragmentation at which we use maximum effort
#
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
Redis 4.0自動メモリフラグメント整理(Active Defrag)ソースコード分析https://zhuanlan.zhihu.com/p/67381368