Tair (Redis OSS-compatible) インスタンスがメモリ不足になると、頻繁なキーのエビクション、応答時間の増加、不安定な QPS などの問題が発生し、ビジネスに影響を与える可能性があります。インスタンスのメモリが満杯になった場合、またはメモリアラートを受信した場合は、このトピックを使用して、メモリ使用量が継続的に高いか、急激に増加したか、または偏っているかを判断してください。その後、大きいキーの分割、有効期限ポリシーの設定、またはインスタンス仕様のアップグレードによって問題を解決できます。
高いメモリ使用率のシナリオ
高いメモリ使用率は、通常、次の 3 つのシナリオのいずれかに分類されます。
メモリ使用率が長期間にわたって高いレベルで推移している。一般的に、メモリ使用率が 95% を超える場合は、対策を講じる必要があります。
メモリ使用率は一貫して低いものの、突然高いレベルに急上昇し、時には 100% に達する。
インスタンス全体のメモリ使用率は低いが、特定のデータノードのメモリ使用率が100% に近い。
メモリ使用率を削減するには、該当するシナリオに合った解決策を適用してください。
継続的に高いメモリ使用率に対する解決策
既存のキーがビジネス要件を満たしているか確認し、不要なキーを速やかにクリーンアップしてください。
キャッシュ分析機能では、ラージキーの分布およびキーの TTL 有効期限ポリシーを分析できます。詳細については、「オフラインキー分析」をご参照ください。
キーの TTL ポリシーが妥当かどうかを分析します。
説明次の例では、どのキーにも有効期限が設定されていません。ビジネスニーズを評価し、クライアント側で適切な有効期限を設定することを推奨します。
図 1. キー有効期限の分布の例

大きなキーを評価し、アプリケーション側で分割します。
キャッシュ分析ページで、[Large Key Analysis] タブをクリックして詳細を表示します。テーブルには、キー名、キータイプ、データサイズなどの情報が表示されます。[Export] ボタンをクリックして、分析結果をローカルマシンにダウンロードします。
ビジネス要件に基づいて、maxmemory-policy パラメーターを設定して適切な削除ポリシーを設定します。詳細については、「パラメーターの設定」をご参照ください。
説明インスタンスのデフォルトの削除ポリシーは volatile-lru です。詳細については、「削除ポリシー」をご参照ください。
ビジネスニーズに応じて hz パラメーターの値を調整し、期限切れキーを積極的に削除するための合理的な実行頻度を設定します。詳細については、「定期タスクの実行頻度を調整する」をご参照ください。
説明hz パラメーターは 100 未満の値に設定することを推奨します。値を大きくすると、CPU 使用率に大きな影響を与える可能性があります。インスタンスが Redis 5.0 以降と互換性がある場合は、自動調整を有効にすることもできます。詳細については、「バックグラウンドタスクの動的周波数制御の有効化」をご参照ください。
上記の最適化を実行した後でもメモリ使用量が依然として高い場合は、より多くのデータを処理し、パフォーマンスを向上させるため、メモリ容量の大きい仕様へのアップグレードをご検討ください。詳細については、「インスタンスの構成の変更」をご参照ください。
説明インスタンスをアップグレードする前に、従量課金インスタンスを購入して、ターゲット仕様がワークロード要件を満たすかどうかをテストできます。テスト完了後、インスタンスをリリースできます。インスタンスのリリース方法については、「従量課金インスタンスのリリース」をご参照ください。
メモリの急増に対する解決策
原因
メモリ使用率の急激な増加は、以下の原因によって引き起こされる可能性があります。
メモリの急増には、4 つの原因のうちの 1 つが考えられます。各行の主要な指標を使用して、どれが当てはまるかを特定してください。
原因 | 主要な指標 |
大量の新規データ書き込み | メモリ使用率とともに入力トラフィックと 1 秒あたりの書き込みクエリ数 (QPS) が急増 |
新規接続の急増 | メモリ使用率とともに接続数が急増 |
バーストトラフィックによるバッファーのバックログ | 帯域幅使用率が 100% に達し、 |
低速クライアントによる出力バッファーのバックログ |
|
大量の新規データ書き込み
新規データが急速に流入すると、メモリ消費が直接的に増加します。
診断
[Performance Monitor] ページで、[inbound traffic] と [write queries per second (QPS)] を確認します。両方のメトリクスがメモリ使用率と同じ傾向をたどる場合、急増は大量の新規データが原因です。
解決策
キーに適切な Time-to-Live (TTL) 値を設定し、不要になったデータが自動的に期限切れになるようにします。または、不要なキーを手動で削除します。
インスタンスのメモリ容量を増やします。詳細については、「インスタンスの設定変更」をご参照ください。
インスタンスがスタンダードインスタンスであり、容量を増やしてもメモリ使用率が高いままである場合は、クラスターインスタンスにアップグレードしてください。クラスターインスタンスはデータを複数のデータシャードに分散させ、各データシャードのメモリ負荷を軽減します。詳細については、「インスタンスの設定変更」をご参照ください。
新規接続の急増
各クライアント接続は、その入力バッファーと出力バッファーのためにメモリを確保します。接続が急増すると、それに応じて合計メモリ使用量も増加します。
診断
[Performance Monitor] ページで、[number of connections] を確認します。接続数がメモリ使用率とともに急増している場合、原因は接続の急増です。
解決策
アプリケーションに接続リークがないか確認します。
接続タイムアウトを設定して、アイドル状態の接続を自動的に閉じます。詳細については、「クライアント接続のタイムアウト期間の指定」をご参照ください。
バーストトラフィックによるバッファーのバックログ
バーストトラフィックによってインスタンスのネットワーク帯域幅を超えるトラフィックが生成されると、送受信データが入力バッファーと出力バッファーに蓄積されます。このバッファーのバックログは、通常のデータストレージに加えて追加のメモリを消費します。
診断
入力および出力トラフィックの使用率が 100% に達しているかどうかを確認します。
MEMORY STATSを実行し、clients.normalが過剰なメモリを占有していないか確認します。説明clients.normalは、すべての通常のクライアント接続における入力バッファーと出力バッファーによって消費される合計メモリを示します。この値が高い場合は、バッファーのバックログがメモリの急増を引き起こしていることを示します。
解決策
トラフィックバーストの原因を特定します。
インスタンスのネットワーク帯域幅を増やします。詳細については、「インスタンスの帯域幅の手動増加」および「帯域幅自動スケーリングの有効化」をご参照ください。
インスタンスの仕様をアップグレードして、十分なバッファー容量を確保します。詳細については、「インスタンスの設定変更」をご参照ください。
低速クライアントによる出力バッファーのバックログ
クライアントが応答を十分に速く消費できない場合、未配信のデータがサーバー側の出力バッファーに蓄積されます。Redis はキューに入れられた各応答にメモリを割り当てますが、クライアントが遅れるとこれが大きくなる可能性があります。
診断
redis-cli で MEMORY 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) を推奨します。