Amazon ElastiCache for Valkey または Amazon ElastiCache for Redis OSS クラスターで遅延が増加しているため、トラブルシューティングしたいです。
簡単な説明
ElastiCache for Valkey または ElastiCache for Redis OSS クラスターでは、次の一般的な原因で高遅延の問題が発生します。
- 低速コマンド
- 高いメモリ使用量に起因するスワップアクティビティの増加
- ネットワークの問題
- クライアント側の遅延の問題
- Redis の同期
- Amazon ElastiCache クラスターイベント
解決策
低速コマンド
Valkey と Redis OSS クラスターはシングルスレッドなので、ElastiCache は現在のリクエストが完了するまでクライアントにサービスを提供できません。この速度低下により、リクエストの合計時間が長くなり、遅延が増加します。
Valkey および Redis に関する Amazon CloudWatch メトリクスを使用して特定のコマンドを監視すると、平均遅延を監視できます。詳細については、「Valkey および Redis OSS のメトリクス」を参照してください。
エンジンによる処理に 10 ミリ秒よりも長くかかるコマンドのリストを取得するには、SLOWLOG GET コマンドを使用します。影響を受けたノードに接続し、valkey-cli で slowlog get 128 コマンドを実行します。
なお、ElastiCache は一般的な Redis 操作をマイクロ秒単位の遅延で計算します。CloudWatch は 1 分ごとにメトリクスをサンプリングし、遅延メトリクスを複数のコマンドの集合として表示します。単一のコマンドが原因で、メトリクスグラフでは大きな変化がなくても、タイムアウトなどの軽微な問題が発生する可能性があります。
実行に時間がかかる低速コマンドが原因で、ElastiCache ノードでの CPU 使用率が増加する可能性があります。EngineCPUUtilization メトリクスが増加した場合は、「自己設計 ElastiCache for Redis クラスターの CPU 使用率の増加をトラブルシューティングする方法を教えてください」を参照してください。
ElastiCache クラスターの速度を低下させる可能性のある複雑なコマンドの例を次に示します。
- 大規模なデータセットを含む本番環境で KEYS コマンドを使用する場合 KEYS コマンドはキースペース全体をスイープし、指定したパターンを検索します。詳細については、Valkey のウェブサイトで「KEYS」を参照してください。
- 実行に時間がかかる Lua スクリプト。 スクリプトの複雑さやデータセットの規模によっては、Lua スクリプトの実行時間が長くなり、遅延の問題が発生する可能性があります。
高いメモリ使用量に起因するスワップアクティビティの増加
クラスターのメモリ負荷が増加すると、Redis はメモリページをスワップします。メモリページはスワップ領域との間で転送されるため、スワップによって遅延が増加し、タイムアウトが発生する可能性があります。CloudWatch メトリクスで次の変化が起こった場合、スワップアクティビティの増加が示唆されます。
- SwapUsage の増加
- FreeableMemory の低下
- BytesUsedForCache および DatabaseMemoryUsagePercentage メトリクスの増加
スワップアクティビティの増加をトラブルシューティングする方法については、次の記事を参照してください。
ネットワークの問題
ネットワークの問題により、クラスターで遅延が増加する可能性があります。ネットワークの問題に応じて次のタスクを実行し、高遅延の問題をトラブルシューティングします。
クライアントと ElastiCache クラスター間のネットワーク遅延
クライアントとクラスターノード間のネットワーク遅延を分離すると、クライアントと ElastiCache クラスター間の遅延を軽減できます。詳細については、「仮想プライベートクラウド (VPC) 内の EC2 Linux または Windows インスタンスとオンプレミスホスト間の、インターネットゲートウェイ経由でのネットワークパフォーマンスに関する問題のトラブルシューティング方法を教えてください」を参照してください。
クラスターがネットワークの制限に達した
ElastiCache ノードは、関連する Amazon Elastic Compute Cloud (Amazon EC2) インスタンスと同じネットワーク制限を共有します。例えば、ElastiCache cache.m6g.large ノードと Amazon EC2 m6g.large インスタンスには、同じネットワーク制限が適用されます。サポートされている ElastiCache ノードタイプとネットワーク帯域幅制限の詳細については、「サポートされるノードタイプ」を参照してください。
ElastiCache ノードのネットワーク制限をトラブルシューティングする方法については、「ネットワーク関連の制限」を参照してください。
注: Amazon EC2 インスタンスのネットワークパフォーマンス、帯域幅の機能、1 秒あたりのパケット数 (PPS) のパフォーマンス、追跡される接続を監視することをおすすめします。
TCP/SSL ハンドシェイクの遅延
クライアントが Redis クラスターに接続する際、TCP 接続の作成に数ミリ秒かかることがあります。その間、遅延により Redis の操作と ElastiCache ノードの CPU で負荷が増加する可能性があります。新しい接続が多数ある場合、負荷によってネットワークの遅延が長くなる可能性があります。
接続プールを使用して確立された TCP 接続をプールにキャッシュすると、接続量を制御して遅延を軽減できます。接続プールを設定するには、Redis クライアントライブラリを使用します。接続プールを手動で構築することもできます。
MSET や MGET などの集約コマンドや Redis パイプラインを使用しても、接続プールを最適化できます。詳細については、Redis のウェブサイトで「Redis pipelining」を参照してください。
ElastiCache ノードに多数の接続がある場合
ElastiCache ノードに多数の TCP 接続がある場合、maxclients の制限を超える可能性があります。この制限に達すると、"ERR max number of clients reached error" というエラーが表示され、接続がタイムアウトする可能性があります。
高遅延を軽減するには、CurrConnections と NewConnections CloudWatch メトリクスを追跡することをおすすめします。これらのメトリクスを監視すると、ElastiCache ノードの TCP 接続数を確認できます。maxclients の上限に達したときの問題を解決するには、「接続数が多い場合」を参照してください (ベストプラクティス: Redis クライアントおよび Amazon ElastiCache for Redis)。
クライアント側の遅延の問題
クライアントリソースのタイムアウト値が小さすぎると、タイムアウトエラーが発生することがあります。クライアント側のリソースが遅延の原因であるかどうかを判断するには、クライアント側のメモリ、CPU、およびネットワーク使用率を確認します。 これらのリソースが制限に近い場合は、クライアント側のタイムアウト値を増やし、リソースが応答できるようにします。
アプリケーションが Amazon EC2 インスタンスで実行されている場合は、CloudWatch メトリクスを使用すると問題の詳細を特定できます。Amazon EC2 インスタンスに含まれるモニタリングツール (atop や CloudWatch エージェントなど) を使用してもかまいません。
クライアントが高遅延の原因であるかどうかを判断するには、次の問題を調査します。
- タイムアウトが頻繁に発生するのか、特定の時間帯に発生するのかを確認します。
- タイムアウトが特定のクライアントのみで発生するのか、複数のクライアントで発生するのかを確認します。
- タイムアウトが特定の Valkey または Redis ノードで発生するのか、複数のノードで発生するのかを確認します。
- タイムアウトが特定のクラスターのみで発生するのか、複数のクラスターで発生するのかを確認します。
Redis の同期
Redis の同期は、バックアップ、ノード交換、およびスケーリングイベントで開始されます。このプロセスは計算量の多いワークロードであり、遅延の原因となる可能性があります。
同期がノードのパフォーマンスに影響したかどうかを確認するには、CloudWatch で SaveInProgress メトリクスを確認します。
注: ユーザートラフィックへの影響を最小限に抑えるには、ピーク時以外に同期イベントをスケジュールすることをおすすめします。
ElastiCache のクラスターイベント
ElastiCache クラスターにクラスターイベントがある場合、そのイベント中に遅延が増加する可能性があります。ElastiCache コンソールを使用すると、遅延が発生した期間中のイベントを確認できます。ElastiCache のマネージドメンテナンスおよびサービスの更新において、バックグラウンドアクティビティ (ノード交換やフェイルオーバーイベントなど) が発生していないか確認します。
予期しないハードウェア障害が高遅延の原因と考えられる場合は、AWS サポートにお問い合わせください。
注: スケジュールしたイベント通知は、AWS Health ダッシュボードで確認できます。
イベントログの例
Finished recovery for cache nodes 0001
Recovering cache nodes 0001
Failover from master node cluster_node to replica node cluster_node completed
関連情報
Amazon CloudWatch を使用して Amazon ElastiCache for Redis におけるベストプラクティスを監視する
持続的な接続の問題
ElastiCache for Redis OSS または ElastiCache for Valkey クラスターでログ配信を有効にする方法を教えてください