ホームページ  >  記事  >  データベース  >  Redis メモリの断片をクリーンアップする方法

Redis メモリの断片をクリーンアップする方法

WBOY
WBOY転載
2023-05-26 13:18:331359ブラウズ

Redis メモリの断片化とは何ですか?

オペレーティングシステムの残容量の合計は十分ですが、Nバイト連続アドレスの空間を申請した場合、残りメモリ空間にNバイト連続の空間がありません。残りのメモリ空間 (N 未満) バイトの連続したメモリ空間はメモリの断片化です。

Redis メモリの断片化はどのようにして発生しますか?

メモリ断片化の形成には内部的理由と外部的理由があります:

  • 内部的理由: メモリ アロケータの割り当て戦略により、オペレーティング システムが「割り当て」を達成できないと判断されます。オンデマンド"。

    • Redis は、libc、jemalloc、および tcmalloc を使用してメモリを割り当てます。デフォルトでは、jemalloc が使用されます。

    • メモリ アロケータは、アプリケーションによって要求されたメモリ サイズに完全に従うのではなく、固定サイズに従ってメモリ空間を割り当てます。

    • jemalloc を例にとると、8 バイト、16 バイト、32 バイト、...、2KB、4KB、などの一連の固定サイズに従ってメモリ空間を分割します。等Jemalloc は、プログラムによって要求されたメモリに最も近い固定サイズのスペースを割り当てます。

  • 外部理由: キーと値のペアのサイズが異なるため、キーと値のペアは変更および削除される可能性があります。

    • #Redis がメモリ空間の割り当てを適用する場合、さまざまなサイズのメモリ空間要件に対して、メモリ アロケータは固定サイズに従ってメモリ空間を割り当てます。割り当てられたメモリ空間は一般的により大きくなります。要求されたメモリ空間よりもメモリ空間が大きいため、メモリの断片化が発生します。

    • キーと値のペアが変更および削除され、スペースの拡張と解放につながります。

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% を超えていることを示します。

    #記憶の断片をクリーンアップするにはどうすればよいですか?

「単純かつ大雑把な」方法は、Redis インスタンスを再起動することです。ただし、この方法では次の 2 つの結果が生じます:

    Redis 内のデータが永続化されていない場合、データは失われます。 Redis データ 永続化されているかどうかに関係なく、データを復元するには AOF または RDB メソッドを使用する必要があり、回復時間は AOF または RDB ファイルのサイズによって異なります。また、Redis インスタンスが 1 つしかない場合、復旧フェーズ中にサービスを提供できません。
  • もっと良い方法はありますか?はい、バージョン 4.0-RC3 以降、Redis 自体がメモリ フラグメントを自動的にクリーンアップする方法を提供します。
  • メモリ断片の自動クリーニング

  • メモリ断片のクリーニングとは、簡単に言えば、「道を空けるために移動し、空間を結合する」ことを意味します。

連続したメモリ空間をいくつかの不連続な空間に分割するデータがある場合、オペレーティング システムはそのデータを別の場所にコピーし、元の不連続なメモリ空間は連続的なメモリ空間になります。

しかし、断片化のクリーンアップにはコストがかかります。データの複数のコピーを新しい場所に移動し、元の領域を解放することはオペレーティング システムが行う必要がありますが、このプロセスには時間がかかります。さらに、データがコピーされると、Redis がブロックされ、パフォーマンスが低下します。

この問題を軽減するにはどうすればよいですか?

Redis は、特に、メモリ断片化の自動クリーニング メカニズムのパラメーター設定を提供します。パラメータを設定して断片化クリーニングの開始と終了のタイミング、および CPU 占有率を制御することで、Redis リクエスト処理に対する断片化クリーニングのパフォーマンスへの影響を軽減できます。

まず、自動メモリ断片化クリーンアップを有効にします:

config set activedefrag yes

次に、メモリ クリーンアップをトリガーする条件を設定します:

active-defrag-ignore-bytes 100mb: メモリ断片化のバイト数が 100MB に達すると、クリーンアップが開始されることを示します;


    active-defrag-threshold- lower 10:メモリ断片化スペースがオペレーティング システムの割り当てを占有する Redis に割り当てられた合計スペースが 10% に達すると、クリーンアップが開始されます。
  • 最後に、クリーニング操作が占める CPU 時間の割合の上限と下限を制御します:
  • active-defrag-cycle-min 25: 自動クリーニングを示しますクリーニングを正常に進めるために、プロセスで使用される CPU 時間の割合が 25% 以上であることを示します;

    active-defrag-cycle-max 75:自動クリーニング プロセスで使用される CPU 時間の割合が高くないことを示します。75% を超えると、クリーニング中に大量のメモリ コピーが Redis をブロックすることを避けるためにクリーニングが停止され、その結果、応答遅延が増加します。

以上がRedis メモリの断片をクリーンアップする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。