web-dev-qa-db-ja.com

メモリの断片化を引き起こすRedisを処理する方法?

時間の経過とともに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を減らす別の方法はありますか?

8
Olivier Dauby

メモリの断片化は重要な問題です。

V4より前は、それを解決する唯一の方法はプロセスを再起動することでした(おそらくスレーブを作成し、それを昇格させてトラフィックをリダイレクトした後)。 v4以降、実験的なアクティブメモリの最適化メカニズムがあり、シンプルなCONFIG SET activedefrag yesで有効にすることができます。

8
Itamar Haber

アクティブなデフラグ(Redis 4で導入)はRedis 5で改善されました。Redis5に関するAWSの発表から引用するには:

このリリースには、アクティブデフラグ2と呼ばれるものが同梱されています。より高速で、よりスマートで、レイテンシが低くなっています。この機能は、アロケーターが断片化を十分に低く保つことができないワークロードで特に有用であるため、戦略はRedisとアロケーターの両方が連携することです。これを機能させるには、Jemallocアロケーターを使用する必要があります。幸いにも、これはLinuxのデフォルトのアロケーターです。

Redisメイン開発者 からの別の引用:

アクティブなデフラグバージョン2。実行中のサーバーのメモリのデフラグは黒魔術ですが、オランアグラは過去の取り組みを改善し、今では以前よりもうまく機能します。 Jemallocを断片化する傾向がある長時間実行されるワークロードに非常に役立ちます。

Jemallocアロケーターを使用していて、フラグメンテーションと戦っている場合は、この機能をオンにすることをお勧めします。

CONFIG SET activedefrag yes

AWSからのElastiCache Redis を使用している場合、Jemallocがデフォルトであり、アクティブなデフラグがサポートされています。ランニング memory doctorはまた、断片化レベルが高くなりすぎたら、その機能を有効にすることをお勧めします。

1
Philipp Claßen