MySQL: “Mümkün olan maksimum bellek kullanımını” nasıl azaltabilirim?


16

Kısa bir süre önce hafızanın tükenmesinin bir sonucu olarak daralma ile ilgili sorunlar yaşıyorum. (VPS'imin toplam 256M'si var)

MySQL'i mysqltuner.pl kullanarak ayarlamaya çalışıyorum ve aşağıdaki sonuçları elde ediyorum:

-------- Genel istatistikler ---------------------------------------- ----------
[-] MySQLTuner komut dosyası için sürüm denetimi atlandı
[OK] Şu anda desteklenen MySQL sürüm 5.0.51a-3ubuntu5.4-log çalışıyor
[OK] 64 bit mimaride çalışıyor

-------- Depolama Motoru İstatistikleri --------------------------------------- ----
[-] Durum: + Arşiv -BDB -Federated -InnoDB -ISAM -NDBCluster 
[-] MyISAM tablolarındaki veriler: 114M (Tablolar: 454)
[!!] Toplam parçalanmış tablolar: 34

-------- Performans Metrikleri ---------------------------------------- ---------
[-] Şunun için: 40s (570 q [14.250 qps], 23 bağlantı, TX: 154K, RX: 23K)
[-] Okuma / Yazma:% 100 /% 0
Toplam tampon
[!!] Mümkün olan maksimum bellek kullanımı: 392,9M (kurulu RAM'in% 153'ü)
[OK] Yavaş sorgular:% 0 (5/570)
[OK] Kullanılabilir bağlantıların en yüksek kullanımı:% 15 (3/20)
[!!] Anahtar arabellek boyutu / toplam MyISAM dizinleri: 8.0M / 9.4M
[!!] Anahtar arabellek isabet oranı:% 57.1 (7 önbellek / 3 okuma)
[OK] Sorgu önbellek verimliliği:% 21,9 (7 önbellek / 32 seçim)
[OK] Günlük önbellek kuru eriklerini sorgula: 0
[OK] Geçici tablo gerektiren sıralar:% 0 (0 geçici sıralama / 1 sıralama)
[OK] Diskte geçici tablolar oluşturuldu:% 0 (diskte 0 / toplam 32)
[OK] İş parçacığı önbellek isabet oranı:% 86 (3 oluşturulan / 23 bağlantı)
[OK] Tablo önbellek isabet oranı:% 26 (128 açık / 484 açık)
[OK] Kullanılan açık dosya limiti:% 25 (259 / 1K)
[OK] Masa kilitleri hemen alındı:% 100 (492 acil / 492 kilit)

-------- Öneriler ----------------------------------------- ------------
Genel öneriler:
    Daha iyi performans için tabloları birleştirmek üzere OPTIMIZE TABLOSU'nu çalıştırın
    MySQL son 24 saat içinde başladı - öneriler yanlış olabilir
    Sistem kararlılığı için genel MySQL bellek ayak izinizi azaltın
Ayarlanacak değişkenler:
  *** MySQL'in maksimum bellek kullanımı tehlikeli derecede yüksek ***
  *** MySQL arabellek değişkenlerini artırmadan önce RAM ekleyin ***
    key_buffer_size (> 9,4 milyon)

Ancak maksimum bellek kullanımını nasıl azaltacağım konusunda biraz kafam karıştı? Key_buffer ve max_connections dayalı gibi görünüyor, ama başka bir şey de olmalı?

my.cnf:

key_buffer = 8 milyon
max_allowed_packet = 12 milyon
thread_stack = 128K
thread_cache_size = 8
maks. bağlantı = 20
table_cache = 128
tmp_table_size = 256 milyon
max_heap_table_size = 256 milyon
join_buffer_size = 256K
query_cache_limit = 8 milyon
query_cache_size = 64 milyon

MySQL ayarlama makalelerini okumaya çalışıyordum, ancak ne yaptıklarını zaten bilen insanlara yönelik görünüyorlar! Herhangi bir yardım mutluluk duyacağız. Teşekkürler!


1
Yorum yapanların tavsiyelerini izledim ve makul bir düzeye indirdim - ama yine de bu değerler için aklı başında olan beyzbol sahalarının ne olabileceğini merak ediyorum? Bazı makaleler çevrimiçi 64K kullanır ve diğerleri aynı değer için 512M önerir!
Nick

Yanıtlar:


10

256M ile bir sunucunuz var, ancak bunların hepsini kullanamazsınız - bazı işletim sistemi ek yükleri olduğunu unutmayın. Buna, diğer milletlerin de bahsettiği gibi aşırı taahhüt ettiğiniz gerçeği ekleyin ve kesinlikle burada thrash olacaksınız. 256M yalnızca küçük bir DB için yeterlidir, yapılandırdığınız şeyle 20 bağlantı çok fazladır.

1) maksimum bağlantılarınızı 4'e düşürün (20 üzerinden 3'ü kullanıyorsunuz)

2) sorgu önbelleğinizi daha iyi optimize edin; 8M gerçekten büyük ve toplam 64M hit / kuru erik dayalı çok şey var; 4/32 combo'yu deneyin ve nasıl gittiğini görün. Gerçekten bir 2/24 combo sizin için işe yarayacağını düşünüyorum.

3) geçici tablo gerektiren herhangi bir tür yok, neden orada max_heap_table_size fiil var? Yorum yapın, varsayılanları kullanın

4) 128 tablonuz var mı? Bu table_cache'i 64 veya 48 oranında ikiye kesmeyi deneyin

5) thread_cache_size değerini 4'e düşürün

6) Parçalanmayı azaltmak için bu tabloları optimize edin

Bunlar başlangıç ​​için bazı şeyler. Görünüşe göre, neye ihtiyacınız olduğunu bilmek ve karışıklık yaratmanız için herhangi bir gerçek profil oluşturmadan bir yapılandırmada bir grup sayı attısınız; her şey başarısız olursa, varsayılanlara geri dönün ve özel ayarlarınızdan kurtulun ve Google'da bulabileceğiniz bazı performans ayarlama kılavuzlarını kullanmaya başlayın. SHOW VARIABLES ve SHOW STATUS çıktısını alın, bir bajillion ayar kılavuzundan birini bulun ve gerçek, gerçek sayılarınızı denklemlerine takın ve size yapılandırma dosyanıza koymanız gereken tam ish sayılarını söyleyecektir.


3
Bu eski bir soruya eski bir cevap, ama asker tarafından yayınlanan mysqltuner sonuçta sunucunun sadece 40'lara kadar olduğunu ve sunucunun göreceği yükleri doğru bir şekilde yargılamak için yeterli zaman olmadığını belirtmek isterim. . İdeal olarak mysqltuner'ı bir gün veya daha uzun bir süre boyunca birkaç kez çalıştırır ve ardından sonuçları analiz edersiniz. Bunun dışında önerileriniz sağlam.
instanceofTom

8

Ben bir MySQL guru değilim ve bu bilgi ile sorunu teşhis edemez, ama kaynak kodunda formül aramaya çalıştım. İşte burada:

server_buffers + total_per_thread_buffers * max_connections

Nerede:

server_buffers = key_buffer_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size + query_cache_size

ve:

total_per_thread_buffers = read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + max_allowed_packet + join_buffer_size

Şimdi bu değerlerin her birini kontrol etmeli ve bu büyük sayıdan hangisinin sorumlu olduğunu bulmalısınız. Ve bu betiğe güvenmeden güvenmeyin - DB sunucularımdan birinde çalıştırmayı denedim ve maksimum belleğin toplam fiziksel bellek miktarının% 140'ı olduğunu hesapladım, ancak sistem yıllardır herhangi bir istikrar sorunu olmadan çalışıyor.

İyi şanslar!


0

Doğru hatırlıyorsam, MySQL Tuner maksimum kullanımı tahmin etmek için aşağıdaki formülü kullanır:

read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + join_buffer_size

Bunun% 100 doğru olmadığını ve aslında bir tahmin olduğunu unutmayın, çünkü MySQL'deki bazı ayarların tanımlanmış bir sınırı yoktur.

Yapılandırma dosyanızdaki bazı ayarları düşürmeye ve tuneri tekrar çalıştırmaya başlayabilirsiniz, ancak my.cnf dosyasını değiştirmek, yeniden başlatmak ve tuneri çalıştırmak için zamanınız yoksa bir uzman yardımı almanızı öneririm.


0

Mysqlcalculator.com yazılımının kullanımı size saatlerce zaman kazandırabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.