代表的な面接トピック

データ面接:pg_stat_io を使用して PostgreSQL 18 の I/O をどのように診断しますか?

データ難しい
Offer.cc 編集チーム公開日 更新日

質問

PostgreSQL 18 のアナリティクスワークロードにおいて、データ量の増加に伴いパフォーマンスが低下しました。pg_stat_io と EXPLAIN を使用した調査を設計し、カウンターのスコープとリセットの挙動を説明し、キャッシュ圧力とストレージレイテンシを区別した上で、安全な改善および検証計画を提案してください。

プロンプトとスコープ

対象のワークロードでは、スキャンの遅延、読み取りレイテンシの上昇、および OLTP とアナリティクスが混在するトラフィックが発生しています。PostgreSQL 18 では、バイト単位の pgstatio データやバックエンドごとの統計など、I/O の可視性が向上しています。直感で単一のパラメータを調整するのではなく、これらのビューをクエリプラン、待機イベント、オペレーティングシステムの測定値と組み合わせて、反証可能な診断を組み立ててください。

これは data の質問です。データベースのオブザーバビリティ、ワークロードの推論、および安全なパフォーマンス検証が中核となるスキルであるためです。

面接官が評価するポイント

第一に、pgstatio の行のディメンションを識別し、互換性のないコンテキストを合算しないようにできるか。バックエンドタイプ、オブジェクト、コンテキスト、および操作は、それぞれ異なる I/O ソースを表します。

第二に、累積カウンターを時間枠から切り離して扱えるか。レートの算出には既知の間隔を持つ 2 つのサンプルが必要であり、リセットや再起動を記録する必要があります。

第三に、データベースの証拠をクエリに関連付けられるか。I/O タイミングとバッファを含む EXPLAIN ANALYZE は、プランが読み取り、書き込み、またはプリフェッチを実行しているかを示しますが、システムレベルの証拠を置き換えるものではありません。

第四に、キャッシュミス、チェックポイントの負荷、vacuum の処理、およびストレージの飽和を区別できるか。

第五に、1 つの変数を変更し、正確性を維持しながら、代表的なワークロードに対して結果を検証できるか。

最初に確認すべき明確化のための質問

  • 遅延は単一のクエリ、ワークロードのクラス、それともインスタンス全体で発生していますか?
  • スキーマ、統計情報、データ量、クエリ構成、または PostgreSQL のバージョンに変更はありましたか?
  • ストレージ層における読み取り/書き込みレイテンシ、スループット、およびキューの深さのシグナルはどうなっていますか?
  • 比較期間中に統計情報のリセット、インスタンスの再起動、またはフェイルオーバーは実行されましたか?
  • ワークロードのボトルネックは CPU、メモリ、I/O、ロック、それともクライアントの並行性ですか?
  • 是正措置を制約する正確性とレイテンシの SLO は何ですか?

30秒の回答フレームワーク

「事前と事後の時間枠を設定し、再起動と統計情報のリセットを記録した上で、バックエンドタイプ、オブジェクト、コンテキスト、および操作ごとに pgstatio をサンプリングします。その差分を EXPLAIN ANALYZE の I/O タイミング、バッファ使用状況、待機イベント、チェックポイントおよび vacuum のアクティビティ、OS のレイテンシと関連付けます。ボトルネックを分類し、可逆的な制御を 1 つ変更し、代表的なワークロードを再生して、スループット、テールレイテンシ、正確性、およびリソースのヘッドルームを比較します。」

ステップごとの回答

ステップ 1: 比較可能な時間枠を設定する

PostgreSQL のバージョン、ワークロードの傾向、クエリ ID、再起動時刻、統計リセット時刻、およびストレージトポロジを取得します。レートを把握するのに十分な間隔を空けて pgstatio のサンプルを 2 回取得し、後のリセットをパフォーマンス改善と見誤らないように生のスナップショットを保持します。

sql
SELECT backend_type, object, context, reads, read_bytes,
       writes, write_bytes, read_time, write_time
FROM pg_stat_io;

正確なカラムと権限は対象のメジャーバージョンによって異なります。監視エージェントが使用するドキュメントとクエリを固定してください。

ステップ 2: ディメンションごとに I/O を帰属させる

バックエンドタイプとコンテキストを個別に比較します。クライアントバックエンド、checkpointer、background writer、autovacuum ワーカー、およびメンテナンス操作では、必要な対策が異なります。リレーションデータ、インデックス、および一時ファイルも異なる物理的挙動を示します。「I/O が全体的に高い」という単一の数値で判断することは避けてください。

ステップ 3: 遅延クエリと関連付ける

安全な環境で代表的な EXPLAIN (ANALYZE, BUFFERS, WAL, SETTINGS) を実行し、測定コストを認識した上でのみ I/O タイミングを有効にします。実際の行数、読み取りブロック数、ヒットブロック数、プリフェッチ、および経過時間を比較します。読み取りが多いプランでもスキャンにとっては想定内である場合があるため、問題は読み取りレートとレイテンシがワークロードの許容範囲を超えているかどうかです。

ステップ 4: 競合する原因を切り分ける

デバイスレイテンシが低い状態で読み取りが多い場合は、キャッシュ圧力またはプラン/データサイズの変更が示唆されます。読み取りレイテンシとキューの深さが高い場合は、ストレージの飽和が示唆されます。チェックポイントによる書き込み集中、vacuum のアクティビティ、または一時ファイルの増大は、フォアグラウンドクエリと競合する可能性があります。待機イベントと CPU 使用率は、I/O 待ちとロックまたはエグゼキューターのボトルネックを区別するのに役立ちます。

ステップ 5: 反証可能な仮説を立てる

「新しいパーティションスキャンがキャッシュ容量を超え、ランダム読み取りを引き起こしている」または「チェックポイントの書き込みバーストがフォアグラウンドの読み取りを遅延させている」など、測定可能な主張を述べます。プランの変更、制御されたキャッシュのウォームアップ、チェックポイントのペーシング調整、インデックスやパーティションの修正、ワークロードの分離など、反事実的なテストを選択します。

ステップ 6: 可逆的な是正措置を適用する

ロールバック値と観察期間を設定し、一度に 1 つのパラメータのみを変更します。メモリ、ワーカー数、またはチェックポイント設定をホストの許容量を超えて増やさないでください。根本原因がクエリやデータ配置のデグレである場合は、キャッシュを大きくして隠蔽する前にそれを修正します。

ステップ 7: 検証と証拠の保持

代表的なクエリ構成を再生し、p50 およびテールレイテンシ、スループット、エラー率、読み取り/書き込みバイト数、待機イベント、OS メトリクスを比較します。クエリ結果とレプリケーションの挙動が正しいままであることを確認します。後の再起動や統計リセットが追跡できるように、両方の時間枠のデータと決定記録を保持します。

模範解答

「まず、バージョン、再起動およびリセットの時刻、ワークロードの構成、ストレージメトリクス、そして 2 つの pgstatio スナップショットを取得します。バックエンドタイプ、オブジェクト、コンテキスト、および操作ごとに差分を比較し、疑わしいクエリを EXPLAIN ANALYZE のバッファ、I/O タイミング、WAL、待機イベント、チェックポイントまたは vacuum のアクティビティと関連付けます。累積カウンターや単一のキャッシュヒット率のみを診断の根拠とすることはありません。

キャッシュ圧力、ストレージレイテンシ、チェックポイントの競合、vacuum 処理、またはプランのデグレに分類した後、可逆的な変更を 1 つ適用し、代表的なワークロードを再生します。成功の基準は、正確性、スループット、リソースのヘッドルーム、レプリケーションの挙動を安定させた状態でテールレイテンシを低減させることです。証拠とロールバック値はインシデント記録に残します。」

よくある間違い

  • すべての pgstatio 行を合算する → 互換性のないディメンションにより誤った判断に至る → バックエンド、オブジェクト、コンテキスト、操作ごとにグループ化する。
  • 時間枠を定めずにカウンターを比較する → 実体のないレートが算出される → 時間を記録した差分を取得し、リセットを記録する。
  • キャッシュヒット率を証拠として扱う → ストレージレイテンシやプランの形状が見落とされる → バイト数、タイミング、待機イベント、OS データと関連付ける。
  • 本番環境で闇雲に EXPLAIN ANALYZE を実行する → ワークロードに影響を与える → 安全なレプリカまたは制御されたサンプリングを使用する。
  • 多くの設定を同時に変更する → 因果関係が不明になる → 可逆的な変数を 1 つだけ変更する。
  • vacuum とチェックポイントを無視する → バックグラウンド処理の影響がクエリのせいにされる → バックエンドコンテキストを個別に帰属させる。
  • メモリ増設で対症療法を行う → ホストの負荷が悪化する → まず容量とクエリ/データ配置の原因を検証する。

フォローアップ質問

フォローアップ 1: pgstatio は PostgreSQL 18 の新機能ですか?

このビュー自体はバージョン 18 より前から存在しますが、PostgreSQL 18 ではバイト単位のレポートカラムやバックエンドごとの統計など、さらなる I/O の可視化機能が追加されています。常に導入されているメジャーバージョンのドキュメントを参照してください。

フォローアップ 2: レートはどのように計算しますか?

タイムスタンプ付きのスナップショットを 2 つ取得し、カウンターの差分を経過時間で除算し、その間に発生した再起動や統計リセットを記録します。

フォローアップ 3: read_bytes が高いことは不正なクエリの証明になりますか?

いいえ。大規模なスキャンが意図的な場合もあります。デグレと判断する前に、プランの想定、行数、レイテンシ、キャッシュ状態、およびワークロードの SLO を比較してください。

フォローアップ 4: なぜ backend_type を検査するのですか?

フォアグラウンドクライアント、checkpointer、background writer、autovacuum、メンテナンス処理では、発生する競合パターンと改善の選択肢が異なるためです。

フォローアップ 5: EXPLAIN の I/O タイミングが安全でないのはどのような場合ですか?

高負荷な本番環境のパスでは、測定オーバーヘッドによってレイテンシが歪む可能性があります。レプリカ、サンプリングされたクエリ、または制御された時間枠を使用し、その制限事項を明記してください。

フォローアップ 6: 修正が成功したことは何をもって証明されますか?

代表的なワークロードを繰り返し実行し、正確性、レプリケーション、容量のデグレを起こすことなく、テールレイテンシとスループットが改善し、事前と事後の証拠が保持されていることです。

公開情報ソース

関連する質問