Sadece InnoDB (5GB veritabanı) kullanan 8GB RAM adanmış MySQL sunucusu için en iyi MySQL önbellek ayarları


20

Performans için MySQL kurulumu söz konusu olduğunda oldukça büyük bir çaylağım. Ve dürüst olmak gerekirse, MySQL'den performansın her bir bitini sıkıştırmak için ince ayar konusunda endişelenmiyorum, ancak en iyi sonuçlardan bazılarını sağlayan en önemli şeyin önbellekleri / arabellekleri doğru şekilde ayarlamak olduğunu biliyorum.

Bir depolama motoru olarak sadece InnoDB kullanarak işleri basit tutmaya çalıştım. Ve MySQL için özel bir sunucum var. 8GB RAM'e sahip, performansı en üst düzeye çıkarmak için bunu nasıl ayırmalıyım? En iyi performans için tüm veritabanımı belleğe sığdırmak istiyorum. Veritabanı yaklaşık 5gb'dir. Mümkün mü?

Sorgu önbelleğine ne kadar bellek ayırmalıyım? InnoDB tampon havuzuna ne kadar? Bilgisayarın geri kalanı için ne kadar (yani MySQL ile ilgili olmayan işlemler)? Vb.

MyISAM kullanmadığımdan, anahtar önbelleğe doğru çok fazla bellek koymam gerekmiyor mu?

Yanıtlar:


25

Bu, veritabanının kendisi hakkında fazla bir şey bilmeden zor. Dikkat etmeniz gereken birkaç araç vardır;

Veritabanının tamamını belleğe kaydetme hakkında; Veritabanında değişiklik yapan sorgular, yazma işlemi diskte yapılana kadar açık kalacaktır. Diskin bir darboğaz olmasını engelleyebilecek tek şey, yazma önbelleğine sahip bir disk denetleyicisidir.

Ben varsayılanlardan aşağıdaki değişikliklerle başlar:

key_buffer_size = 128M
thread_stack = 128K
thread_cache_size = 8
table_cache = 8192
max_heap_table_size = 256M
query_cache_limit = 4M
query_cache_size = 512M

innodb_buffer_pool_size = 4G 

# This is crucial to avoid checkpointing all the time:
innodb_log_file_size = 512M

# If you have control on who consumes the DB, and you don't use hostnames when you've set up permissions - this can help as well.
skip_name_resolve

Sonra şeylerin nasıl gittiğini görürüm ve yukarıda bahsedilen araçların çıktısına (diğer şeylerin yanı sıra) farklı şeyler denerdim. Ayrıca , gerçekte ne tür bir iş yüküyle uğraştığımı görmek için trendleri Munin veya Kaktüsler gibi bir izleme aracıyla grafiklendirmeyi de isterdim . Şahsen, Munin ile sağlanan MySQL eklentileri ile harika bir deneyimim var.


Teşekkürler bunu denemek ve yeni bir şey öğrenip öğrenemeyeceğime bakacağım.
billmalarky

@billmalarky serverfault'a hoş geldiniz! :) Aldığınız yanıttan memnunsanız, soruyu doğru bir şekilde onaylamayı veya işaretlemeyi unutmayın.
Kvisle

Tavsiye için +1 + mysqltuner.pl !!!
RolandoMySQLDBA

@Kvisle Hoşgeldin için teşekkürler! Bir süredir stackoverflow'dayım (iyi ... birkaç ay ...) ama serverfault için yeniyim. Aslında voxel.net ile ev sahipliği yapan ve promanaged hosting (IE sistem desteği) gerçekten harika ama bu konuda onlarla konuşurken tam bir araç gibi ses vermedi de dışarıdan bir görünüm aramak için uygun olacağını düşündüm.
billmalarky

1
@Kvisle Ayrıca, doğru bir cevabı işaretleyeceğim, ancak bunun iyi bir beyin fırtınası yapmak için biraz güveç yapmasını istiyorum.
billmalarky

9

İMHO ile gidebilmelisin

innodb_buffer_pool_size=5G

Bu, Sunucu İşletim Sistemi için yeterli miktarda RAM ve DB Bağlantıları için bellek içeren RAM'in% 62,5'i olacaktır.

@kvisle mysqltuner.pl kullanılması önerilir. Bu komut dosyası, join_buffer_size, sort_buffer_size, read_buffer_size ve read_rnd_buffer_size değerlerine ayrılacak RAM miktarını değerlendirmek için mükemmeldir. Birlikte eklenen bu 4 arabellek max_connections ile çarpılır. Bu yanıt statik arabelleklere eklenir (innodb_buffer_pool_size + key_buffer_size). Birleştirilen toplamlar raporlanır. Bu birleşik toplam RAM'in% 80'ini aşarsa, o zaman bu tampon boyutlarını düşürmeniz gerekir. mysqltuner.pl bu konuda çok yardımcı olacaktır.

Tüm verileriniz InnoDB olduğundan, key_buffer_size (MyISAM dizinleri için anahtar önbellek arabelleği) çok düşük yapabilirsiniz (64M önerilir).

Burada önerilen bir innodb_buffer_pool_size boyutunu hesaplamak için DBA StackExchange'te yaptığım bir gönderi .

GÜNCELLEME 2011-10-15 19:55 EDT

5 GB'lık veriye sahip olacağını biliyorsanız, ilk tavsiyem tamamdı. Ancak, bir şey eklemeyi unuttum:

[mysqld]
innodb_buffer_pool_size=5G
innodb_log_file_size=1280M

Günlük dosyası boyutu InnoDB Arabellek Havuzunun% 25'i olmalıdır

GÜNCELLEME 2011-10-16 13:36 EDT

% 25 kuralı kesinlikle iki günlük dosyası kullanmaya dayanır. Birden fazla innodb günlük dosyası kullanmak mümkün olsa da, ikisi genellikle en iyi sonucu verir.

Diğerleri% 25 kullanarak ifade etti

Bununla birlikte, tüm adaletle, orijinal InnoBase Oy şirketinden biri daha büyük InnoDB Tamponları Havuzu'na sahip olduğu için% 25 kuralını kullanmadığını ifade etti .

Doğal olarak,% 25 kuralı çok miktarda RAM olduğunda çalışamaz. Aslında, yalnızca 2 günlük dosyası kullanılmasına izin verilen en büyük innodb_log_file_size 2047M'dir, çünkü günlük dosyasının birleştirilmiş boyutu 4G'den (4096M) küçük olmalıdır

NOKTA DURUMU: İşverenimin müşterilerinden birinin 192GB RAM'e sahip bir DB sunucusu var. 48G günlük dosyalarına sahip olmanın bir yolu yoktur. Ben bir innodb günlük dosyası, 2047M için maksimum dosya boyutunu kullanın. @ Kvisle'ın cevabım hakkındaki yorumu, kendinizi iki günlük dosyasıyla sınırlamanız gerekmediğini belirten bir bağlantı veriyor. N günlük dosyalarınız varsa, bunlar toplam 4G olamaz. % 25 kuralım sadece mükemmel bir dünyada (8 GB veya daha az DB Sunucusu).


Teşekkürler, kesinlikle mysqltuner.pl kullanacağım. Ancak, sormalıyım, veritabanım şu anda boşsa bu komut dosyası hala doğru mu olacak? Tüm tablolar ve şema doğru ayarlanmış, ancak gerçek veri yok. Ben 5gb geçerli adanmış sunucumda kullanacağım örnek boyutu olarak kullandım (yani, DB bundan daha büyük olursa bir kez muhtemelen daha iyi adanmış bir sunucuya geçecektir). Şu anda veritabanı boş (henüz başlatılmamış yepyeni bir sitedir) ama mysql'i ölçeklendirmeyi iyi başlatmadan önce ayarlamak istiyorum.
billmalarky

Cevabım güncellendi !!!
RolandoMySQLDBA

"InnoDB arabellek havuzu% 25 olmalı" yorum yapmak istiyorum. Çünkü% 100 doğru değil. Daha ayrıntılı bir cevap için dev.mysql.com/doc/refman/5.0/en/… adresini okuyun . Performans açısından, boyutu varsayılandan biraz arttırmak için çok yardımcı olur, ancak bunu maksimuma çıkarmanız gerekmez.
Kvisle

Rolando, yardımın için teşekkürler. Bu konuyu referans olarak işaretledim. Ayrıca, şimdi bu mysqltuner betiğini kullanıyorum.
billmalarky
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.