RDS örnek belleği iki kategoriye ayrılır: paylaşılan bellek ve oturuma özel bellek. Paylaşılan bellek, örnek başlatıldığında bir kez tahsis edilir ve tüm bağlantılar tarafından paylaşılır. Oturuma özel bellek ise talep üzerine bağlantı başına tahsis edilir; sıralama, birleştirme veya veri okuma gerektiren her aktif sorgu tam arabellek boyutunu anında talep eder. Yüksek eşzamanlılık altında bu bağlantı başına tahsis, bellek yetersizliği (OOM) hatalarının ve birincil/ikincil yük devretmelerinin temel nedenidir.
Bellek hesaplama yöntemi
Toplam bellek kullanımının nasıl tahmin edildiğini gösteren formül aşağıdadır:
Total memory ≈ Shared memory
+ max_connections × per-session memory per connection
| Bileşen | Parametreler |
|---|---|
| Paylaşılan bellek | innodb_buffer_pool_size + innodb_log_buffer_size + innodb_additional_mem_pool_size + key_buffer_size + query_cache_size |
| Oturum başına bellek | sort_buffer_size + read_buffer_size + read_rnd_buffer_size + join_buffer_size + binlog_cache_size + tmp_table_size |
Paylaşılan bellek
Paylaşılan bellek tahsisini kontrol etmek için aşağıdaki sorguyu çalıştırın:
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'
);
Aşağıdaki çıktı, 240 MB'lık bir örneğe aittir:
+---------------------------------+-----------------+
| 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 |
+---------------------------------+-----------------+
Parametreler
| Parametre | RDS'deki Varsayılan Değer | Açıklama |
|---|---|---|
innodb_buffer_pool_size |
64 MB (240 MB örnek) | InnoDB arabellek havuzu. Veri sayfalarını, dizin sayfalarını, geri alma sayfalarını, ekleme arabelleklerini, uyarlamalı karma dizinleri, kilitleri ve veri sözlüklerini depolar. Tüm SQL okuma ve yazma işlemleri fiziksel veri dosyaları yerine arabellek havuzu üzerinde gerçekleşir; veriler daha sonra kontrol noktaları aracılığıyla diske yazılır. Daha büyük bir arabellek havuzu okuma/yazma performansını artırır ancak hata kurtarma süresini uzatır. |
innodb_log_buffer_size |
1 MB | InnoDB günlük arabelleği. Diske aktarılmadan önce yeniden yapma günlüklerini (redo logs) depolar. Aktarma işlemi ana iş parçacığı tarafından her saniye, her işlem commit işleminde ve kullanılabilir arabellek toplam boyutunun yarısının altına düştüğünde tetiklenir. Çoğu iş yükü için 1 MB yeterlidir. |
innodb_additional_mem_pool_size |
2 MB | Dahili InnoDB veri yapılarını depolar. Örneğinizde çok sayıda tablo varsa bu değeri artırın. |
key_buffer_size |
16 MB | MyISAM tablo dizinlerini önbelleğe alır. MyISAM tabloları için dizin önbellekleri key_buffer içinde, veri önbellekleri ise işletim sistemi belleğinde depolanır. Tüm RDS örnekleri için 16 MB olarak ayarlanır. |
query_cache_size |
0 (devre dışı) | Sorgu sonuçlarını SQL ifadesi karmasına göre önbelleğe alır. RDS örneklerinde devre dışıdır. Bir tablo değiştirildiğinde önbellek geçersiz kılındığından yazma yoğunluklu iş yükleri için uygun değildir. |
Oturuma özel bellek
Paylaşılan belleğin aksine oturum arabellekleri başlangıçta önceden tahsis edilmez. Her parametre değeri, bir sorguya ihtiyaç duyulduğu anda tamamen tahsis edilir. Çok sayıda eşzamanlı bağlantı olduğunda kümülatif tahsis mevcut belleği aşabilir ve OOM hatalarını tetikleyebilir.
Oturum belleği tahsisini kontrol etmek için aşağıdaki sorguyu çalıştırın:
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'
);
Örnek çıktı:
+-------------------------+-----------------+
| 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 |
+-------------------------+-----------------+
Parametreler
| Parametre | RDS'deki Varsayılan Değer | Konsolda Değiştirilebilir | Açıklama |
|---|---|---|---|
read_buffer_size |
256 KB | Hayır | Sıralı tarama arabelleği. G/Ç'yi azaltmak için fiziksel okumalardan önce taranır. |
read_rnd_buffer_size |
256 KB | Hayır | Rastgele tarama arabelleği. Bir dizin taramasından sonra satırlar sıralı düzende okunduğunda kullanılır. |
sort_buffer_size |
256 KB | Hayır | ORDER BY ve GROUP BY işlemleri için sıralama arabelleği. Sıralanacak veri bu boyutu aşarsa MySQL diske geçici bir tablo yazar. Linux'ta bu değerin 2 MB üzerine ayarlanması bellek tahsisini malloc() yerine mmap() kullanmaya geçirir ve bu da verimliliği düşürür. |
join_buffer_size |
256 KB | Hayır | Birleştirme işlemi arabelleği. ApsaraDB RDS for MySQL yalnızca iç içe döngü birleştirme algoritmasını destekler. Sürücü olmayan tablo, arabellek havuzundaki çakışmayı önlemek için bu arabellekte depolanır. |
binlog_cache_size |
256 KB | Hayır | İkili günlük önbelleği. Commit öncesinde işlem günlüklerini depolar; commit sonrasında diskteki ikili günlük dosyasına aktarır. |
tmp_table_size |
256 KB | Evet | Bellek içi geçici tablonun maksimum boyutu. Bir sorgu bu limiti aşan bir geçici tablo oluşturursa MySQL bunu diskte bir MyISAM tablosuna dönüştürür. Aşağıdaki hatayı görürseniz bu değeri artırın: [Err] 1114 - The table '/home/mysql/data3081/tmp/#sql_6197_2' is full |
Not: Yalnızca tmp_table_size RDS konsolunda değiştirilebilir. Diğer oturum arabelleği parametreleri konsol üzerinden değiştirilemez.