• 1

MySQL'in bellek kullanımı nasıl azaltılır

3 hafta önce , Okuma süresi 3 dakika.

MySQL'in bellek kullanımı nasıl azaltılır
Bazen, MySQL istediğinizden daha fazla bellek kullandığı için sunucunuzun boş belleği azalmış gibi görünür. İşte bu durumlarda MySQL ram kullanımını optimize etmek gerekebilir. Nasıl mı?

Biri MySQL'e ne kadar bellek kullanması gerektiğini söylemez.

Maksimum bellek kullanımı, birçok farklı ayardan, çoğunlukla arabellek boyutlarından gelir, ancak belgelerin bu değerin nasıl bulunacağını veya ayarlanacağını açıkça belirtmediği görülmektedir. Yine de şiddetle tavsiye ettiğim bellek kullanımı  hakkındaki gönderilerini okumanız gerekecek.

Umarım iyi kalpli bir adam, bu yazıya yorum olarak (bu belgenin altında bulacağınız) çok yararlı bir kabuk betiği yayınlamıştır.

Bu komut dosyası, arabelleklere ve bellek tahsisine dayalı olarak MySQL'in potansiyel bellek kullanımının yaklaşık bir değerini yazdırır.

Daha fazla beklemeyelim:

+------------------------------------------+--------------------+
|                              TOTAL (MIN) |         194.719 MB |
|                              TOTAL (MAX) |        3002.531 MB |
+------------------------------------------+--------------------+

Bu, kendi ortamımda test yaparken komut dosyasının sonucudur (sadece bir kısmı, geri kalanı daha sonra görülecektir).

TOTAL (MAKS), MySQK'nin mevcut yapılandırmayla kullanabileceği maksimum bellektir.
Varsayılan yapılandırmasıyla MySQL, sunucumun belleğinin 3 GB'ını potansiyel olarak kullanabilir.
Peki ya izin verebileceğim yalnızca 500 MB varsa?

Potansiyel bellek kullanımını daha gerçekçi bir şeye indirgemek için 3 adımı göreceğiz.
Benim durumumda, hedef yaklaşık 350MB, bu da sunucumun toplam belleğinin% 70'ine denk geliyor.

Ellerimizi kirletelim

1) MySQL bellek kullanımını kısıtlamak için değiştirmek isteyeceğiniz parametreleri belirleyin

Bu eğitimin altında bulabileceğiniz komut dosyasını başlatın.
İşte bir ekran örneği:

+------------------------------------------+--------------------+
|                          key_buffer_size |          16.000 MB |
|                         query_cache_size |          16.000 MB |
|                  innodb_buffer_pool_size |         128.000 MB |
|          innodb_additional_mem_pool_size |           8.000 MB |
|                   innodb_log_buffer_size |           8.000 MB |
+------------------------------------------+--------------------+
|                              BASE MEMORY |         176.000 MB |
+------------------------------------------+--------------------+
|                         sort_buffer_size |           2.000 MB |
|                         read_buffer_size |           0.125 MB |
|                     read_rnd_buffer_size |           0.250 MB |
|                         join_buffer_size |           0.125 MB |
|                             thread_stack |           0.188 MB |
|                        binlog_cache_size |           0.031 MB |
|                           tmp_table_size |          16.000 MB |
+------------------------------------------+--------------------+
|                    MEMORY PER CONNECTION |          18.719 MB |
+------------------------------------------+--------------------+
|                     Max_used_connections |                  1 |
|                          max_connections |                151 |
+------------------------------------------+--------------------+
|                              TOTAL (MIN) |         194.719 MB |
|                              TOTAL (MAX) |        3002.531 MB |
+------------------------------------------+--------------------+

Doğrudan veya dolaylı olarak etkileyebileceğimiz iki şey şunlardır:
- bağlantı başına bellek - maksimum eşzamanlı bağlantı sayısı

Değişikliklerinizi ihtiyaçlarınıza göre uyarlamak için her bir ayarın ne yaptığı hakkında biraz bilgi edinmek isteyeceksiniz.

Sadece bir ipucu olarak, bunlar en dikkat ile kabul değerler şunlardır:
- innodbbufferpoolsize — sortbuffersize — readbuffersize — tmptablesize — maxconnections

Neler hakkında hafıza kazanabileceğinizi anladıktan sonra, bir sonraki adıma geçin.

2) my.cnf dosyanızı bulun

Bu, mysql seçeneklerinin üzerine yazacağınız dosyadır. Genellikle /etc/mysqlklasörde bulunur.

İşte budur my.cnfdosya değiştirmeden olmasaydı gibi görünmelidir

#
# * Fine Tuning
#
key_buffer              = 16M  
max_allowed_packet      = 16M  
thread_stack            = 192K  
thread_cache_size       = 8  
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam-recover         = BACKUP  
# max_connections        = 100

3) Değişikliklerinizi yapın

Birkaç satır değiştirmemiz ve eklememiz gerekecek. İşte bazı değişikliklerden sonra nasıl göründüğü.

Çoğunlukla birçok farklı işlemde kullanıldığı için key_buffer boyutunu hareket ettirmemenizi tavsiye ederim.

#
# * Fine Tuning
#
key_buffer              = 16M  
read_buffer             = 60K  
sort_buffer             = 1M  
innodb_buffer_pool_size = 64M  
tmp_table               = 8M  
max_allowed_packet      = 16M  
thread_stack            = 192K  
thread_cache_size       = 8  
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam-recover         = BACKUP  
max_connections        = 25

Komut dosyasını yeniden başlatırsam:

$ sh print-mem.sh
+------------------------------------------+--------------------+
|                          key_buffer_size |          16.000 MB |
|                         query_cache_size |          16.000 MB |
|                  innodb_buffer_pool_size |          64.000 MB |
|          innodb_additional_mem_pool_size |           8.000 MB |
|                   innodb_log_buffer_size |           8.000 MB |
+------------------------------------------+--------------------+
|                              BASE MEMORY |         112.000 MB |
+------------------------------------------+--------------------+
|                         sort_buffer_size |           1.000 MB |
|                         read_buffer_size |           0.059 MB |
|                     read_rnd_buffer_size |           0.250 MB |
|                         join_buffer_size |           0.125 MB |
|                             thread_stack |           0.188 MB |
|                        binlog_cache_size |           0.031 MB |
|                           tmp_table_size |           8.000 MB |
+------------------------------------------+--------------------+
|                    MEMORY PER CONNECTION |           9.652 MB |
+------------------------------------------+--------------------+
|                     Max_used_connections |                  1 |
|                          max_connections |                 25 |
+------------------------------------------+--------------------+
|                              TOTAL (MIN) |         121.652 MB |
|                              TOTAL (MAX) |         353.309 MB |
+------------------------------------------+--------------------+

Bu basit adımlarla, potansiyel bellek kullanımı 3GB'den 350MB'ye düşürüldü.

Bir kez daha, değişikliklerinizi ihtiyaçlarınıza uyan bir şeye uyarlamalısınız.

Senaryo

#!/bin/sh
# you might want to add some user authentication here
mysql -e "show variables; show status" | awk '  
{
VAR[$1]=$2  
}
END {  
MAX_CONN = VAR["max_connections"]  
MAX_USED_CONN = VAR["Max_used_connections"]  
BASE_MEM=VAR["key_buffer_size"] + VAR["query_cache_size"] + VAR["innodb_buffer_pool_size"] + VAR["innodb_additional_mem_pool_size"] + VAR["innodb_log_buffer_size"]  
MEM_PER_CONN=VAR["read_buffer_size"] + VAR["read_rnd_buffer_size"] + VAR["sort_buffer_size"] + VAR["join_buffer_size"] + VAR["binlog_cache_size"] + VAR["thread_stack"] + VAR["tmp_table_size"]  
MEM_TOTAL_MIN=BASE_MEM + MEM_PER_CONN*MAX_USED_CONN  
MEM_TOTAL_MAX=BASE_MEM + MEM_PER_CONN*MAX_CONN
printf "+------------------------------------------+--------------------+n"  
printf "| %40s | %15.3f MB |n", "key_buffer_size", VAR["key_buffer_size"]/1048576  
printf "| %40s | %15.3f MB |n", "query_cache_size", VAR["query_cache_size"]/1048576  
printf "| %40s | %15.3f MB |n", "innodb_buffer_pool_size", VAR["innodb_buffer_pool_size"]/1048576  
printf "| %40s | %15.3f MB |n", "innodb_additional_mem_pool_size", VAR["innodb_additional_mem_pool_size"]/1048576  
printf "| %40s | %15.3f MB |n", "innodb_log_buffer_size", VAR["innodb_log_buffer_size"]/1048576  
printf "+------------------------------------------+--------------------+n"  
printf "| %40s | %15.3f MB |n", "BASE MEMORY", BASE_MEM/1048576  
printf "+------------------------------------------+--------------------+n"  
printf "| %40s | %15.3f MB |n", "sort_buffer_size", VAR["sort_buffer_size"]/1048576  
printf "| %40s | %15.3f MB |n", "read_buffer_size", VAR["read_buffer_size"]/1048576  
printf "| %40s | %15.3f MB |n", "read_rnd_buffer_size", VAR["read_rnd_buffer_size"]/1048576  
printf "| %40s | %15.3f MB |n", "join_buffer_size", VAR["join_buffer_size"]/1048576  
printf "| %40s | %15.3f MB |n", "thread_stack", VAR["thread_stack"]/1048576  
printf "| %40s | %15.3f MB |n", "binlog_cache_size", VAR["binlog_cache_size"]/1048576  
printf "| %40s | %15.3f MB |n", "tmp_table_size", VAR["tmp_table_size"]/1048576  
printf "+------------------------------------------+--------------------+n"  
printf "| %40s | %15.3f MB |n", "MEMORY PER CONNECTION", MEM_PER_CONN/1048576  
printf "+------------------------------------------+--------------------+n"  
printf "| %40s | %18d |n", "Max_used_connections", MAX_USED_CONN  
printf "| %40s | %18d |n", "max_connections", MAX_CONN  
printf "+------------------------------------------+--------------------+n"  
printf "| %40s | %15.3f MB |n", "TOTAL (MIN)", MEM_TOTAL_MIN/1048576  
printf "| %40s | %15.3f MB |n", "TOTAL (MAX)", MEM_TOTAL_MAX/1048576  
printf "+------------------------------------------+--------------------+n"  
}'

 

#mysql