時間の経過とともにmem_fragmentation_ratioの増加を示す傾向があるRedis 3.0.5インスタンスがあります。
そのインスタンスを使用するアプリケーションは、常にキーを作成および削除しています。
1か月後、mem_fragmentation_ratio> 1.30になります。これは、そのサーバー上のRedisのメモリフットプリントに影響します。
~$ redis-cli info memory
# Memory
used_memory:7711297480
used_memory_human:7.18G
used_memory_rss:10695098368
used_memory_peak:11301744128
used_memory_peak_human:10.53G
used_memory_lua:95232
mem_fragmentation_ratio:1.39
mem_allocator:jemalloc-3.6.0
Redisサービスを再起動してAOFからリロードすると、mem_fragmentation_ratioが許容レベル(1.06)に戻ります。
~$ redis-cli info memory
# Memory
used_memory:7493466968
used_memory_human:6.98G
used_memory_rss:7924920320
used_memory_peak:8279112992
used_memory_peak_human:7.71G
used_memory_lua:91136
mem_fragmentation_ratio:1.06
mem_allocator:jemalloc-3.6.0
Redisのリサイクルはアプリケーションに影響を与えます(これをスレーブの再起動後にSentinelフェイルオーバーで実行した場合でも)。
オフピークでスケジュールできる「デフラグ」プロセスのように、mem_fragmentation_ratioを減らす別の方法はありますか?
メモリの断片化は重要な問題です。
V4より前は、それを解決する唯一の方法はプロセスを再起動することでした(おそらくスレーブを作成し、それを昇格させてトラフィックをリダイレクトした後)。 v4以降、実験的なアクティブメモリの最適化メカニズムがあり、シンプルなCONFIG SET activedefrag yes
で有効にすることができます。
アクティブなデフラグ(Redis 4で導入)はRedis 5で改善されました。Redis5に関するAWSの発表から引用するには:
このリリースには、アクティブデフラグ2と呼ばれるものが同梱されています。より高速で、よりスマートで、レイテンシが低くなっています。この機能は、アロケーターが断片化を十分に低く保つことができないワークロードで特に有用であるため、戦略はRedisとアロケーターの両方が連携することです。これを機能させるには、Jemallocアロケーターを使用する必要があります。幸いにも、これはLinuxのデフォルトのアロケーターです。
Redisメイン開発者 からの別の引用:
アクティブなデフラグバージョン2。実行中のサーバーのメモリのデフラグは黒魔術ですが、オランアグラは過去の取り組みを改善し、今では以前よりもうまく機能します。 Jemallocを断片化する傾向がある長時間実行されるワークロードに非常に役立ちます。
Jemallocアロケーターを使用していて、フラグメンテーションと戦っている場合は、この機能をオンにすることをお勧めします。
CONFIG SET activedefrag yes
AWSからのElastiCache Redis を使用している場合、Jemallocがデフォルトであり、アクティブなデフラグがサポートされています。ランニング memory doctor
はまた、断片化レベルが高くなりすぎたら、その機能を有効にすることをお勧めします。