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指標には、オペレーティングシステムの非効率な物理メモリの割り当て/回収によるメモリフラグメントのオーバーヘッドも含まれています.
  • mem_fragmentation_ratio<1は、Redisメモリの割り当てが物理メモリを超えていることを示し、オペレーティングシステムがメモリ交換を行っていることを示し、メモリ交換は非常に明らかな応答遅延を引き起こす.
  • mem_fragmentation_ratio>1は合理的です.
  • mem_fragmentation_ratio>1.5は、Redisが実際に必要とする物理メモリの150%以上を消費することを示し、そのうち50%がメモリフラグメント率であり、オペレーティングシステムまたはRedisインスタンスにおけるメモリ管理が悪化する可能性のある表現
  • である.

    二、メモリの断片化率が高い原因


    実際の環境を分析すると、このredisは主に頻繁に更新されたデータを格納しているため、データを更新するたびに古いデータが削除され、実際には、Redisがメモリブロックを解放したため、メモリディスペンサはオペレーティングシステムにメモリを返さず、このメモリディスペンサはコンパイル時に指定され、libc、jemalloc、またはtcmallocであってもよい.used_memory_rssはますます大きくなりmem_fragmentation_ratioはますます高くなる
  • が長くなるkey-value負荷に遭遇した:記憶されているデータの長さの違いが大きく、頻繁に更新され、redisのk-vごとに初期化されたメモリサイズが最適であり、変更されたvalueが変更され、元のメモリサイズが適用されない場合、メモリを再割り当てする必要がある.再割り当て後、一部のメモリredisが正常に回収されず、ずっと消費されています.
  • maxmemory制限によりkeyが回収され削除されたredisが大量のデータを書き込むようになり、これらのデータのkeyは元のデータと多く一致せず、データがmaxmemory制限を超えるとredisはkeyの回収戦略によって一部の古いデータを淘汰するが、淘汰されたデータ自体が占有したメモリはredisプロセスによって解放されず、redisメモリの有効なデータは最大メモリを超えないが、しかし、プロセス全体のメモリはinfo情報のevicted_を増加させています.keysフィールドには、maxmemoryの制限によりkeyが回収削除する数keyが回収されることが多いため、Redisはクライアントからのコマンド要求だけでなく、条件を満たすkey
  • を頻繁に回収するため、クライアントコマンド応答の遅延時間を増加させることができる.

    三、解決方法


    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