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 MySQL versi 2
Konteks
Peristiwa io/aurora_redo_log_flush
ditujukan untuk operasi input/output (I/O) tulis di Aurora MySQL.
catatan
Di Aurora MySQL versi 3, peristiwa tunggu ini disebut io/redo_log_flush.
Kemungkinan penyebab peningkatan peristiwa tunggu
Untuk persistensi data, commit memerlukan penulisan tahan lama 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, sebanyak 50.000 catatan dimasukkan ke dalam klaster DB Aurora MySQL menggunakan kelas instans DB db.r5.xlarge:
-
Pada contoh pertama, setiap sesi menyisipkan 10.000 catatan baris demi baris. Secara default, jika perintah bahasa manipulasi data (DML) tidak berada dalam transaksi, Aurora MySQL akan 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.
Mengidentifikasi sesi dan kueri yang bermasalah
Jika instans DB Anda mengalami kemacetan, langkah pertama adalah menemukan sesi dan kueri yang menjadi penyebabnya. Untuk postingan Blog Basis Data AWS yang berguna, lihat Menganalisis Beban Kerja Amazon Aurora MySQL dengan Wawasan Performa
Untuk mengidentifikasi sesi dan kueri yang menyebabkan kemacetan:
Masuk ke AWS Management Console, lalu buka konsol Amazon RDS 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 SQL Teratas.
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 pemulihan (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;