Aurora PostgreSQL での識別不能なバキュームブロック要因の解決 - Amazon Aurora

Aurora PostgreSQL での識別不能なバキュームブロック要因の解決

このセクションでは、バキューム処理の進行を妨げる可能性のあるその他の理由について説明します。以下の問題は、現在、postgres_get_av_diag() 関数によって直接識別できません。

インデックスの不整合

論理的に整合性のないインデックスによって、自動バキュームの進行が妨げられる場合があります。次のエラーまたは同様のエラーは、インデックスのバキュームフェーズ中、または SQL ステートメントによってインデックスがアクセスされるときにログに記録されます。

ERROR: right sibling's left-link doesn't match:block 5 links to 10 instead of expected 2 in index ix_name
ERROR: failed to re-find parent key in index "XXXXXXXXXX" for deletion target page XXX CONTEXT: while vacuuming index index_name of relation schema.table

ガイダンス

手動 VACUUM FREEZEINDEX_CLEANUP を使用してインデックスを再構築するか、インデックスを省略します。

  • CONCURRENTLY オプションの使用 – PostgreSQL バージョン 12 より前のバージョンでは、インデックスを再構築するには、排他的テーブルロックによってテーブルへのアクセスを制限する必要がありました。PostgreSQL バージョン 12 以降のバージョンでは、CONCURRENTLY オプションにより行レベルのロックが可能になり、テーブルの可用性が大幅に向上しています。コマンドは以下のとおりです。

    REINDEX INDEX ix_name CONCURRENTLY;

    CONCURRENTLY はそれほど破壊的ではありませんが、ビジー状態のテーブルでは時間がかかる場合があります。可能であれば、トラフィックが少ない時間帯にインデックスを構築することを検討してください。詳細については、「PostgreSQL ドキュメント」の「REINDEX」を参照してください。

  • INDEX_CLEANUP FALSE オプションの使用 – インデックスが大きく、完了までにかなりの時間がかかると予想される場合は、インデックスを除外しながら手動 VACUUM FREEZE を実行して自動バキュームのブロックを解除できます。この機能は PostgreSQL バージョン 12 以降で使用できます。

    インデックスを無視すると、整合性のないインデックスのバキュームプロセスを省略して、循環の問題を軽減できます。ただし、無効なページの根本的な問題は解決されません。無効なページの問題に完全に対処し、これを解決するには、インデックスを再構築する必要があります。

トランザクションレートが極めて高い

PostgreSQL では、トランザクションレートが高いと自動バキュームのパフォーマンスに大きな影響を与え、デッドタプルのクリーンアップが遅くなり、トランザクション ID の循環のリスクが高まります。トランザクションレートは、2 つの期間 (通常は 1 秒ごと) の max(age(datfrozenxid)) の差を測定することでモニタリングできます。さらに、RDS Performance Insights の次のカウンターメトリクスを使用して、トランザクションの合計数であるトランザクションレート (xact_commit と xact_rollback の合計) を測定できます。

Counter タイプ 単位 メトリクス

xact_commit

トランザクション

1 秒あたりのコミット数

db.Transactions.xact_commit

xact_rollback

トランザクション

1 秒あたりのロールバック数

db.Transactions.xact_rollback

急激な増加は、トランザクション負荷が高いことを示しており、自動バキュームが過負荷になり、肥大化、ロック競合、および潜在的なパフォーマンスの問題が発生する可能性があります。これにより、以下のような点で自動バキュームプロセスに悪影響が及ぶ可能性があります。

  • テーブルアクティビティ: バキューム処理されている特定のテーブルで大量のトランザクションが発生し、遅延が発生する可能性があります。

  • システムリソース: システム全体が過負荷になっている可能性があるため、自動バキュームが効率的に機能するために必要なリソースにアクセスすることが困難になります。

自動バキュームをより効果的に動作させ、遅延なくタスクに対処するために、次の戦略を検討してください。

  1. 可能であれば、トランザクションレートを下げます。可能な場合は、類似したトランザクションをバッチ処理またはグループ化することを検討してください。

  2. オフピークの時間帯は、毎晩、毎週、または隔週の手動 VACUUM FREEZE オペレーションで頻繁に更新されるテーブルをターゲットにします。

  3. インスタンスクラスをスケールアップして、大量のトランザクションと自動バキュームを処理するためにより多くのシステムリソースを割り当てることを検討してください。