Database Autonomy Service (DAS) では、Redis インスタンスの検査およびスコアリング機能において、メモリ断片化率を評価要素の一つとして採用しています。本トピックでは、メモリ断片化とは何か、その原因、測定方法、および対応が必要となるタイミングについて説明します。
メモリ断片化の仕組み
メモリ断片化は、空きメモリが存在するにもかかわらず、それが小さな非隣接セグメントに分断されている状態を指します。たとえ合計の空きメモリ量が N バイトを超えていても、オペレーティングシステムは N バイトの連続したブロックを確保できず、これらの分散したセグメントがメモリフラグメントとなります。
Tair(Redis OSS 互換)では、メモリフラグメントが発生しても、ご利用のインスタンスに割り当てられた使用可能なメモリは減少せず、追加の課金も発生しません。
例:Tair(Redis OSS 互換)インスタンスの容量が 1 GB で、そのうち 700 MB を使用している場合、メモリ断片化率が 2 に達したとしても、残りの 300 MB(1 GB − 700 MB)は引き続き利用可能です。これは、データが物理的にシステムメモリ上に 2 GB 分の領域を占有していることを意味します。
メモリ断片化の原因
メモリ断片化には、以下の 2 つの根本的な原因があります。
メモリアロケータの動作(内部要因)
Redis は libc、jemalloc、tcmalloc の複数のメモリアロケータをサポートしており、デフォルトは jemalloc です。jemalloc はアプリケーションからの要求サイズをそのまま割り当てるのではなく、8 バイト、16 バイト、32 バイト、2 KB、4 KB など、最も近い 2 のべき乗境界値に切り上げてメモリを割り当てます。このとき、要求サイズと実際の割り当てサイズとの差分がフラグメントとなります。
キーと値のペアの更新・削除頻度(外部要因)
キーと値のペアが変更または削除されると、それらが占めていたメモリ領域は解放または再サイズされます。しかし、割り当てられたブロックサイズが新しいデータサイズと正確に一致することは稀であり、時間とともにギャップ(未使用領域)が蓄積していきます。
メモリ断片化率の確認方法
DAS で以下のコマンドを実行し、メモリ使用量の詳細を表示します:
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 | 現在のメモリ断片化率 |
この比率は、以下の式で算出されます:
mem_fragmentation_ratio = used_memory_rss / used_memory比率の解釈
| 比率 | 状態 | 推奨される操作 |
|---|---|---|
| 1.0–1.5 | 正常 | 対応不要 |
| > 1.5 | 高 | 断片化されたメモリが使用済みメモリの半分を超えています。原因を調査し、是正措置を講じてください。 |