全部产品
Search
文档中心

ApsaraDB RDS:Memecahkan masalah konsumsi memori pada instance ApsaraDB RDS for MySQL

更新时间:Jul 02, 2025

Topik ini menjelaskan cara memecahkan masalah konsumsi memori pada instance ApsaraDB RDS for MySQL.

Informasi latar belakang

Penggunaan memori dan rasio hit pool buffer adalah dua metrik penting untuk mengukur konsumsi memori keseluruhan dari instance RDS Anda. Jika penggunaan memori terlalu tinggi, risiko kehabisan memori meningkat. Jika rasio hit pool buffer sangat rendah, sejumlah besar halaman data yang diminta tidak dapat ditemukan di pool buffer. Akibatnya, ApsaraDB RDS perlu membaca data dari disk, meningkatkan operasi I/O dan latensi kueri.

Lihat konsumsi memori

Konsol ApsaraDB RDS menyediakan berbagai metode untuk melihat konsumsi memori:

  • Pemantauan dan Peringatan

    Di panel navigasi sisi kiri, klik Monitoring and Alerts. Pada halaman yang muncul, klik tab Standard Monitoring untuk melihat metrik MySQL CPU Utilization/Memory Usage dan InnoDB Buffer Pool Hit Ratio.

    Penggunaan MemoriRasio Hit Cache

  • Database Autonomy Service (DAS)

    Di panel navigasi sisi kiri, pilih Autonomy Service > Dashboard. Pada halaman yang muncul, klik tab Performance Trends. Kemudian, Anda dapat melihat metrik MySQL CPU Utilization/Memory Usage dan InnoDB Buffer Pool Hit Ratio.

    Utilisasi MemoriRasio Hit Cache

Anda juga dapat menggunakan mesin penyimpanan PERFORMANCE_SCHEMA untuk mengonfigurasi instrumen memori, memungkinkan Anda menggabungkan statistik penggunaan memori ke dalam tabel ringkasan memori. Untuk informasi lebih lanjut, lihat Dokumentasi MySQL.

  • Untuk mengaktifkan pemantauan memori saat instance RDS Anda mulai, atur parameter performance_schema ke ON jika instance menjalankan MySQL 5.6, atau ke 1 jika instance menjalankan MySQL 5.7 atau MySQL 8.0. Untuk informasi lebih lanjut, lihat Lihat Parameter Instance ApsaraDB RDS for MySQL. Kemudian, restart instance RDS Anda agar pengaturan tersebut berlaku.

  • Untuk mengaktifkan pemantauan memori saat instance RDS Anda sedang berjalan, jalankan perintah berikut:

    update performance_schema.setup_instruments set enabled = 'yes' where name like 'memory%';

Tabel-tabel berikut menunjukkan konsumsi memori dari berbagai dimensi:

  • Tabel memory_summary_by_account_by_event_name memberikan peristiwa dan nama peristiwa yang sesuai dengan akun tertentu. Akun ditentukan oleh kombinasi pengguna dan host.

  • Tabel memory_summary_by_host_by_event_name memberikan peristiwa dan nama peristiwa yang sesuai dengan host tertentu.

  • Tabel memory_summary_by_thread_by_event_name memberikan peristiwa dan nama peristiwa yang sesuai dengan thread tertentu.

  • Tabel memory_summary_by_user_by_event_name memberikan peristiwa dan nama peristiwa yang sesuai dengan pengguna tertentu.

  • Tabel memory_summary_global_by_event_name memberikan peristiwa yang sesuai dengan nama peristiwa tertentu.

Penyebab umum penggunaan memori yang terlalu tinggi

Dalam kondisi normal, pool buffer InnoDB mengonsumsi memori paling banyak. Maksimum memori yang dapat dikonsumsi oleh pool buffer bervariasi berdasarkan pengaturan parameter pool buffer. Sebagian besar memori dialokasikan secara dinamis dan disesuaikan saat permintaan diproses. Konsumsi memori mencakup memori yang digunakan oleh tabel sementara dalam memori, cache prefetch, cache tabel, indeks hash, dan objek kunci baris. Untuk informasi lebih lanjut tentang penggunaan memori dan batas parameter, lihat Cara MySQL Menggunakan Memori.

Kueri multi-pernyataan

MySQL memungkinkan Anda menggabungkan beberapa pernyataan SQL menjadi satu kueri. Pernyataan SQL ini dipisahkan oleh tanda titik koma (;) dalam kueri dan dikirim ke MySQL sekaligus. MySQL memproses pernyataan SQL ini satu per satu, tetapi beberapa memori dilepaskan hanya setelah semua pernyataan SQL dieksekusi.

Jika sejumlah besar pernyataan SQL dikirim sekaligus, akumulasi memori yang dikonsumsi oleh berbagai objek untuk mengeksekusi pernyataan SQL ini meningkat secara signifikan, bisa mencapai beberapa ratus MB. Hal ini dapat menghabiskan memori yang tersedia untuk proses MySQL.

Dalam kondisi normal, jika sejumlah besar pernyataan SQL dikirim sekaligus, Anda dapat mendeteksi peningkatan mendadak dalam lalu lintas jaringan menggunakan fitur pemantauan dan peringatan atau fitur Penjelajah SQL. Kami merekomendasikan agar Anda tidak menjalankan kueri multi-pernyataan.

Memori Habis

Masalah pool buffer

Halaman data dari semua tabel disimpan di pool buffer. Jika halaman data yang diminta ditemukan di pool buffer, sistem tidak melakukan operasi I/O fisik. Dalam kasus ini, sistem mengeksekusi pernyataan SQL dengan kecepatan tinggi. Selain itu, pool buffer menggunakan algoritma caching LRU (Least Recently Used) untuk mengelola halaman data, memungkinkan pool buffer menyimpan semua halaman kotor di daftar flush.

Ukuran default pool buffer InnoDB diatur menjadi 75% dari kapasitas memori yang disediakan oleh instance RDS Anda.

Berikut adalah masalah umum yang terkait dengan pool buffer yang mungkin terjadi:

  • Halaman data tidak cukup dipanaskan sebelumnya, meningkatkan latensi kueri. Masalah ini dapat terjadi jika Anda me-restart instance RDS Anda, membaca data dingin, atau mengalami rasio hit pool buffer yang rendah. Sebelum meningkatkan instance RDS Anda atau meluncurkan promosi penjualan, kami merekomendasikan agar Anda memanaskan halaman data secara memadai.

  • Akumulasi halaman kotor yang berlebihan. Misalnya, halaman kotor belum diperbarui selama periode waktu yang lama. Dalam kasus ini, jika perbedaan antara nomor urutan log (LSN) awal dan saat ini dari halaman kotor melebihi 76%, thread pengguna dipicu untuk memperbarui halaman kotor secara sinkron, menurunkan kinerja instance RDS Anda secara signifikan. Untuk menyelesaikan masalah ini, Anda dapat menyeimbangkan beban tulis, mencegah throughput yang terlalu tinggi untuk operasi tulis, mengonfigurasi ulang parameter yang menentukan cara memperbarui halaman kotor, dan meningkatkan instance RDS Anda.

  • Instance RDS Anda menyediakan kapasitas memori yang besar, namun parameter innodb_buffer_pool_instances diatur ke nilai yang kecil. Dalam kasus ini, jika QPS tinggi, persaingan sengit untuk kunci di pool buffer terjadi. Kami merekomendasikan agar Anda mengatur parameter innodb_buffer_pool_instances ke 8, 16, atau nilai yang lebih besar.

Masalah tabel sementara

Ukuran tabel sementara dalam memori dibatasi oleh parameter tmp_table_size dan max_heap_table_size. Jika ukuran tabel sementara dalam memori melebihi batas, tabel sementara dalam memori diubah menjadi tabel sementara di disk. Jika sejumlah besar tabel sementara dibuat melalui sejumlah koneksi, penggunaan memori instance RDS Anda tiba-tiba meningkat. MySQL 8.0 menyediakan mesin TempTable baru. Mesin ini menentukan bahwa total ukuran tabel sementara dalam memori yang dibuat oleh semua thread harus lebih kecil dari nilai parameter temptable_max_ram. Nilai default dari temptable_max_ram adalah 1 GB. Jika total ukuran melebihi nilai parameter ini, tabel sementara dalam memori yang lebih lama diubah menjadi tabel sementara di disk.

Masalah lainnya

Jika sejumlah besar tabel dibuat pada instance RDS Anda atau QPS tinggi, cache tabel dapat mengonsumsi sejumlah memori tertentu. Kami merekomendasikan agar Anda tidak membuat sejumlah besar tabel atau mengatur parameter table_open_cache ke nilai yang besar.

Konsumsi memori default untuk indeks hash adaptif diatur menjadi 1/64 dari ukuran pool buffer. Jika Anda mengkueri atau menulis bidang besar dari tipe data binary large object (BLOB), memori dialokasikan secara dinamis untuk bidang besar ini, meningkatkan penggunaan memori instance RDS Anda.

Penggunaan memori instance RDS Anda dapat meningkat karena sejumlah masalah lainnya. Jika penggunaan memori meningkat secara abnormal atau memori habis, Anda dapat memecahkan masalah dengan mengikuti petunjuk yang diberikan di Dokumentasi MySQL.