オペレーティングシステムの残容量の合計は十分ですが、Nバイト連続アドレスの空間を申請した場合、残りメモリ空間にNバイト連続の空間がありません。残りのメモリ空間 (N 未満) バイトの連続したメモリ空間はメモリの断片化です。
メモリ断片化の形成には内部的理由と外部的理由があります:
内部的理由: メモリ アロケータの割り当て戦略により、オペレーティング システムが「割り当て」を達成できないと判断されます。オンデマンド"。
Redis は、libc、jemalloc、および tcmalloc を使用してメモリを割り当てます。デフォルトでは、jemalloc が使用されます。
メモリ アロケータは、アプリケーションによって要求されたメモリ サイズに完全に従うのではなく、固定サイズに従ってメモリ空間を割り当てます。
jemalloc を例にとると、8 バイト、16 バイト、32 バイト、...、2KB、4KB、などの一連の固定サイズに従ってメモリ空間を分割します。等Jemalloc は、プログラムによって要求されたメモリに最も近い固定サイズのスペースを割り当てます。
外部理由: キーと値のペアのサイズが異なるため、キーと値のペアは変更および削除される可能性があります。
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 に割り当てられた物理メモリ空間を示します。これにはメモリ空間のフラグメントが含まれます。
メモリ断片の自動クリーニング
連続したメモリ空間をいくつかの不連続な空間に分割するデータがある場合、オペレーティング システムはそのデータを別の場所にコピーし、元の不連続なメモリ空間は連続的なメモリ空間になります。
この問題を軽減するにはどうすればよいですか?
Redis は、特に、メモリ断片化の自動クリーニング メカニズムのパラメーター設定を提供します。パラメータを設定して断片化クリーニングの開始と終了のタイミング、および CPU 占有率を制御することで、Redis リクエスト処理に対する断片化クリーニングのパフォーマンスへの影響を軽減できます。
まず、自動メモリ断片化クリーンアップを有効にします:
以上がRedis メモリの断片をクリーンアップする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。