Tairインスタンスのメモリアラートがメモリ使用量が多いことを示している場合、またはアプリケーションでメモリ不足 (OOM) 例外が発生したが、パフォーマンス監視データがメモリ使用量が少ないことを示している場合は、このトピックを参照して問題のトラブルシューティングを行うことができます。
問題の内容
症状1:
Tairインスタンスのメモリアラートを受信し、メモリ使用量がしきい値を超えたことを示します。 例えば、平均値は、3回連続して90% 以上である。 ただし、コンソールのモニタリングページには、メモリ使用量がしきい値よりも大幅に低いことが表示されます。
症状2:
アプリケーションでは、command not allowed when used memory > 'maxmemory'
例外が発生しますが、コンソールのモニタリングページには、メモリが完全に占有されていないか、1つのデータノードのみが高メモリ使用率であることが表示されます。
発生原因
監視されたメモリ使用量が報告されたメモリ使用量と異なるのはなぜですか。
モニタリングページに表示されるTairインスタンスのメモリ使用量がアラート情報のメモリ使用量と異なる場合、インスタンスはクラスターインスタンスである可能性があります。 データノードレベルではなく、インスタンスレベルでモニタリング情報を確認しています。
受信したアラート情報のインスタンス詳細にnodeId = <Instance ID>-db-<Number>
が含まれているかどうかを確認します。 上記の条件がtrueの場合、<インスタンスID>-db-<番号>
で識別されるデータノードのメモリ使用量のみがしきい値を超えています。
次の手順を実行して、データノードのメモリ使用量がアラート情報のメモリ使用量と同じかどうかを確認します。
ApsaraDB for Redisコンソールにログインし、[インスタンス] ページに移動します。 上部のナビゲーションバーで、管理するインスタンスが存在するリージョンを選択します。 次に、インスタンスを見つけて、インスタンスIDをクリックします。
左側のナビゲーションウィンドウで、パフォーマンスモニタリング.
データノード タブをクリックし、
<インスタンスID>-db-<番号>
に対応するデータノードを選択します。 データノードのメモリ使用量がアラート情報のメモリ使用量と同じかどうかを確認します。
データノードのメモリ使用量が他のデータノードのメモリ使用量よりも大幅に多いのはなぜですか。
Tairクラスターインスタンス内の1つ以上のデータノードのメモリ使用率が他のデータノードと比較して大幅に高い場合、データスキューが発生する可能性があります。 インスタンス診断機能を使用して、現在のインスタンスでデータスキューが発生しているかどうかを確認できます。
メモリスキューが発生するのはなぜですか?
ほとんどの場合、メモリスキューは次の理由で発生します。
大きなキーが存在します。
Tairクラスターインスタンスは、CRC (cyclic redundancy check) アルゴリズムを使用して、キーが属するスロットを計算し、スロットが属するデータノードにデータを書き込みます。
特定のキーがかなりの数のフィールドまたはサイズの大きいフィールドを格納する場合、キーが異なるデータノードにわたって均等に分散されていても、キーが過度に大きくなり、メモリスキューを引き起こす可能性がある。
ハッシュタグが使用されます。
user:{1000}:name
などのハッシュタグを使用する場合、Tairは中括弧で囲まれた文字列に対してCRC計算を実行し、同じハッシュタグを持つキーを同じスロットにマッピングします。 このように、キーは同じデータノード上に存在する。 多数のキーに対して同一のハッシュタグを構成すると、1つのデータノードにデータが集中し、メモリスキューが発生する可能性があります。
ソリューション
大きなキーが存在するかどうかを確認し、大きなキーを分割
大きなキーの識別
オフラインキー分析機能を使用して、大きなキーを識別できます。 詳細については、「オフラインキー分析機能の使用」「」をご参照ください。
大きなキーの識別方法については、「大きなキーとホットキーの識別と処理」をご参照ください。「」をご参照ください。
分割大きなキー
たとえば、数万のメンバーを含むHASHキーを、適切な数のメンバーを持つ複数のHASHキーに分割できます。 Tairクラスターインスタンスの場合、大きなキーを分割して、複数のデータノード間のメモリ使用量のバランスを取ることができます。
ハッシュタグが使用されているかどうかの確認
ハッシュタグを使用する場合は、ビジネス要件に基づいてハッシュタグを複数のハッシュタグに分割することを検討してください。 このようにして、データは異なるデータノードにわたって均等に分散される。
インスタンス仕様のアップグレード
各シャードに割り当てられるメモリを増やしてインスタンス仕様をアップグレードすることは、メモリスキューを防ぐための一時的な解決策として役立ちます。 詳細については、「インスタンスの設定の変更」をご参照ください。
ApsaraDB for Redisは、インスタンス仕様の変更中にデータスキューの事前チェックを開始します。 選択したインスタンスタイプがデータスキューの問題を処理できない場合、 ApsaraDB for Redisはエラーを報告します。 仕様の高いインスタンスタイプを選択して、もう一度お試しください。
インスタンス仕様をアップグレードすると、メモリ使用量のスキューが緩和される可能性があります。 しかし、帯域幅およびCPUリソース上でも使用スキューが発生することがある。