Amazon Relational Database Service (Amazon RDS) for PostgreSQL における DiskQueueDepth の増加についてトラブルシューティングしたいと考えています。
簡単な説明
DiskQueueDepth は、アプリケーションによって送信されたものの、まだストレージデバイスに送信されていない入出力 (I/O) リクエストの数です。ディスクまたはストレージが他のリクエストでビジー状態になっているため、リクエストは保留されています。
DiskQueueDepth が高い場合は、I/O リクエストがストレージシステムの処理能力を超える速度で増加したことを示します。Amazon RDS は、このメトリクスを 1 分間隔の平均として報告します。利用可能な 1000 IOPS ごとにキューの長さを 1 にすることを目標にするのがベストプラクティスです。
注: I/O パフォーマンスを測定するには、インスタンスのスループットと I/O オペレーションの数を確認します。
解決策
Amazon RDS for PostgreSQL の DiskQueueDepth の増加についてトラブルシューティングするには、以下を実行してください。
高い DiskQueueDepth を特定する
高い DiskQueueDepth を特定するには、以下を確認してください。
- パフォーマンスに問題がある場合は、Amazon CloudWatch メトリクスを確認します。DiskQueueDepth メトリクスに通常よりも高いスパイクがないか確認します。DiskQueueDepth が長時間高い状態のままになると、クエリが実行されるまでの待機時間が長くなります。
- インスタンスタイプの制限を確認します。ReadIOPS、WriteIOPS、ReadThroughput、WriteThroughput の各メトリクスがインスタンスタイプの制限に達しているかどうかを確認します。
- ReadThroughput と WriteThroughput メトリクスを確認します。CloudWatch はこのデータを 1 秒あたりのバイト数で表示するので、より明確に解釈するために、これらの値を MB/秒または GB/秒に変換してください。割り当てられたスループット制限に達したかどうかを判断するには、同じ期間の両方のメトリクスを合計します。インスタンスに割り当てられるスループットの詳細については、「Amazon RDS インスタンスタイプ」のドキュメントを参照してください。
- EBSByteBalance% メトリクスを確認します。EBSByteBalance% がゼロまたはゼロに近い場合、インスタンスは高いスループットを消費しています。また、バイトバランスがゼロの場合は、帯域幅にスロットリングが発生していることを示しています。
ストレージのタイプとサイズを確認する
ストレージのタイプとサイズを確認するには、次の操作を行います。
- ワークロードを最適化します。ワークロードの効率を調整および改善するために利用できるオプションを調べてください。
- 汎用 SSD (gp2) の場合は、ストレージサイズに十分なベースライン IOPS とスループットがあることを確認してください。
- IOPS を増やしたり、プロビジョニングされた gp3、io1、io2 を利用するには、ワークロードを調整するか、CPU、メモリ、I/O 容量を増やしたより大きなインスタンスにスケーリングしてください。
トラフィックの急激な増加を確認する
データベースアクティビティが予期せず急増すると、DiskQueueDepth が増加する可能性があります。接続の急増を特定するには、次の操作を行います。
- Amazon CloudWatch メトリクスの DatabaseConnections グラフを確認します。同時接続が多すぎると、読み取りや書き込み操作の負荷が高くなる可能性があります。
- 利用可能な 1000 IOPS ごとにキューの長さが 1 になるようにします。(これは汎用 SSD ボリュームのベースライン、およびプロビジョンド IOPS SSD ボリュームのプロビジョニング量です)
- アプリケーションのパフォーマンスを監視し、要件に応じて調整を行います。
マイクロバーストの問題を確認する
インスタンスがスループットまたは IOPS の上限に達していないにもかかわらず、レイテンシーが高く、キューが長い場合は、インスタンスでマイクロバーストが発生している可能性があります。この問題を解決するには、「EBS ボリュームでマイクロバーストが発生していないかを確認し、パフォーマンスへの影響を防ぐ方法を教えてください」を参照してください。また、拡張モニタリングが有効になっていることを確認し、精度を 1 秒に設定して、マイクロバーストが問題になっているかどうかを特定してください。
効率の悪いクエリを最適化する
効率の悪いクエリを最適化するには、次の操作を行います。
- DiskQueueDepth が高い時間帯に実行されているクエリタイプを確認するには、Performance Insights を使用してください。
- クエリ実行プランを生成するには、EXPLAIN を使用して最適化の機会を特定します。詳細については、PostgreSQL のウェブサイトで「EXPLAIN」を参照してください。
- 過度な I/O の原因となる可能性のあるテーブル全体のスキャン、非効率的な結合、インデックスの欠落がないか確認します。