こんにちは!Redisの仕組みや運用について、もっと深く知りたいと思っているんですね。素晴らしい着眼点です。
インフラの世界では、データベースの「メモリ管理」というのは、いわば職人技が試される領域です。ここをクリアすれば、あなたもRedisの基本はバッチリマスターできますよ。今日は、初心者の方でもスッと腑に落ちるように、日常の例えを交えながら、Redisのメモリ監視の核心に迫っていきましょう。
—
Redisのメモリは「ダンボール箱」に似ている
まず、Redisがメモリをどう扱っているかを知るために、部屋の中にある「ダンボール箱」を想像してください。
あなたは日々、たくさんの荷物(データ)をダンボール箱に詰め込んでいきます。
- 実際に荷物が占めている体積
- ダンボール箱そのものが占めている場所(容積)
この2つ、実は一致しませんよね。
例えば、中身の荷物は小さくても、大きめのダンボール箱を使っていれば、部屋の中では「ダンボール箱のサイズ」分のスペースが取られてしまいます。さらに、荷物を出し入れしているうちに、箱のあちこちがボコボコにへこんだり、中途半端な隙間が生まれてしまったりします。
Redisの世界でも、これとまったく同じことが起きています。この仕組みを理解するためのキーワードが、今回扱う`used_memory_rss`と`used_memory_peak`です。
—
押さえておべき3つの重要メトリクス
Redisの状態を確認するコマンド `INFO memory` を叩くと、たくさんの数字が出てきますが、まずは次の3つだけに集中してください。
1. `used_memory`(荷物の実体積)
- Redisが「データそのものを保存するために使っている純粋なメモリの量」です。
2. `used_memory_rss`(ダンボール箱が占める実際のスペース)
- OS(オペレーティングシステム)の視点から見て、Redisが実際にガッツリ確保してしまっている物理メモリの量です。「Resident Set Size」の略ですが、ここでは「ダンボール箱の占有スペース」と覚えてください。
3. `used_memory_peak`(過去最高のスペース消費記録)
- 運用している中で、「今までで一番ダンボール箱が広がってしまった瞬間」の記録です。
—
「断片化率」はどうやって計算し、何を見るべきか?
さて、ここからが本題です。
Redisの健康状態を測る上で最も重要な指標の一つが「メモリ断片化率(Mem Fragmentation Ratio)」です。
計算式は非常にシンプルです。
$$\text{断片化率} = \frac{\text{used\_memory\_rss(ダンボール箱のスペース)}}{\text{used\_memory(荷物の実体積)}}$$
この数字が何を意味するのか、日常に置き換えて考えてみましょう。
- 比率が「1.0」に近い(または少し高い)場合
- 荷物のサイズとダンボール箱のサイズがピッタリ合っています。非常にキレイに片付いている状態です。
- 比率が「1.5」や「2.0」を超えてきた場合
- 荷物は少ないのに、やたらと大きなダンボール箱が部屋を圧迫している状態です。「本当はもっとメモリを節約できるのに、OSとの間で無駄な陣取り合戦が起きている」サインになります。
実際の `INFO memory` の出力例を見てみ頃
RedisのCLIから `INFO memory` を実行すると、次のようなデータが返ってきます(一部抜粋・解説付き)。
Memory
used_memory:104857600 # 1. 荷物の実体積:約100MB
used_memory_rss:2147483648 # 2. 実際のスペース:約2GB(!?)
used_memory_peak:150994944 # 3. 過去最高記録:約144MB
mem_fragmentation_ratio:20.48 # 4. 断片化率:約20.4倍!
おっと、この出力例は少し極端ですが……`used_memory` が100MBなのに、OS側では2GBもメモリが確保されている(断片化率が20を超えている)という危険な状態です。
「あれ? そんなにデータ入れてないのに、サーバーのメモリがパンクしそう!」という現場の悲鳴は、大体この断片化が原因で引き起こされます。
—
現場で戦うエンジニアからのアドバイス
もし、監視していて「おや、断片化率が1.5を超えてきたな」「`used_memory_peak` に比べて、今のメモリ効率が悪すぎるな」と感じたらどうすればいいでしょうか?
初心者の方は、「Redisを再起動しなきゃいけないの?」と焦りがちですが、Redisには優秀な機能があります。
近年のRedis(バージョン4.0以降)では、「メモリーの自動デフラグ(Active Defragmentation)」という機能が備わっています。散らばった荷物を夜のうちにこっそり整理整頓し、ダンボール箱のサイズをコンパクトに畳み直してくれる機能です。
これを有効にしておくことで、サービスを止めることなく、安全にメモリ効率を最適化することができます。
—
まとめ
- `used_memory` は「データそのもののサイズ」。
- `used_memory_rss` は「OSから見た実際のメモリ占有サイズ」。
- この2つの比率(断片化率)を監視することで、「無駄なメモリが使われていないか」を察知できる。
メモリ管理は、データベース運用における「部屋の片付け」のようなものです。仕組みさえ分かってしまえば、もう怖いものはありません。
日々の監視の中にこの視点を取り入れて、強靭で美しいRedis環境を作っていきましょう。
ここをクリアしたあなたなら、もうRedisのメモリ管理で迷うことはありませんよ!次のステップも一緒に頑張りましょう。
コメント