Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
io/aurora_redo_log_flush
Peristiwa io/aurora_redo_log_flush
terjadi ketika sesi menulis data persisten ke penyimpanan Amazon Aurora.
Versi mesin yang didukung
Informasi peristiwa tunggu ini didukung untuk versi mesin berikut:
-
Aurora Versi saya 2 SQL
Konteks
io/aurora_redo_log_flush
Acara ini untuk operasi tulisinput/output (I/O) di Aurora My. SQL
Kemungkinan penyebab peningkatan peristiwa tunggu
Untuk persistensi data, commit memerlukan penulisan durabel ke penyimpanan yang stabil. Jika basis data terlalu banyak melakukan commit, terdapat peristiwa tunggu pada operasi I/O tulis, yakni peristiwa tunggu io/aurora_redo_log_flush
.
Dalam contoh berikut, 50.000 catatan dimasukkan ke dalam cluster Aurora My SQL DB menggunakan kelas instans db.r5.xlarge DB:
-
Pada contoh pertama, setiap sesi menyisipkan 10.000 catatan baris demi baris. Secara default, jika perintah bahasa manipulasi data (DML) tidak ada dalam transaksi, Aurora My SQL menggunakan commit implisit. Autocommit diaktifkan. Ini berarti terdapat commit untuk setiap penyisipan baris. Wawasan Performa menunjukkan bahwa koneksi menghabiskan sebagian besar waktunya menunggu peristiwa tunggu
io/aurora_redo_log_flush
.Hal ini disebabkan oleh pernyataan sisipan sederhana yang digunakan.
Diperlukan waktu 3,5 menit untuk menyisipkan 50.000 catatan.
-
Dalam contoh kedua, sisipan dibuat dalam 1.000 batch, yakni setiap koneksi melakukan 10 commit, bukan 10.000. Wawasan Performa menunjukkan bahwa koneksi tidak menghabiskan sebagian besar waktunya untuk peristiwa tunggu
io/aurora_redo_log_flush
.Diperlukan waktu 4 detik untuk menyisipkan 50.000 catatan.
Tindakan
Kami merekomendasikan berbagai tindakan, tergantung pada penyebab peristiwa tunggu Anda.
Topik
Mengidentifikasi sesi dan kueri yang bermasalah
Jika instans DB Anda mengalami kemacetan, langkah pertama adalah menemukan sesi dan kueri yang menjadi penyebabnya. Untuk posting Blog AWS Database yang berguna, lihat Menganalisis SQL Beban Kerja Saya Amazon Aurora dengan Performance Insights
Untuk mengidentifikasi sesi dan kueri yang menyebabkan kemacetan:
Masuk ke AWS Management Console dan buka RDS konsol Amazon di https://console.aws.amazon.com/rds/
. -
Di panel navigasi, pilih Wawasan Performa.
-
Pilih instans DB Anda.
-
Di Beban basis data, pilih Potong berdasarkan masa tunggu.
-
Di bagian bawah halaman, pilih Top SQL.
Kueri di bagian atas daftar adalah penyebab beban tertinggi pada basis data.
Mengelompokkan operasi tulis
Contoh berikut memicu peristiwa tunggu io/aurora_redo_log_flush
. (Autocommit diaktifkan.)
INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx'); INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx'); INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx'); .... INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx'); UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE id=xx; UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE id=xx; UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE id=xx; .... UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE id=xx; DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx; DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx; DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx; .... DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx;
Dalam upaya mengurangi waktu yang dihabiskan untuk menunggu peristiwa tunggu io/aurora_redo_log_flush
, kelompokkan operasi tulis secara logis ke dalam satu commit guna mengurangi panggilan persisten ke penyimpanan.
Menonaktifkan autocommit
Nonaktifkan autocommit sebelum membuat perubahan besar yang tidak ada dalam transaksi, seperti yang ditunjukkan pada contoh berikut.
SET SESSION AUTOCOMMIT=OFF; UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE sampleCol1=xx; UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE sampleCol1=xx; UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE sampleCol1=xx; .... UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE sampleCol1=xx; -- Other DML statements here COMMIT; SET SESSION AUTOCOMMIT=ON;
Menggunakan transaksi
Anda dapat menggunakan transaksi, seperti yang ditunjukkan pada contoh berikut.
BEGIN INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx'); INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx'); INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx'); .... INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx'); DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx; DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx; DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx; .... DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx; -- Other DML statements here END
Menggunakan batch
Anda dapat membuat perubahan dalam batch, seperti yang ditunjukkan pada contoh berikut. Namun, menggunakan batch yang terlalu besar dapat menyebabkan masalah kinerja, terutama pada replika baca atau saat melakukan point-in-time recovery ()PITR.
INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx'),('xxxx','xxxxx'),...,('xxxx','xxxxx'),('xxxx','xxxxx'); UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE sampleCol1 BETWEEN xx AND xxx; DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1<xx;