LWLock:MultiXact - Amazon Aurora

LWLock:MultiXact

LWLock:MultiXactMemberBufferLWLock:MultiXactOffsetBufferLWLock:MultiXactMemberSLRU、および LWLock:MultiXactOffsetSLRU の各待機イベントは、特定のテーブル内の同じ行を修正するトランザクションのリストをセッションが取得するのを待っていることを示します。

  • LWLock:MultiXactMemberBuffer – プロセスは、multixact メンバーのシンプルな最も長い時間使われていない (SLRU) バッファの I/O を待っています。

  • LWLock:MultiXactMemberSLRU – プロセスは、multixact メンバーのシンプルな最も長い時間使われていない (SLRU) キャッシュへのアクセスを待っています。

  • LWLock:MultiXactOffsetBuffer – プロセスは、multixact オフセットのシンプルな最も長い時間使われていない (SLRU) バッファの I/O を待っています。

  • LWLock:MultiXactOffsetSLRU – プロセスは、multixact オフセットのシンプルな最も長い時間使われていない (SLRU) キャッシュへのアクセスを待っています。

サポート対象エンジンバージョン

この待機イベント情報は、Aurora PostgreSQL のすべてのバージョンでサポートされています。

Context

multixact は、同じテーブル行を修正するトランザクション ID (XID) のリストを格納するデータ構造です。1 つのトランザクションでテーブル内の行が参照されると、トランザクション ID がテーブルヘッダー行に格納されます。複数のトランザクションでテーブル内の同じ行が参照されると、トランザクション ID のリストは multixact データ構造に格納されます。multixact 待機イベントは、テーブル内の特定の行を参照するトランザクションのリストをセッションがデータ構造から取得していることを示します。

待ち時間増加の考えられる原因

multixact が必要になる場合の一般的な原因は次のとおりです。

  • 明示的なセーブポイントからのサブトランザクション - トランザクションにセーブポイントを明示的に作成すると、同じ行に新しいトランザクションが生成されます。例えば、SELECT FOR UPDATESAVEPOINTUPDATE の順に使用した場合です。

    一部のドライバー、オブジェクトリレーショナルマッパー (ORM)、および抽象化レイヤーには、すべての操作をセーブポイントとともに自動的にラップするための設定オプションがあります。これにより、一部のワークロードで多数の multixact 待機イベントが生成される可能性があります。PostgreSQL JDBC ドライバーの autosave オプションはその一例です。詳細については、PostgreSQL JDBC ドキュメントの「pgJDBC」を参照してください。もう一つの例は、PostgreSQL ODBC ドライバーとその protocol オプションです。詳細については、PostgreSQL ODBC ドライバードキュメントの「psqlODBC Configuration Options」を参照してください。

  • PL/pgSQL EXCEPTION 句からのサブトランザクション – PL/pgSQL 関数またはプロシージャに書き込む各 EXCEPTION 句は、内部で SAVEPOINT を作成します。

  • 外部キー – 複数のトランザクションが親の行で共有ロックを取得する場合。

特定の行が複数のトランザクションオペレーションに含まれる場合、その行を処理するには、multixact リストからトランザクション ID を取得する必要があります。ルックアップによりメモリキャッシュから multixact を取得できない場合は、データ構造を Aurora ストレージレイヤーから読み取る必要があります。このストレージからの I/O により、SQL クエリに時間がかかることがあります。メモリキャッシュミスは、複数のトランザクションの数が多く、使用率が高くなると発生し始める可能性があります。これらのすべての要因が、この待機イベントの増加の原因となっています。

アクション

待機イベントの原因に応じて、異なるアクションをお勧めします。これらのアクションの一部は、待機イベントを即座に削減するのに役立ちます。ただし、アクションによっては、ワークロードをスケールするために調査と修正が必要な場合があります。

この待機イベントがあるテーブルでバキュームフリーズを実行する

この待機イベントが突然急増して本番環境に影響する場合は、次のいずれかの一時的な方法を使用してその数を減らすことができます。

  • 影響を受けるテーブルまたはテーブルパーティションで VACUUM FREEZE を使用して、問題を即座に解決します。詳細については、「VACUUM」を参照してください。

  • VACUUM (FREEZE、INDEX_CLEANUP FALSE) 句を使用すると、インデックスをスキップしてクイックバキュームを実行できます。詳細については、「テーブルをできるだけ早くバキューム処理する」を参照してください。

この待機イベントがあるテーブルで autovacuum の頻度を上げる

すべてのデータベースのすべてのテーブルをスキャンした後、VACUUM は最終的に multixact を削除し、最も古い multixact 値が前に送られます。詳細については、「Multixacts と Wraparound」を参照してください。LWLock:MultiXact 待機イベントを最小限に抑えるには、必要な頻度で VACUUM を実行する必要があります。そのためには、Aurora PostgreSQL DB クラスターの VACUUM が最適に設定されていることを確認します。

影響を受けたテーブルまたはテーブルパーティションで VACUUM FREEZE を使用して待機イベントの問題を解決する場合は、インスタンスレベルで autovacuum を調整する代わりに、pg_cron などのスケジューラを使用して VACUUM を実行することをお勧めします。

autovacuum をより頻繁に実行するため、影響を受けるテーブルの autovacuum_multixact_freeze_max_age ストレージパラメータの値を減らすことができます。詳細については、「autovacuum_multixact_freeze_max_age」を参照してください。

メモリパラメータを増加する

以下のパラメータをクラスターレベルで設定することで、クラスター内のすべてのインスタンスの整合性を維持できます。これにより、ワークロードの待機イベントを減らすことができます。メモリを不足させないように、これらの値をあまり高く設定しないことをお勧めします。

  • multixact_offsets_cache_size ~ 128

  • multixact_members_cache_size ~ 256

パラエータのインスタンスを再起動して変更を有効にします。これらのパラメータを使うと、ディスクに書き込むことなく、より多くのインスタンス RAM を使用して multixact 構造をメモリに保存できます。

実行時間が長いトランザクションを削減する

実行時間が長いトランザクションでは、トランザクションがコミットされるか、読み取り専用トランザクションが閉じられるまで、バキュームにその情報が保持されます。長時間実行トランザクションを積極的にモニタリングし、管理することをお勧めします。詳細については、「データベースがトランザクション接続で長時間アイドル状態になっている」を参照してください。実行の長いトランザクションの使用を避けるか、最小限に抑えるようにアプリケーションを変更してみてください。

長時間のアクション

ワークロードを調べて、multixact スピルオーバーの原因を見つけます。ワークロードをスケーリングして待機イベントを減らすには、この問題を修正する必要があります。

  • テーブルの作成に使用する DDL (データ定義言語) を分析する必要があります。テーブル構造とインデックスが適切に設計されていることを確認します。

  • 影響を受けるテーブルに外部キーがある場合、それらが必要かどうか、または参照整合性を強制する別の方法があるかどうかを確認します。

  • テーブルに未使用のインデックスが大量にある場合、autovacuum がワークロードに適合せず、実行がブロックされる可能性があります。これを回避するには、未使用のインデックスをチェックし、それらを完全に削除します。詳細については、「大量のインデックスでの autovacuum の管理」を参照してください。

  • トランザクションでのセーブポイントの使用を減らします。