すべてのプロダクト
Search
ドキュメントセンター

Tair (Redis® OSS-Compatible):高いメモリ使用率のトラブルシューティング

最終更新日:Aug 27, 2026

Tair (Redis OSS-compatible) インスタンスがメモリ不足になると、頻繁なキーのエビクション、応答時間の増加、不安定な QPS などの問題が発生し、ビジネスに影響を与える可能性があります。インスタンスのメモリが満杯になった場合、またはメモリアラートを受信した場合は、このトピックを使用して、メモリ使用量が継続的に高いか、急激に増加したか、または偏っているかを判断してください。その後、大きいキーの分割、有効期限ポリシーの設定、またはインスタンス仕様のアップグレードによって問題を解決できます。

高いメモリ使用率のシナリオ

高いメモリ使用率は、通常、次の 3 つのシナリオのいずれかに分類されます。

  • メモリ使用率が長期間にわたって高いレベルで推移している。一般的に、メモリ使用率が 95% を超える場合は、対策を講じる必要があります。

  • メモリ使用率は一貫して低いものの、突然高いレベルに急上昇し、時には 100% に達する。

  • インスタンス全体のメモリ使用率は低いが、特定のデータノードのメモリ使用率が100% に近い

メモリ使用率を削減するには、該当するシナリオに合った解決策を適用してください。

継続的に高いメモリ使用率に対する解決策

  1. 既存のキーがビジネス要件を満たしているか確認し、不要なキーを速やかにクリーンアップしてください。

  2. キャッシュ分析機能では、ラージキーの分布およびキーの TTL 有効期限ポリシーを分析できます。詳細については、「オフラインキー分析」をご参照ください。

    1. キーの TTL ポリシーが妥当かどうかを分析します。

      説明

      次の例では、どのキーにも有効期限が設定されていません。ビジネスニーズを評価し、クライアント側で適切な有効期限を設定することを推奨します。

      図 1. キー有効期限の分布の例キー有効期限の分布の例

    2. 大きなキーを評価し、アプリケーション側で分割します。

      キャッシュ分析ページで、[Large Key Analysis] タブをクリックして詳細を表示します。テーブルには、キー名、キータイプ、データサイズなどの情報が表示されます。[Export] ボタンをクリックして、分析結果をローカルマシンにダウンロードします。

  3. ビジネス要件に基づいて、maxmemory-policy パラメーターを設定して適切な削除ポリシーを設定します。詳細については、「パラメーターの設定」をご参照ください。

    説明

    インスタンスのデフォルトの削除ポリシーは volatile-lru です。詳細については、「削除ポリシー」をご参照ください。

  4. ビジネスニーズに応じて hz パラメーターの値を調整し、期限切れキーを積極的に削除するための合理的な実行頻度を設定します。詳細については、「定期タスクの実行頻度を調整する」をご参照ください。

    説明

    hz パラメーターは 100 未満の値に設定することを推奨します。値を大きくすると、CPU 使用率に大きな影響を与える可能性があります。インスタンスが Redis 5.0 以降と互換性がある場合は、自動調整を有効にすることもできます。詳細については、「バックグラウンドタスクの動的周波数制御の有効化」をご参照ください。

  5. 上記の最適化を実行した後でもメモリ使用量が依然として高い場合は、より多くのデータを処理し、パフォーマンスを向上させるため、メモリ容量の大きい仕様へのアップグレードをご検討ください。詳細については、「インスタンスの構成の変更」をご参照ください。

    説明

    インスタンスをアップグレードする前に、従量課金インスタンスを購入して、ターゲット仕様がワークロード要件を満たすかどうかをテストできます。テスト完了後、インスタンスをリリースできます。インスタンスのリリース方法については、「従量課金インスタンスのリリース」をご参照ください。

メモリの急増に対する解決策

原因

メモリ使用率の急激な増加は、以下の原因によって引き起こされる可能性があります。

メモリの急増には、4 つの原因のうちの 1 つが考えられます。各行の主要な指標を使用して、どれが当てはまるかを特定してください。

原因

主要な指標

大量の新規データ書き込み

メモリ使用率とともに入力トラフィックと 1 秒あたりの書き込みクエリ数 (QPS) が急増

新規接続の急増

メモリ使用率とともに接続数が急増

バーストトラフィックによるバッファーのバックログ

帯域幅使用率が 100% に達し、clients.normal のメモリが高い

低速クライアントによる出力バッファーのバックログ

MEMORY DOCTOR の出力で big_client_buf が 1 になる

大量の新規データ書き込み

新規データが急速に流入すると、メモリ消費が直接的に増加します。

診断

[Performance Monitor] ページで、[inbound traffic][write queries per second (QPS)] を確認します。両方のメトリクスがメモリ使用率と同じ傾向をたどる場合、急増は大量の新規データが原因です。

解決策

  1. キーに適切な Time-to-Live (TTL) 値を設定し、不要になったデータが自動的に期限切れになるようにします。または、不要なキーを手動で削除します。

  2. インスタンスのメモリ容量を増やします。詳細については、「インスタンスの設定変更」をご参照ください。

  3. インスタンスがスタンダードインスタンスであり、容量を増やしてもメモリ使用率が高いままである場合は、クラスターインスタンスにアップグレードしてください。クラスターインスタンスはデータを複数のデータシャードに分散させ、各データシャードのメモリ負荷を軽減します。詳細については、「インスタンスの設定変更」をご参照ください。

新規接続の急増

各クライアント接続は、その入力バッファーと出力バッファーのためにメモリを確保します。接続が急増すると、それに応じて合計メモリ使用量も増加します。

診断

[Performance Monitor] ページで、[number of connections] を確認します。接続数がメモリ使用率とともに急増している場合、原因は接続の急増です。

解決策

  1. アプリケーションに接続リークがないか確認します。

  2. 接続タイムアウトを設定して、アイドル状態の接続を自動的に閉じます。詳細については、「クライアント接続のタイムアウト期間の指定」をご参照ください。

バーストトラフィックによるバッファーのバックログ

バーストトラフィックによってインスタンスのネットワーク帯域幅を超えるトラフィックが生成されると、送受信データが入力バッファーと出力バッファーに蓄積されます。このバッファーのバックログは、通常のデータストレージに加えて追加のメモリを消費します。

診断

  1. 入力および出力トラフィックの使用率が 100% に達しているかどうかを確認します。

  2. MEMORY STATS を実行し、clients.normal が過剰なメモリを占有していないか確認します。

    説明

    clients.normal は、すべての通常のクライアント接続における入力バッファーと出力バッファーによって消費される合計メモリを示します。この値が高い場合は、バッファーのバックログがメモリの急増を引き起こしていることを示します。

解決策

  1. トラフィックバーストの原因を特定します。

  2. インスタンスのネットワーク帯域幅を増やします。詳細については、「インスタンスの帯域幅の手動増加」および「帯域幅自動スケーリングの有効化」をご参照ください。

  3. インスタンスの仕様をアップグレードして、十分なバッファー容量を確保します。詳細については、「インスタンスの設定変更」をご参照ください。

低速クライアントによる出力バッファーのバックログ

クライアントが応答を十分に速く消費できない場合、未配信のデータがサーバー側の出力バッファーに蓄積されます。Redis はキューに入れられた各応答にメモリを割り当てますが、クライアントが遅れるとこれが大きくなる可能性があります。

診断

redis-cliMEMORY DOCTOR を実行し、big_client_buf の値を確認します。big_client_buf が 1 の場合、少なくとも 1 つのクライアントの出力バッファーが大きすぎて、大量のメモリを消費しています。

解決策

CLIENT LIST を実行し、omem の値が高いクライアントを探します。omem フィールドは、クライアントの出力バッファーによって使用されるメモリを示します。特定されたクライアントに、応答を十分に速く消費できない原因となるパフォーマンスの問題がないか確認してください。

データノードでの高いメモリ使用率に対する解決策

症状

クラスターアーキテクチャのインスタンスでは、特定のデータノードでの高いメモリ使用率は、次の症状によって示されます。

  • CloudMonitor からメモリ使用率のアラートを受信します。アラートメッセージは、特定のデータノードのメモリ使用率がしきい値を超えたことを示します。

  • インスタンス診断レポートにメモリ使用率のデータスキューが表示されます。

  • パフォーマンスモニタリングページでは、インスタンス全体のメモリ使用率は低いものの、特定のデータノードのメモリ使用率が高くなっています。

原因

インスタンス全体のメモリ使用率が低い一方で、特定のデータノードの使用率が高い場合は、データスキューを示しています。

解決策

大きいキーのチェックと分割

大きいキーの検出

オフラインキー分析機能を使用して、ラージキーを検出してください。

ラージキーを検出する他の方法については、「ラージキーとホットキー」をご参照ください。

大きいキーの分割

たとえば、数万のメンバーを持つ HASH キーを、それぞれが適切な数のメンバーを持つ複数の小さな HASH キーに分割します。クラスターインスタンスでは、ラージキーを分割することで、データシャード間のメモリ使用量のバランスを大幅に改善できます。

ハッシュタグ使用のチェック

データが集中する原因となっているハッシュタグを使用している場合は、アプリケーションのロジックに従って、複数のハッシュタグに分割することを検討してください。これにより、データを異なるデータシャードにより均等に分散できます。

インスタンス仕様のアップグレード

インスタンス仕様をアップグレードすると、各シャードで利用可能なメモリが増加し、メモリ スキューの一時的な解決策になります。詳細な手順については、「インスタンス設定の変更」をご参照ください。

重要
  • システムは、インスタンス仕様の変更中にデータスキューの事前チェックを開始します。選択したインスタンスタイプがデータスキューの問題を処理できない場合、システムはエラーを報告します。より高い仕様のインスタンスタイプを選択して、もう一度お試しください。

  • インスタンス仕様をアップグレードすると、メモリ使用量のスキューは軽減される可能性があります。ただし、帯域幅と CPU リソースでもスキューが発生する可能性があります。

付録 1:Redis のメモリ使用量

Redis インスタンスのメモリは、主に 3 つのコンポーネントで構成されます。

メモリコンポーネント

説明

リンクメモリ (動的)

これには、入力バッファー、出力バッファー、JIT オーバーヘッド、偽の Lua リンク、および Lua 実行キャッシュ用のメモリが含まれます。INFO コマンドを実行して、出力の Clients セクションでクライアントキャッシュ情報を確認できます。

説明

入力バッファーと出力バッファーは各クライアント接続に関連付けられており、通常は小さいです。ただし、範囲ベースの操作を実行したり、大きいキーがゆっくりと転送されたりすると、これらのバッファーによって使用されるメモリが増加し、データ領域に影響を与え、メモリ不足 (OOM) エラーを引き起こす可能性があります。

データメモリ

これはユーザーデータ領域であり、実際の値情報を格納します。通常、分析の主な焦点となります。

管理メモリ (静的)

この領域は小さく、起動後は比較的一定です。データ管理ハッシュテーブル、レプリケーションバッファー、および AOF バッファーからのメモリオーバーヘッド (約 32 MB 〜 64 MB) で構成されます。

説明

非常に多数のキー (たとえば、数億個) の場合、この領域は大量のメモリを消費する可能性があります。

説明

非効率な動的メモリ管理は、ほとんどの OOM シナリオを引き起こします。たとえば、レート制限中のリクエストキューイングは、動的メモリを急速に増加させる可能性があります。過度に複雑であったり、不適切に記述された Lua スクリプトも OOM につながる可能性があります。これらの問題を回避するため、動的メモリの制御を強化する Tair (Enterprise Edition) を推奨します。

付録 2:メモリ使用率の確認

MEMORY STATS コマンド

Redis では、MEMORY STATS コマンドを実行してメモリ使用量の詳細を照会します。

Redis インスタンスのメモリオーバーヘッドは、主に 2 つの部分で構成されます。

  • ビジネスデータによるメモリオーバーヘッド。これは通常、分析の主な焦点となります。

  • マスター/レプリカレプリケーションのバックログバッファーや Redis プロセスの初期化中に消費されるメモリなど、非ビジネスデータによるメモリオーバーヘッド。

次のセクションでは、サンプル応答と各パラメーターの説明を示します。

説明

次の応答では、メモリ値はバイト単位です。

 1) "peak.allocated" // Redis プロセスが起動以降に消費したピークメモリ。
 2) (integer) 79492312
 3) "total.allocated" // Redis によって割り当てられた合計バイト数。現在の合計メモリ使用量。
 4) (integer) 79307776
 5) "startup.allocated" // Redis が起動時に消費した初期メモリ量。
 6) (integer) 45582592
 7) "replication.backlog" // レプリケーションバックログバッファーのサイズ。
 8) (integer) 33554432
 9) "clients.slaves" // マスター/レプリカレプリケーションにおけるすべてのレプリカノードの読み取り/書き込みバッファーの合計サイズ。
10) (integer) 17266
11) "clients.normal" // すべての通常クライアント (レプリカノードを除く) の読み取り/書き込みバッファーの合計サイズ。
12) (integer) 119102
13) "aof.buffer" // AOF 永続化に使用されるバッファーと、AOF の書き換え時に生成されるバッファー。
14) (integer) 0
15) "db.0"  // ビジネスデータベースの数。
16) 1) "overhead.hashtable.main" // 現在のデータベースのハッシュテーブルの合計メモリオーバーヘッド (メタデータメモリ)。
    2) (integer) 144
    3) "overhead.hashtable.expires" // キーの有効期限を保存するために消費されるメモリ。
    4) (integer) 0
17) "overhead.total" // すべてのオーバーヘッドメモリの合計。計算式:startup.allocated + replication.backlog + clients.slaves + clients.normal + aof.buffer + db.X。
18) (integer) 79273616
19) "keys.count" // 現在の Redis インスタンスのキーの総数。
20) (integer) 2
21) "keys.bytes-per-key" // 現在の Redis インスタンスにおける各キーの平均サイズ。計算式:(total.allocated - startup.allocated) / keys.count。
22) (integer) 16862592
23) "dataset.bytes" // 純粋なビジネスデータが占有するメモリサイズ。
24) (integer) 34160
25) "dataset.percentage" // 純粋なビジネスデータが占有するメモリの割合。計算式:dataset.bytes * 100 / (total.allocated - startup.allocated)。
26) "0.1012892946600914"
27) "peak.percentage" // 現在の合計メモリと履歴のピークメモリの比率。計算式:total.allocated * 100 / peak.allocated。
28) "99.767860412597656"
29) "fragmentation" // メモリ断片化率。
30) "0.45836541056632996"

MEMORY DOCTOR コマンド

Redis で、MEMORY DOCTOR コマンドを実行してメモリ診断の提案を取得します。

図 2. 診断結果の例

r-bpxxxxxxxxxxxxxxxxxxxx.redis.rds.aliyuncs.com:6379> MEMORY DOCTOR
"Sam, I detected a few issues in this Redis instance memory implants:\n\n * High
 allocator RSS overhead: This instance has an RSS memory overhead is greater tha
n 1.1 (this means that the Resident Set Size of the allocator is much larger tha
n the sum what the allocator actually holds). This problem is usually due to a l
arge peak memory (check if there is a peak memory entry above in the report), yo
u can try the MEMORY PURGE command to reclaim it.\n\nI'm here to keep you safe,
 Sam. I want to help you.\n"

MEMORY DOCTOR は、以下の観点に基づいて Redis インスタンスのメモリ診断の提案を提供します。これらの提案を使用して、対応する最適化戦略を策定できます。

    int empty = 0;     /* インスタンスが空またはほぼ空である。 */
    int big_peak = 0;       /* メモリのピークが使用メモリよりはるかに大きい。 */
    int high_frag = 0;      /* 高い断片化。 */
    int high_alloc_frag = 0; /* アロケーターの高い断片化。 */
    int high_proc_rss = 0;  /* プロセスの RSS オーバーヘッドが高い。 */
    int high_alloc_rss = 0; /* アロケーターからの RSS オーバーヘッドが高い。 */
    int big_slave_buf = 0;  /* レプリカバッファーが大きすぎる。 */
    int big_client_buf = 0; /* クライアントバッファーが大きすぎる。 */
    int many_scripts = 0;   /* スクリプトキャッシュにスクリプトが多すぎる。 */

MEMORY USAGE コマンド

Redis では MEMORY USAGE コマンドを実行して、指定されたキーのメモリ使用量 (バイト単位) を照会します。

コマンドの例:

MEMORY USAGE Key0089393003

応答の例:

(integer) 1000072