Database Autonomy Service (DAS) の検査およびスコアリング機能では、Redisのメモリ断片化率を考慮しています。 このトピックでは、Redisのメモリフラグメントの定義、原因、およびしきい値について説明します。
Redisのメモリフラグメントとは
例えば、オペレーティングシステムがNバイトよりも大きい利用可能なメモリ空間を有するが、その利用可能なメモリはNバイトよりも小さいメモリセグメントで構成されていると仮定する。 したがって、RedisがNバイトの連続メモリセグメントを要求すると、オペレーティングシステムはそれを提供できません。 この場合、Nバイトより小さいメモリセグメントはメモリフラグメントである。
ApsaraDB for Redisでは、メモリフラグメントはインスタンスに割り当てられる使用可能なメモリに影響を与えず、料金も発生しません。
たとえば、ApsaraDB For Redisインスタンスのメモリ容量が1 GBで、700 MBのメモリ容量が使用されているとします。 インスタンスのメモリ断片化率が2の場合、つまりデータが実際に2 GBのシステムメモリを占有している場合でも、インスタンスには300 MBの使用可能なメモリ領域 (1 GB〜700 MB) があります。
メモリの破片の原因
メモリフラグメントは、内部および外部の両方の理由によって引き起こされます。
内部の理由: Redisメモリアロケーターのメカニズムは、要件に基づいてメモリを完全に割り当てることができません。
Redisは、libc、jemalloc、tcmallocなどの複数のメモリアロケーターを使用します。 jemallocはデフォルトのメモリアロケータです。
メモリアロケータは、アプリケーションが実際に要求するメモリの量に基づくのではなく、固定された量のセットによってメモリを割り当てる。
たとえば、jemallocは常にメモリ空間を2のべき乗 (8バイト、16バイト、32バイト、2KB、4KBなど) で分割します。 アプリケーションが一定量のメモリを要求すると、jemallocは要求された量に最も近い量を選択し、その量のメモリをアプリケーションに割り当てます。
外的な理由: キーと値のペアはサイズが異なり、変更または削除できます。
メモリ割り当てメカニズムにより、アプリケーションに実際に割り当てられるメモリは、ほとんどの場合、要求された量よりわずかに大きい。 余分なメモリはメモリフラグメントになります。
キーと値のペアは変更または削除でき、使用されているメモリスペースはプロセスで変更または解放されます。
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
1から1.5までのmem_fragmentation_ratioの値は、許容可能なフラグメンテーション比を示す。
mem_fragmentation_ratioの値が1.5より大きい場合、使用されているメモリの半分を超えるサイズのメモリフラグメントがインスタンスに存在します。 この場合は、すぐに対処することをお勧めします。