All Products
Search
Document Center

ApsaraDB RDS:Alokasi memori MySQL

Last Updated:Mar 29, 2026

Memori instans RDS dibagi menjadi dua kategori: shared memory dan session-specific private memory. Shared memory dialokasikan sekali saat startup instans dan digunakan bersama oleh semua koneksi. Session-specific private memory dialokasikan per koneksi sesuai kebutuhan—setiap kueri aktif yang memerlukan pengurutan, penggabungan (joining), atau pembacaan data langsung mengklaim ukuran buffer penuhnya. Pada kondisi konkurensi tinggi, alokasi per koneksi ini merupakan penyebab utama error out-of-memory (OOM) serta alih bencana (failover) antara primary dan secondary.

Cara menghitung memori

Rumus berikut menunjukkan cara memperkirakan total penggunaan memori:

Total memory ≈ Shared memory
             + max_connections × per-session memory per connection
KomponenParameter
Shared memoryinnodb_buffer_pool_size + innodb_log_buffer_size + innodb_additional_mem_pool_size + key_buffer_size + query_cache_size
Per-session memorysort_buffer_size + read_buffer_size + read_rnd_buffer_size + join_buffer_size + binlog_cache_size + tmp_table_size

Shared memory

Jalankan kueri berikut untuk memeriksa alokasi shared memory:

SHOW VARIABLES WHERE Variable_name IN (
  'innodb_buffer_pool_size',
  'innodb_log_buffer_size',
  'innodb_additional_mem_pool_size',
  'key_buffer_size',
  'query_cache_size'
);

Output berikut berasal dari instans 240 MB:

+---------------------------------+-----------------+
| Variable_name                   | Value           |
+---------------------------------+-----------------+
| innodb_additional_mem_pool_size | 2097152         |
| innodb_buffer_pool_size         | 67108864        |
| innodb_log_buffer_size          | 1048576         |
| key_buffer_size                 | 16777216        |
| query_cache_size                | 0               |
+---------------------------------+-----------------+

Parameter

ParameterNilai default pada RDSDeskripsi
innodb_buffer_pool_size64 MB (instans 240 MB)Kolam buffer InnoDB. Menyimpan halaman data, halaman indeks, halaman undo, insert buffers, adaptive hash indexes, lock, dan kamus data. Semua operasi baca/tulis SQL dilakukan pada kolam buffer, bukan file data fisik — data dituliskan ke disk belakangan melalui checkpoint. Kolam buffer yang lebih besar meningkatkan performa baca/tulis tetapi memperpanjang waktu pemulihan kesalahan.
innodb_log_buffer_size1 MBBuffer log InnoDB. Menyimpan redo log sebelum disimpan ke disk. Proses flushing dipicu setiap detik oleh master thread, pada setiap commit transaksi, dan ketika ruang buffer tersedia turun di bawah separuh ukuran totalnya. Nilai 1 MB sudah cukup untuk sebagian besar beban kerja.
innodb_additional_mem_pool_size2 MBMenyimpan struktur data internal InnoDB. Tingkatkan nilai ini jika instans Anda memiliki jumlah tabel yang besar.
key_buffer_size16 MBMenyimpan cache indeks tabel MyISAM. Untuk tabel MyISAM, cache indeks disimpan di key_buffer, sedangkan cache data disimpan di memori sistem operasi. Diatur ke 16 MB untuk semua instans RDS.
query_cache_size0 (dinonaktifkan)Menyimpan cache hasil kueri berdasarkan hash pernyataan SQL. Dinonaktifkan pada instans RDS. Cache ini tidak valid setiap kali tabel dimodifikasi, sehingga tidak cocok untuk beban kerja dengan banyak operasi tulis.

Session-specific private memory

Berbeda dengan shared memory, buffer sesi tidak dialokasikan sebelumnya saat startup. Setiap nilai parameter dialokasikan secara penuh ketika kueri membutuhkannya. Dengan banyak koneksi bersamaan, alokasi kumulatif dapat melebihi kapasitas memori yang tersedia, sehingga memicu error OOM.

Jalankan kueri berikut untuk memeriksa alokasi memori sesi:

SHOW VARIABLES WHERE Variable_name IN (
  'read_buffer_size',
  'read_rnd_buffer_size',
  'sort_buffer_size',
  'join_buffer_size',
  'binlog_cache_size',
  'tmp_table_size'
);

Contoh output:

+-------------------------+-----------------+
| Variable_name           | Value           |
+-------------------------+-----------------+
| binlog_cache_size       | 262144          |
| join_buffer_size        | 262144          |
| read_buffer_size        | 262144          |
| read_rnd_buffer_size    | 262144          |
| sort_buffer_size        | 262144          |
| tmp_table_size          | 262144          |
+-------------------------+-----------------+

Parameter

ParameterNilai default pada RDSDapat dimodifikasi di konsolDeskripsi
read_buffer_size256 KBTidakBuffer pemindaian sekuensial. Dipindai sebelum pembacaan fisik untuk mengurangi I/O.
read_rnd_buffer_size256 KBTidakBuffer pemindaian acak. Digunakan ketika baris dibaca dalam urutan terurut setelah pemindaian indeks.
sort_buffer_size256 KBTidakBuffer pengurutan untuk operasi ORDER BY dan GROUP BY. Jika data yang diurutkan melebihi ukuran ini, MySQL membuat tabel temporary di disk. Pada Linux, mengatur nilai ini di atas 2 MB mengubah alokasi memori dari malloc() ke mmap(), yang mengurangi efisiensi.
join_buffer_size256 KBTidakBuffer operasi join. ApsaraDB RDS for MySQL hanya mendukung algoritma nested loop join. Tabel non-driving disimpan dalam buffer ini untuk menghindari kontensi pada kolam buffer.
binlog_cache_size256 KBTidakCache log biner. Menyimpan log transaksi sebelum commit; disimpan ke file log biner di disk setelah commit.
tmp_table_size256 KBYaUkuran maksimum tabel temporary di memori. Jika suatu kueri membuat tabel temporary yang melebihi batas ini, MySQL mengonversinya menjadi tabel MyISAM di disk. Jika Anda melihat error berikut, tingkatkan nilai ini: [Err] 1114 - The table '/home/mysql/data3081/tmp/#sql_6197_2' is full
Catatan: Hanya tmp_table_size yang dapat dimodifikasi di konsol RDS. Parameter buffer sesi lainnya tidak dapat diubah melalui konsol.