Redis パフォーマンス監視

RedisBeginner
オンラインで実践に進む

はじめに

この実験では、Redisのパフォーマンス問題を監視およびトラブルシューティングする方法を学びます。本実験では、レイテンシ問題の特定と対処、メモリ使用量の分析、およびクエリパフォーマンスの最適化に焦点を当てます。

LATENCY DOCTOR コマンドを使用してレイテンシを診断し、MEMORY STATS でメモリ使用量を確認し、SLOWLOG GET でスロークエリを分析し、MEMORY PURGE でメモリを最適化します。ステップバイステップのガイドに従うことで、応答性が高く効率的なRedis環境を維持するための実践的な経験を積むことができます。

事前構成済み環境

信頼性の高いデモンストレーションを行うため、この実験環境には以下が事前に構成されています。

  • 1000個の文字列キー(user:1 から user:1000 まで、ユーザーデータを含む)
  • 50個のハッシュオブジェクト(profile:1 から profile:50 まで、ユーザープロファイル情報を含む)
  • 20個のリストオブジェクト(logs:app1 から logs:app20 まで、ログエントリを含む)
  • 10個のセットオブジェクト(tags:1 から tags:10 まで、タグデータを含む)
  • パフォーマンス監視用に最適化されたRedis設定
  • 即座に分析できるよう、事前に生成されたレイテンシおよびスローログデータ

LATENCY DOCTOR によるレイテンシの監視

このステップでは、Redisの LATENCY DOCTOR コマンドを使用してレイテンシの問題を診断およびトラブルシューティングする方法を学びます。レイテンシを理解し対処することは、応答性が高く効率的なRedis環境を維持するために不可欠です。

レイテンシとは?

レイテンシとは、Redisサーバーにリクエストを送信してからレスポンスを受け取るまでの遅延のことです。高いレイテンシはアプリケーションのパフォーマンスに悪影響を及ぼし、応答時間の遅延やユーザーエクスペリエンスの低下を招く可能性があります。

LATENCY DOCTOR の紹介

LATENCY DOCTOR コマンドは、Redisに組み込まれた強力なツールで、レイテンシの潜在的な原因を特定するのに役立ちます。Redisの動作のさまざまな側面を分析し、遅延の原因となっている可能性のある事象についての洞察を提供します。

ステップバイステップガイド

Redisへの接続:

まず、`redis-cli` コマンドを使用してRedisサーバーに接続します。LabEx VMでターミナルを開き、以下のコマンドを実行してください。

```bash
redis-cli
```

これでRedisコマンドラインインターフェースが開きます。

現在の設定の確認:

環境には、レイテンシ監視が有効になるよう事前に設定されています。現在の設定を確認できます。

```bash
CONFIG GET latency-monitor-threshold
```

しきい値が10ミリ秒に設定されていることが確認できるはずです。

LATENCY DOCTOR の実行:

次に、`LATENCY DOCTOR` コマンドを実行してシステムを分析します。

```bash
LATENCY DOCTOR
```

これは重大なレイテンシ問題のない健全なRedisインスタンスであるため、以下のような出力が表示されるはずです。

```
Dave, no latency spike was observed during the lifetime of this Redis instance, not in the slightest bit. I honestly think you ought to sit down calmly, take a stress pill, and think things over.
```

このユーモラスなメッセージ(映画『2001年宇宙の旅』のHAL 9000への言及)は、Redisが設定されたしきい値を超えるレイテンシスパイクを検出せず、正常に動作していることを示しています。

LATENCY DOCTOR の応答の理解:

`LATENCY DOCTOR` が「Dave」メッセージを表示する場合、以下のことを意味します。
- レイテンシ監視しきい値(今回の場合は10ms)を超えたコマンドはない
- Redisはパフォーマンスのボトルネックなしに効率的に動作している
- レイテンシの観点からシステムは健全である

実際にレイテンシの問題が発生している本番環境では、以下のような詳細な分析が表示されます。
- 特定のレイテンシスパイクとその原因
- 最適化のための推奨事項
- 低速な操作の詳細な内訳

スローログの確認(代替分析):

`LATENCY DOCTOR` が問題を示さない場合でも、スローログを確認して、他の操作と比較してどの操作に時間がかかっているかを確認できます。

```bash
SLOWLOG GET 10
```

最近のコマンドとその実行時間が表示されます。各エントリには以下が含まれます。
- **Unique ID:** 各エントリのシーケンシャルな識別子
- **Timestamp:** コマンドが実行されたUnixタイムスタンプ
- **Execution Time:** マイクロ秒単位の時間(例:1954マイクロ秒 = 1.954ミリ秒)
- **Command:** 実行されたコマンド(Redis内部操作の場合は「COMMAND」と表示されることが多い)
- **Client Info:** クライアントのIPアドレスとポート

例:

```
1) 1) (integer) 10
   2) (integer) 1753255495
   3) (integer) 1954
   4) 1) "COMMAND"
   5) "127.0.0.1:42212"
   6) ""
```

これは、実行に1,954マイクロ秒(約2ミリ秒)かかったコマンドを示しています。

redis-cli の終了:

コマンドが確実にログに記録されるように、以下を入力して `redis-cli` を終了します。

```bash
exit
```

重要性の理解

LATENCY DOCTOR を使用し、スローログを分析することで、Redis環境のパフォーマンスに関する貴重な洞察を得ることができます。すべてが健全に見える場合(「Dave」メッセージで示されるように)でも、定期的な監視を行うことで、継続的な良好なパフォーマンスを確保し、発生しつつある問題を早期に検出できます。

MEMORY STATS によるメモリの確認

このステップでは、Redisの MEMORY STATS コマンドを使用してメモリ使用量を監視および把握する方法を学びます。効率的なメモリ管理は、Redisサーバーの安定性とパフォーマンスにとって極めて重要です。

なぜメモリを監視するのか?

Redisはインメモリデータストアであり、すべてのデータをRAMに保存します。Redisのメモリが不足すると、パフォーマンスの低下、データ損失、さらにはクラッシュにつながる可能性があります。メモリ使用量を監視することで、メモリ関連の潜在的な問題を事前に特定し、対処することができます。

MEMORY STATS の紹介

MEMORY STATS コマンドは、Redisのメモリ消費に関する詳細な概要を提供します。メモリ使用量をさまざまなカテゴリに分類し、どこでメモリが使用されているかについての洞察を与えてくれます。

ステップバイステップガイド

Redisへの接続:

`redis-cli` コマンドを使用してRedisサーバーに接続します。LabEx VMでターミナルを開き、以下を実行してください。

```bash
redis-cli
```

これでRedisコマンドラインインターフェースが開きます。

MEMORY STATS の実行:

接続したら、`MEMORY STATS` コマンドを実行します。

```bash
MEMORY STATS
```

Redisがメモリ統計を収集し、結果を表示します。

出力の解釈:

`MEMORY STATS` の出力はキーと値のペアの辞書であり、各キーはメモリ統計を表し、値はそれに対応する数値です。サンプル出力を見て、主要なメトリクスをいくつか説明します。

```
127.0.0.1:6379> MEMORY STATS
 1) "peak.allocated"
 2) (integer) 1114480
 3) "total.allocated"
 4) (integer) 1114480
 5) "startup.allocated"
 6) (integer) 948480
 7) "replication.buffer"
 8) (integer) 0
 9) "clients.slaves"
10) (integer) 0
11) "clients.normal"
12) (integer) 6456
13) "aof.buffer"
14) (integer) 0
15) "lua.vm"
16) (integer) 0
17) "overhead.total"
18) (integer) 165992
19) "keys.count"
20) (integer) 0
21) "keys.bytes-per-key"
22) (integer) 0
23) "dataset.bytes"
24) (integer) 948488
25) "dataset.percentage"
26) "0.00%"
27) "bytes-per-replica.avg"
28) (integer) 0
29) "bytes-per-replica.min"
30) (integer) 0
31) "bytes-per-replica.max"
32) (integer) 0
33) "allocator.fragratio"
34) "1.00"
35) "allocator.fragbytes"
36) (integer) 0
37) "allocator.rss"
38) (integer) 835584
39) "allocator.peak"
40) (integer) 1114112
41) "total.system"
42) (integer) 4194304
43) "allocator.resident"
44) (integer) 835584
```

主要なメトリクスの内訳は以下の通りです。
- **`peak.allocated`:** Redis起動以来、Redisが割り当てたメモリの最大量。
- **`total.allocated`:** 現在Redisによって割り当てられているメモリの総量。
- **`dataset.bytes`:** Redisに保存されているデータの合計サイズ(オーバーヘッドを除く)。
- **`overhead.total`:** Redisのオーバーヘッド(データ構造、メタデータなど)に使用されているメモリの総量。
- **`keys.count`:** 現在Redisに保存されているキーの数。
- **`allocator.fragratio`:** メモリアロケータの断片化率。値が高いほど断片化が進んでいることを示します。
- **`allocator.rss`:** オペレーティングシステムによって報告される、Redisが使用しているメモリ量(Resident Set Size)。
- **`total.system`:** システムで使用可能なメモリの総量。

redis-cli の終了:

コマンドが確実にログに記録されるように、以下を入力して `redis-cli` を終了します。

```bash
exit
```

情報の活用

MEMORY STATS によって提供される情報は、以下の目的で使用できます。

  • メモリリークの特定。
  • メモリ使用量を削減するためのデータ構造の最適化。
  • メモリ効率を向上させるためのRedis設定パラメータの調整。
  • Redisサーバーで利用可能なRAMを増やす必要があるかどうかの判断。

SLOWLOG GET によるスロークエリの分析

このステップでは、Redisの SLOWLOG GET コマンドを使用してスロークエリを分析する方法を掘り下げます。スロークエリを特定して最適化することは、応答性が高く効率的なRedis環境を維持するために不可欠です。最初のステップで LATENCY DOCTOR が示唆したように、スローログの分析はレイテンシ問題をデバッグするための重要なステップです。

スローログとは?

スローログは、指定された実行時間を超えたクエリを記録するRedisのシステムです。これにより、予想以上に時間がかかっており、パフォーマンスに悪影響を及ぼしている可能性のあるクエリを特定できます。

ステップバイステップガイド

Redisへの接続:

`redis-cli` コマンドを使用してRedisサーバーに接続します。LabEx VMでターミナルを開き、以下を実行してください。

```bash
redis-cli
```

これでRedisコマンドラインインターフェースが開きます。

スローログ設定の確認:

環境には適切なスローログ設定が事前に構成されています。現在の設定を確認できます。

```bash
CONFIG GET slowlog-log-slower-than
```

```bash
CONFIG GET slowlog-max-len
```

これらは、この実験中にすべてのコマンドをログに記録するようにRedisが設定されていること(`slowlog-log-slower-than` が `0`)、および最大128個のスローログエントリを保存するように設定されていることを示しているはずです。本番環境では、通常、パフォーマンス目標よりも遅いコマンドのみが記録されるように、より高いしきい値を使用します。

スローログエントリの取得:

`SLOWLOG GET` コマンドを使用してスローログエントリを取得します。最新の10個のスローログエントリを取得するには、以下のコマンドを使用します。

```bash
SLOWLOG GET 10
```

以下のような出力が表示されます。正確なID、タイムスタンプ、実行時間、ポート番号は環境によって異なります。

```
 1) 1) (integer) 10
    2) (integer) 1753255495
    3) (integer) 321
    4) 1) "EVAL"
       2) "local total = 0; for i=1,1000 do local value = redis.call('GET', 'user:' .. i); if value then total = total + string.len(value) end end; return total"
       3) "0"
   5) "127.0.0.1:42212"
   6) ""
 2) 1) (integer) 9
    2) (integer) 1753255494
    3) (integer) 225
    4) 1) "KEYS"
       2) "*"
    5) "127.0.0.1:41444"
    6) ""
 3) 1) (integer) 8
    2) (integer) 1753255494
    3) (integer) 5
    4) 1) "SLOWLOG"
       2) "RESET"
    5) "127.0.0.1:41004"
    6) ""
```

出力の解釈:

`SLOWLOG GET` の出力はスローログエントリの配列です。各エントリには6つの情報が含まれています。
- **Unique ID:** スローログエントリのシーケンシャルな識別子(例:10, 9, 8...)
- **Timestamp:** クエリが実行されたUnixタイムスタンプ
- **Execution Time:** マイクロ秒単位の実行時間(例:1954 = 1.954ミリ秒)
- **Command Array:** 実行されたコマンドとその引数
- **Client IP and Port:** クライアントのIPアドレスとポート(例:"127.0.0.1:42212")
- **Client Name:** クライアント名(通常は空で、"" と表示される)

**時間の理解:**
- 321マイクロ秒 = 0.321ミリ秒
- 225マイクロ秒 = 0.225ミリ秒
- 5マイクロ秒 = 0.005ミリ秒

一般的なパターンの分析:

環境内では、通常以下のようなものが見られます。
- **コマンド配列:** `EVAL`、`KEYS`、`CONFIG`、`SLOWLOG` などのエントリと、その引数
- **マイクロ秒単位のタイミング:** ほとんどの操作は非常に高速で、多くの場合1ミリ秒未満
- **ローカル接続:** すべての接続が 127.0.0.1 (localhost) から

より詳細なスロークエリの生成:

既存のデータを使用してより具体的なスロークエリを確認するために、データセットをスキャンする操作を実行してみましょう。

```bash
KEYS user:*
```

このコマンドはすべてのユーザーキー(1000個)をスキャンするため、スローログに表示されるはずです。

次に、更新されたスローログを確認します。

```bash
SLOWLOG GET 3
```

これで、`KEYS user:*` コマンドが以下のような形式でスローログに表示されるはずです。

```
1) 1) (integer) 11
   2) (integer) [timestamp]
   3) (integer) [execution_time]
   4) 1) "KEYS"
      2) "user:*"
   5) "127.0.0.1:[port]"
   6) ""
```

MEMORY PURGE によるメモリ最適化:

メモリ最適化も実演してみましょう。まず、現在のメモリ使用量を確認します。

```bash
MEMORY STATS
```

出力内の `total.allocated` 値を探してください。次に、未使用のメモリをパージ(解放)してメモリを解放します。

```bash
MEMORY PURGE
```

再度メモリ使用量を確認します。

```bash
MEMORY STATS
```

`total.allocated` 値を比較して、メモリが解放されたかどうかを確認します。`MEMORY PURGE` コマンドは、Redisによって積極的に使用されていないメモリを解放しようとします。

redis-cli の終了:

コマンドが確実にログに記録されるように、以下を入力して `redis-cli` を終了します。

```bash
exit
```

情報の活用

スローログを分析することで、低速なクエリを特定し、最適化するための措置を講じることができます。重要な洞察には以下が含まれます。

  • コマンドの頻度: 低速なコマンドがどのくらいの頻度で表示されるか
  • 実行パターン: 特定の操作がスローログに一貫して表示されるかどうか
  • パフォーマンスの傾向: 時間の経過に伴う実行時間の変化
  • リソース使用量: 過剰なCPUやメモリを消費している可能性のあるコマンド

この情報は、以下の目的で役立ちます。

  • アプリケーションクエリの最適化
  • 問題のあるパターンの特定
  • スケーリングとキャパシティの計画
  • 本番環境でのパフォーマンス問題のデバッグ

まとめ

この実験では、実際のRedisパフォーマンス監視ツールを実演する事前構成済みの環境を使用して、Redisのパフォーマンス監視手法を探求しました。

まず、LATENCY DOCTOR コマンドを使用して、Redisがどのようにレイテンシ問題を診断するかを理解しました。健全な環境では、レイテンシスパイクが検出されなかったことを示す特徴的な「Dave」メッセージを確認しました。これにより、システムが正常に動作している際のRedisのレイテンシ監視フィードバックの解釈方法を学びました。

次に、MEMORY STATS コマンドを調べて、Redisのメモリ使用パターンを分析しました。1000個の文字列キー、50個のハッシュオブジェクト、20個のリスト、10個のセットという事前構成済みのデータセットを使用して、現実的なメモリ割り当てを観察し、total.allocateddataset.bytesoverhead.total といった主要なメモリメトリクスを特定する方法を学びました。

その後、SLOWLOG GET コマンドを調べてクエリパフォーマンスを分析しました。6つの要素からなるスローログエントリの解釈方法、マイクロ秒単位の実行時間の理解、そしてRedis内部の「COMMAND」操作がどのようにスローログに表示されるかを学びました。また、KEYS user:* のようなパターンマッチングコマンドを使用して、カスタムスロークエリを生成する方法も実演しました。

最後に、MEMORY PURGE コマンドを使用してメモリ最適化を実演し、パージ前後のメモリ使用量を比較することで、Redisがどのように効率的にメモリを管理しているかを理解しました。

この実験を通じて、以下の方法を学びました。

  1. 「健全なシステム」メッセージを含む LATENCY DOCTOR の出力を解釈する
  2. 実際のデータセットメトリクスを使用して MEMORY STATS でメモリ使用パターンを分析する
  3. 6つの要素からなる構造を持つスローログエントリを読み取り、理解する
  4. パターンマッチング操作を使用してスロークエリを生成および分析する
  5. MEMORY PURGE でメモリ使用量を最適化する
  6. パフォーマンス監視において、Redis内部操作とユーザーコマンドを区別する

Redisの組み込みパフォーマンス監視ツールを使用したこの実践的な経験は、本番環境で応答性が高く効率的なRedis環境を維持するための基盤となります。