MySQL için Azure Veritabanı - Esnek Sunucuda yetersiz bellek sorunlarını giderme

ŞUNLAR IÇIN GEÇERLIDIR: MySQL için Azure Veritabanı - Tek Sunucu MySQL için Azure Veritabanı - Esnek Sunucu

Önemli

MySQL için Azure Veritabanı tek sunucu kullanımdan kaldırma yolundadır. Esnek MySQL için Azure Veritabanı sunucuya yükseltmenizi kesinlikle öneririz. MySQL için Azure Veritabanı esnek sunucuya geçiş hakkında daha fazla bilgi için bkz. MySQL için Azure Veritabanı Tek Sunucu'ya neler oluyor?

MySQL için Azure Veritabanı esnek sunucu örneğinin en iyi performansı göstermesini sağlamaya yardımcı olmak için uygun bellek ayırma ve kullanımına sahip olmak çok önemlidir. Varsayılan olarak, esnek MySQL için Azure Veritabanı sunucunun bir örneğini oluşturduğunuzda, kullanılabilir fiziksel bellek iş yükünüz için seçtiğiniz katmana ve boyuta bağlıdır. Ayrıca, veritabanı işlemlerini geliştirmek için arabellekler ve önbellekler için bellek ayrılır. Daha fazla bilgi için bkz . MySQL Belleği Nasıl Kullanır?

MySQL için Azure Veritabanı esnek sunucunun mümkün olduğunca fazla önbellek isabeti elde etmek için bellek tükettiğine dikkat edin. Sonuç olarak, bellek kullanımı genellikle bir örneğin kullanılabilir fiziksel belleğinin %80-90'ının üzerine gelebilir. Sorgu iş yükünün ilerleme durumuyla ilgili bir sorun yoksa, bu bir sorun değildir. Ancak, aşağıdaki gibi nedenlerle bellek yetersiz sorunlarıyla karşılaşabilirsiniz:

  • Çok büyük arabellekler yapılandırıldı.
  • Alt en uygun sorgular çalışıyor.
  • Birleştirme gerçekleştiren ve büyük veri kümelerini sıralayan sorgular.
  • Veritabanı sunucusunda en fazla bağlantı sayısını çok yüksek ayarlayın.

Sunucunun belleğinin büyük bölümü InnoDB'nin innodb_buffer_pool_size, innodb_log_buffer_size, key_buffer_size ve query_cache_size gibi bileşenleri içeren genel arabellekleri ve önbellekleri tarafından kullanılır.

innodb_buffer_pool_size parametresinin değeri, InnoDB'nin veritabanı tablolarını ve dizinle ilgili verileri önbelleğe aldığı bellek alanını belirtir. MySQL, arabellek havuzunda mümkün olduğunca çok tablo ve dizinle ilgili veri barındırmaya çalışır. Daha büyük bir arabellek havuzu, diske daha az G/Ç işleminin yönlendirilmesini gerektirir.

Bellek kullanımını izleme

MySQL için Azure Veritabanı esnek sunucu, veritabanı örneğinizin performansını ölçmek için çeşitli ölçümler sağlar. Veritabanı sunucunuzun bellek kullanımını daha iyi anlamak için Konak Bellek Yüzdesi veya Bellek Yüzdesi ölçümlerini görüntüleyin.

Viewing memory utilization metrics.

Bellek kullanımının aniden arttığını ve kullanılabilir belleğin hızla düştüğünü fark ederseniz, sorunun kaynağının iş yükünde ani bir ani artış olup olmadığını belirlemek için Konak CPU Yüzdesi, Toplam Bağlan ions ve GÇ Yüzdesi gibi diğer ölçümleri izleyin.

Veritabanı sunucusuyla kurulan her bağlantının bir miktar bellek ayırması gerektiğini unutmayın. Sonuç olarak, veritabanı bağlantılarında bir artış bellek yetersizliklerine neden olabilir.

Yüksek bellek kullanımının nedenleri

Şimdi MySQL'de yüksek bellek kullanımının bazı diğer nedenlerine göz atalım. Bu nedenler iş yükünün özelliklerine bağlıdır.

Geçici tablolarda artış

MySQL, geçici bir sonuç kümesini depolamak için tasarlanmış özel bir tablo türü olan "geçici tablolar" kullanır. Geçici tablolar oturum sırasında birkaç kez yeniden kullanılabilir. Oluşturulan tüm geçici tablolar bir oturum için yerel olduğundan, farklı oturumlarda farklı geçici tablolar olabilir. Büyük geçici sonuç kümelerinin derlemelerini gerçekleştiren birçok oturumu olan üretim sistemlerinde, yoğun saatlerde oluşturulan geçici tabloların sayısını izleyen genel durum sayacı created_tmp_tables düzenli olarak denetlemeniz gerekir. Çok sayıda bellek içi geçici tablo, esnek MySQL için Azure Veritabanı sunucu örneğinde kullanılabilir belleğin kısa sürede düşmesine neden olabilir.

MySQL ile geçici tablo boyutu, aşağıdaki tabloda açıklandığı gibi iki parametrenin değerleriyle belirlenir.

Parametre Açıklama
tmp_table_size İç, bellek içi geçici tabloların en büyük boyutunu belirtir.
max_heap_table_size Kullanıcının oluşturduğu MEMORY tablolarının büyüyebileceği boyut üst sınırını belirtir.

Dekont

MySQL, iç, bellek içi geçici tablonun en büyük boyutunu belirlerken tmp_table_size ve max_heap_table_size parametreleri için ayarlanan değerlerin daha düşük olduğunu dikkate alır.

Öneriler

Geçici tablolarla ilgili yetersiz bellek sorunlarını gidermek için aşağıdaki önerileri göz önünde bulundurun.

  • tmp_table_size değerini artırmadan önce, özellikle birleştirmelere katılan ve işlemlere göre gruplandırılmış sütunlar için veritabanınızın düzgün dizine eklendiğini doğrulayın. Temel alınan tablolarda uygun dizinlerin kullanılması, oluşturulan geçici tablo sayısını sınırlar. Dizinlerinizi doğrulamadan bu parametrenin ve max_heap_table_size parametresinin değerini artırmak, verimsiz sorguların dizinler olmadan çalışmasına ve gerekenden daha fazla geçici tablo oluşturmasına izin verebilir.
  • İş yükünüzün gereksinimlerini karşılamak için max_heap_table_size ve tmp_table_size parametrelerinin değerlerini ayarlayın.
  • max_heap_table_size ve tmp_table_size parametreleri için ayarladığınız değerler çok düşükse, geçici tablolar düzenli olarak depolama alanına taşarak sorgularınıza gecikme süresi ekleyebilir. Genel durum sayacını created_tmp_disk_tables kullanarak diske taşan geçici tabloları izleyebilirsiniz. created_tmp_disk_tables ve created_tmp_tables değişkenlerinin değerlerini karşılaştırarak, oluşturulan iç, disk üzerindeki geçici tabloların sayısını oluşturulan toplam iç geçici tablo sayısıyla görüntülersiniz.

Tablo önbelleği

Çok iş parçacıklı bir sistem olarak MySQL, tabloların birden çok oturum tarafından eşzamanlı olarak açılabilmesi için tablo dosyası tanımlayıcılarının önbelleğini tutar. MySQL, bu tablo önbelleğini korumak için bir miktar bellek ve işletim sistemi dosya tanımlayıcısı kullanır. table_open_cache değişkeni tablo önbelleğinin boyutunu tanımlar.

Öneriler

Tablo önbelleğiyle ilgili düşük bellek sorunlarını gidermek için aşağıdaki önerileri göz önünde bulundurun.

  • parametresi table_open_cache tüm iş parçacıkları için açık tablo sayısını belirtir. Bu değerin artırılması, mysqld'nin gerektirdiği dosya tanımlayıcılarının sayısını artırır. Genel durumu göster sayacındaki opened_tables durum değişkenini denetleyerek tablo önbelleğini artırmanız gerekip gerekmediğini de kontrol edebilirsiniz. İş yükünüz için bu parametrenin değerini artımlı olarak artırın.
  • table_open_cache çok düşük ayarlanması, MySQL için Azure Veritabanı esnek sunucunun sorgu işleme için gereken tabloları açmak ve kapatmak için daha fazla zaman harcamasına neden olabilir.
  • Bu değerin çok yüksek ayarlanması daha fazla bellek kullanımına ve dosya tanımlayıcılarının işletim sisteminin çalıştırılmasına neden olarak bağlantıların reddedilmesine veya sorguların işlenememesine neden olabilir.

Diğer arabellekler ve sorgu önbelleği

Yetersiz bellekle ilgili sorunları giderirken, çözüme yardımcı olması için birkaç arabellek ve önbellekle daha çalışabilirsiniz.

Net arabellek (net_buffer_length)

Ağ arabelleği, her istemci iş parçacığı için bağlantı ve iş parçacığı arabelleklerinin boyutudur ve max_allowed_packet için belirtilen değere kadar büyüyebilir. Örneğin, bir sorgu deyimi büyükse, tüm eklemeler/güncelleştirmeler çok büyük bir değere sahipse, net_buffer_length parametresinin değerini artırmak performansı artırmaya yardımcı olur.

Birleştirme arabelleği (join_buffer_size)

Birleştirme arabelleği, birleştirme dizin kullanamayınca tablo satırlarını önbelleğe almak için ayrılır. Veritabanınızda dizin olmadan gerçekleştirilen çok sayıda birleşim varsa, daha hızlı birleşimler için dizinler eklemeyi göz önünde bulundurun. Dizin ekleyemiyorsanız, bağlantı başına ayrılan bellek miktarını belirten join_buffer_size parametresinin değerini artırmayı göz önünde bulundurun.

Sıralama arabelleği (sort_buffer_size)

Sıralama arabelleği, bazı ORDER BY ve GROUP BY sorgularında sıralama gerçekleştirmek için kullanılır. GENEL DURUMU GÖSTER çıkışında saniyede çok Sort_merge_passes görüyorsanız sorgu iyileştirme veya daha iyi dizin oluşturma kullanılarak iyileştirilmeyen ORDER BY veya GROUP BY işlemlerini hızlandırmak için sort_buffer_size değerini artırmayı göz önünde bulundurun.

Aksini gösteren ilgili bilgileriniz yoksa, sort_buffer_size değerini rastgele artırmaktan kaçının. Bu arabellek için bellek bağlantı başına atanır. MySQL belgelerinde Sunucu Sistemi Değişkenleri makalesi, Linux'ta iki eşik (256 KB ve 2 MB) olduğunu ve daha büyük değerler kullanmanın bellek ayırmayı önemli ölçüde yavaşlatabileceğini belirtir. Sonuç olarak, sort_buffer_size değerini 2M'nin üzerine çıkarmaktan kaçının, performans cezası herhangi bir avantajdan daha ağır basacaktır.

Sorgu önbelleği (query_cache_size)

Sorgu önbelleği, sorgu sonuç kümelerini önbelleğe almak için kullanılan bir bellek alanıdır. query_cache_size parametresi, sorgu sonuçlarını önbelleğe almak için ayrılan bellek miktarını belirler. Varsayılan olarak, sorgu önbelleği devre dışıdır. Ayrıca sorgu önbelleği MySQL sürüm 5.7.20'de kullanım dışıdır ve MySQL sürüm 8.0'da kaldırılmıştır. Sorgu önbelleği şu anda çözümünüzde etkinleştirildiyse, devre dışı bırakmadan önce, buna bağlı sorgu olmadığını doğrulayın.

Arabellek önbelleği isabet oranını hesaplama

Arabellek havuzunun iş yükü isteklerini karşılayıp karşılayamayacağını anlamak için MySQL için Azure Veritabanı esnek sunucu ortamında arabellek önbelleği isabet oranı önemlidir ve genel bir kural olarak arabellek havuzu önbellek isabet oranının her zaman %99'dan fazla olması iyi bir uygulamadır.

Okuma istekleri için InnoDB arabellek havuzu isabet oranını hesaplamak için SHOW GLOBAL STATUS komutunu çalıştırarak "Innodb_buffer_pool_read_requests" ve "Innodb_buffer_pool_reads" sayaçlarını alabilir ve ardından değeri aşağıda gösterilen formülü kullanarak hesaplayabilirsiniz.

InnoDB Buffer pool hit ratio = Innodb_buffer_pool_read_requests / (Innodb_buffer_pool_read_requests + Innodb_buffer_pool_reads) * 100

Aşağıdaki örneği inceleyin.

mysql> show global status like "innodb_buffer_pool_reads";
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| Innodb_buffer_pool_reads | 197   |
+--------------------------+-------+
1 row in set (0.00 sec)

mysql> show global status like "innodb_buffer_pool_read_requests";
+----------------------------------+----------+
| Variable_name                    | Value    |
+----------------------------------+----------+
| Innodb_buffer_pool_read_requests | 22479167 |
+----------------------------------+----------+
1 row in set (0.00 sec)

Yukarıdaki değerleri kullanarak, okuma istekleri için InnoDB arabellek havuzu isabet oranını hesaplamak aşağıdaki sonucu verir:

InnoDB Buffer pool hit ratio = 22479167/(22479167+197) * 100 

Buffer hit ratio = 99.99%

Select deyimleri arabellek önbellek isabet oranına ek olarak, tüm DML deyimleri için InnoDB Arabellek Havuzuna yazma işlemleri arka planda gerçekleşir. Ancak, bir sayfayı okumak veya oluşturmak gerekiyorsa ve kullanılabilir temiz sayfa yoksa, önce sayfaların boşaltılması için de beklemeniz gerekir.

Innodb_buffer_pool_wait_free sayacı, bunun kaç kez gerçekleştiğini sayar. 0'dan büyük Innodb_buffer_pool_wait_free, InnoDB Arabellek Havuzunun çok küçük olduğunu ve veritabanına gelen yazma işlemlerine uyum sağlamak için arabellek havuzu boyutunun veya örnek boyutunun artırılması gerektiğinin güçlü bir göstergesidir.

Öneriler

  • Veritabanınızda sorgularınızı çalıştırmak için yeterli kaynak ayrıldığınızdan emin olun. Bazen, arabelleklerin ve önbelleklerin iş yükünüz için daha fazla fiziksel bellek elde etmek için örnek boyutunu artırmanız gerekebilir.
  • Büyük veya uzun süre çalışan işlemleri daha küçük işlemlere ayırarak önleyin.
  • Sistem belirtilen eşiklerden herhangi birini aşarsa bildirim almak için "Konak Bellek Yüzdesi" uyarılarını kullanın.
  • Sorunlu veya yavaş çalışan sorguları belirlemek ve ardından bunları iyileştirmek için Sorgu Performansı Analizler veya Azure Çalışma Kitapları'nı kullanın.
  • Üretim veritabanı sunucuları için, her şeyin sorunsuz çalıştığından emin olmak için düzenli aralıklarla tanılamaları toplayın. Aksi takdirde, tanımladığınız sorunları giderin ve çözün.

Sonraki adımlar

En önemli sorularınızın eş yanıtlarını bulmak veya soru göndermek veya yanıtlamak için Stack Overflow'u ziyaret edin.