LWLock: MultiXact - Amazon Aurora

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

LWLock: MultiXact

Peristiwa tunggu LWLock:MultiXactMemberBuffer, LWLock:MultiXactOffsetBuffer, LWLock:MultiXactMemberSLRU, dan LWLock:MultiXactOffsetSLRU menunjukkan bahwa sesi sedang menunggu pengambilan daftar transaksi yang memodifikasi baris yang sama pada tabel tertentu.

  • LWLock:MultiXactMemberBuffer – Suatu proses sedang menunggu I/O pada buffer simple least-recently used (SLRU) untuk anggota multixact.

  • LWLock:MultiXactMemberSLRU – Suatu proses sedang menunggu akses cache simple least-recently used (SLRU) untuk anggota multixact.

  • LWLock:MultiXactOffsetBuffer – Suatu proses sedang menunggu I/O pada buffer simple least-recently used (SLRU) untuk offset multixact.

  • LWLock:MultiXactOffsetSLRU – Suatu proses sedang menunggu akses cache simple least-recently used (SLRU) untuk offset multixact.

Versi mesin yang didukung

Informasi peristiwa tunggu ini didukung untuk semua versi Aurora PostgreSQL.

Konteks

Multixact adalah struktur data yang menyimpan daftar ID transaksi (XID) yang memodifikasi baris tabel yang sama. Saat satu transaksi merujuk suatu baris dalam tabel, ID transaksi disimpan pada baris header tabel. Saat beberapa transaksi merujuk baris yang sama pada tabel, daftar ID transaksi disimpan dalam struktur data multixact. Peristiwa tunggu multixact menunjukkan bahwa sesi mengambil dari struktur data daftar transaksi yang merujuk ke baris tertentu dalam tabel.

Kemungkinan penyebab peningkatan peristiwa tunggu

Tiga penyebab umum penggunaan multixact adalah sebagai berikut:

  • Subtransaksi dari titik simpan eksplisit – Secara eksplisit membuat titik simpan pada transaksi Anda yang memunculkan transaksi baru untuk baris yang sama. Misalnya, menggunakan SELECT FOR UPDATE, lalu SAVEPOINT, dan UPDATE.

    Beberapa driver, object-relational mappers (ORM), dan lapisan abstraksi memiliki opsi konfigurasi untuk secara otomatis membungkus semua operasi dengan titik simpan. Hal ini dapat membuat banyak peristiwa tunggu multixact di beberapa beban kerja. Opsi autosave Driver JDBC PostgreSQL adalah contohnya. Untuk informasi selengkapnya, lihat pgJDBC pada dokumentasi JDBC PostgreSQL. Contoh lainnya adalah driver ODBC PostgreSQL dan opsi protocol. Untuk informasi selengkapnya, lihat Opsi Konfigurasi psqlODBC pada dokumentasi driver ODBC PostgreSQL.

  • Subtransaksi dari klausa PL/pgSQL EXCEPTION – Setiap klausa EXCEPTION yang Anda tulis dalam fungsi atau prosedur PL/pgSQL membuat SAVEPOINT secara internal.

  • Kunci asing – Beberapa transaksi memperoleh kunci bersama pada catatan induk.

Saat baris tertentu disertakan dalam beberapa operasi transaksi, pemrosesan baris memerlukan pengambilan ID transaksi dari daftar multixact. Jika pencarian tidak mendapatkan multixact dari cache memori, struktur data harus dibaca dari lapisan penyimpanan Aurora. I/O dari penyimpanan ini berarti kueri SQL dapat memerlukan waktu lebih lama. Kesalahan cache memori dapat mulai terjadi dengan penggunaan yang berat karena jumlah transaksi ganda yang besar. Semua faktor ini berkontribusi pada peningkatan peristiwa tunggu ini.

Tindakan

Kami merekomendasikan berbagai tindakan, tergantung pada penyebab peristiwa tunggu Anda. Beberapa tindakan ini dapat membantu untuk segera mengurangi peristiwa tunggu. Namun, yang lainnya mungkin memerlukan penyelidikan dan koreksi untuk menskalakan beban kerja Anda.

Lakukan pembekuan vakum di atas tabel dengan peristiwa tunggu ini

Jika peristiwa tunggu ini melonjak mendadak dan mempengaruhi lingkungan produksi, Anda dapat menggunakan salah satu metode sementara berikut untuk mengurangi penghitungannya.

  • Gunakan VACUUM FREEZE pada tabel atau partisi tabel yang terpengaruh untuk segera menyelesaikan masalah. Untuk informasi selengkapnya, lihat VACUUM.

  • Gunakan klausa VACUUM (FREEZE, INDEX_CLEANUP FALSE) untuk melakukan vakum cepat dengan melewati indeks. Untuk informasi selengkapnya, lihat Memvakum tabel secepat mungkin.

Tingkatkan frekuensi autovacuum pada tabel dengan peristiwa tunggu ini

Setelah memindai semua tabel di semua basis data, VACUUM akan menghapus multixact, dan nilai multixact tertua akan dimajukan. Untuk informasi selengkapnya, lihat Multixact dan Wraparound. Untuk menjaga LWLock: MultiXact tunggu acara seminimal mungkin, Anda harus menjalankan VACUUM sesering yang diperlukan. Untuk melakukannya, pastikan bahwa VACUUM di klaster DB Aurora PostgreSQL Anda dikonfigurasi secara optimal.

Jika menggunakan VACUUM FREEZE pada tabel atau partisi tabel yang terpengaruh menyelesaikan masalah peristiwa tunggu, sebaiknya gunakan penjadwal, seperti pg_cron, untuk melakukan VACUUM daripada menyesuaikan autovacuum pada tingkat instans.

Agar autovacuum terjadi lebih sering, Anda dapat mengurangi nilai parameter penyimpanan autovacuum_multixact_freeze_max_age pada tabel yang terpengaruh. Untuk informasi selengkapnya, lihat autovacuum_multixact_freeze_max_age.

Meningkatkan parameter memori

Anda dapat mengatur parameter berikut di tingkat klaster, sehingga semua instans pada klaster Anda tetap konsisten. Hal ini membantu mengurangi peristiwa tunggu pada beban kerja Anda. Kami merekomendasikan Anda untuk tidak mengatur nilai-nilai ini terlalu tinggi sehingga kehabisan memori.

  • multixact_offsets_cache_size ke 128

  • multixact_members_cache_size ke 256

Anda harus boot ulang instans agar perubahan parameter diterapkan. Dengan parameter ini, Anda dapat menggunakan lebih banyak RAM instans untuk menyimpan struktur multixact di memori sebelum tumpah ke disk.

Mengurangi transaksi jangka panjang

Transaksi jangka panjang menyebabkan vakum mempertahankan informasinya hingga transaksi tersebut dilakukan atau hingga transaksi hanya dibaca ditutup. Kami merekomendasikan Anda untuk secara proaktif memantau dan mengelola transaksi jangka panjang. Untuk informasi selengkapnya, lihat Basis data telah lama idle dalam koneksi transaksi. Cobalah untuk memodifikasi aplikasi Anda untuk menghindari atau meminimalkan penggunaan transaksi jangka panjang Anda.

Tindakan jangka panjang

Periksa beban kerja Anda untuk menemukan penyebab limpahan multixact. Anda harus memperbaiki masalah tersebut untuk menskalakan beban kerja Anda dan mengurangi peristiwa tunggu.

  • Anda harus menganalisis DDL (data definition language) yang digunakan untuk membuat tabel Anda. Pastikan bahwa struktur dan indeks tabel dirancang dengan baik.

  • Saat tabel yang terpengaruh memiliki kunci asing, tentukan apakah diperlukan atau jika ada cara lain untuk memberlakukan integritas referensial.

  • Saat sebuah tabel memiliki indeks besar yang tidak digunakan, hal tersebut dapat menyebabkan autovacuum tidak sesuai dengan beban kerja Anda dan mungkin memblokirnya agar tidak berjalan. Untuk menghindari hal ini, periksa indeks yang tidak digunakan dan hapus sepenuhnya. Untuk informasi selengkapnya, lihat Mengelola autovacuum dengan indeks besar.

  • Kurangi penggunaan titik simpan dalam transaksi Anda.