自分で設計した Amazon ElastiCache for Redis クラスターの CPU 使用量の増加をトラブルシューティングしたいと考えています。
簡単な説明
ElastiCache for Redis の Amazon CloudWatch CPU メトリクスは次のとおりです。
- EngineCPUUtilization: Redis エンジンスレッドの CPU 使用率を報告します。Redis はシングルスレッドです。ベストプラクティスは、vCPU が 4 つ以上あるノードの EngineCPUUlization メトリクスを監視することです。
- CPUUtilization: ホストの CPU 使用率を示します。vCPU が 2 つ以下の小規模ノードでは、CPUUtilization メトリクスを使用してクラスターワークロードを監視します。
解決策
エンジンの CPU 使用率が高い場合のトラブルシューティング
高 EngineCPUUtilization のトラブルシューティングには、次の点を確認してください。
- CPU 時間を大量に消費する長時間実行コマンド: キー、hkey、hgetall など、時間が複雑なコマンドは CPU 時間を大量に消費します。コマンドの時間の複雑さやパフォーマンスに関する推奨事項を確認するには、Redis Web サイトの「コマンド」を参照してください。Lua スクリプトを使用すると、ランタイムにすべてのサーバーアクティビティがブロックされ、EngineCPUUtilization が上昇します。Lua スクリプトは EVAL および EVALSHA Redis コマンドで使用されます。詳細については、Redis ウェブサイトの「Lua、EVAL、EVALSHA によるスクリプティング」を参照してください。実行時間が長いコマンドや Lua スクリプトを確認するには、Redis SLOWLOG を使用してください。
- 多数のリクエスト: コマンド統計情報を確認して、コマンドバーストまたは増加した待ち時間を特定します。コマンドの統計情報を確認するには、GetTypeCmds や HashBasedCmds などの CloudWatch メトリクスを使用します。または、Redis INFO コマンドを使用してください。詳細については、Redis ウェブサイトの INFO を参照してください。リクエストの数が多く、アプリケーションのワークロードが予想どおりであれば、クラスターをスケーリングしてください。
- バックアップとレプリケーション: バックアップまたはレプリケーションが行われた場合は、SaveInProgress メトリクスを確認してください。このバイナリメトリクスは、バックグラウンド保存 (フォークまたはフォークレス) が進行中の場合は 1 を示し、バックグラウンド保存が進行中でない場合は 0 を示します。Redis スナップショットを作成するのに十分なメモリがあることを確認してください。
- 多数の新規接続: 短期間に多数の新しいクライアント接続要求が発生すると、EngineCPUUlization が増加する可能性があります。多数の接続を処理する場合のベストプラクティスについては、「ベストプラクティス: Redis clients および Amazon ElastiCache for Redis」を参照してください。Redis 6.2 以降では、パフォーマンスの向上が実装されました。詳細については、「ElastiCache for Redis 6.2 (拡張版)」を参照してください。
- キーエビクションの件数が多い: Redis は maxmemory-policy パラメーターに基づいてキーを削除します。エビクションは、キャッシュに新しいデータを保持するための十分なメモリがない場合に発生します。エビクションの量が多い場合、Redis はキーをエビクトするためにより多くの CPU リソースを使用し、EngineCPUUtilization が増加します。エビクションボリュームをモニタリングするには、CloudWatch メトリクスのエビクションを使用します。エビクション量が多い場合は、より大きなノードタイプを使用するか、ノードを追加してクラスターをスケーリングします。
- 再利用回数が多い: メモリを解放するために、Redis はタイムアウト期限に達したキーをサンプリングして削除します。このプロセスは再利用と呼ばれます。期限切れの数が多いと、CPUUtilization と EngineCPUUtilization が増加する可能性があります。キー有効期限イベントの数をモニタリングするには、CloudWatch メトリクス **Reclaimed を使用してください。**多くのキーが同時に期限切れにならないようにするのがベストプラクティスです。キーが別の時間枠で期限切れになるようにするには、EXPIREAT コマンドを使用するか、キーに異なる TTL 値を設定します。詳細については、Redis ウェブサイトの「EXPIREAT」を参照してください。
CPUUtiliation が高い場合のトラブルシューティング
高い CPUUtilization をトラブルシューティングするには、次の点を確認します。