MySQL maksimum bellek kullanımı


111

MySQL'in bir Linux sunucusunda kullandığı bellek miktarına nasıl bir üst sınır koymanın mümkün olduğunu bilmek istiyorum.

Şu anda MySQL, talep edilen her yeni sorguda hafızayı tutmaya devam edecek, böylece sonunda hafızası bitecek. MySQL tarafından bu miktardan daha fazlasının kullanılmaması için bir limit koymanın bir yolu var mı?


4
MySQL, "her yeni sorgu için hafızayı almaz ve sonunda bitmez". Bellek kullanımı bundan çok daha karmaşıktır.
Rick James

Yanıtlar:


183

MySQL'in maksimum bellek kullanımı büyük ölçüde donanıma, ayarlarınıza ve veritabanının kendisine bağlıdır.

Donanım

Donanım bariz olan kısımdır. Daha fazla RAM daha iyi, daha hızlı disk ftw . Yine de o aylık veya haftalık haber mektuplarına inanmayın. MySQL, Oracle donanımında bile doğrusal olarak ölçeklenmez. Bundan biraz daha zor.

Kısacası: tavsiye ne için pratik genel bir kural yoktur senin MySQL kurulumu. Her şey mevcut kullanıma veya projeksiyonlara bağlıdır.

Ayarlar ve veritabanı

MySQL, davranışını optimize etmek için sayısız değişken ve anahtar sunar. Sorunlarla karşılaşırsanız, gerçekten oturup (f'ing) kılavuzunu okumanız gerekir.

Veritabanına gelince - birkaç önemli kısıtlama:

  • masa motoru ( InnoDB, MyISAM, ...)
  • boyut
  • endeksleri
  • kullanım

Stackoverflow'daki çoğu MySQL ipucu size 5-8 sözde önemli ayarlar hakkında bilgi verecektir. Öncelikle, hepsi önemli değil - örneğin InnoDB'ye çok fazla kaynak ayırmak ve InnoDB'yi kullanmamak çok mantıklı değil çünkü bu kaynaklar boşa gidiyor.

Veya - birçok insan max_connectiondeğişkeni yükseltmeyi öneriyor - pek azı biliyorlar ki, MySQL'in max_connectionsihtiyaç duyulursa bunları karşılamak için daha fazla kaynak ayıracağını ima ediyor . Daha bariz çözüm, DBAL'nizdeki veritabanı bağlantısını kapatmak veya wait_timeoutbu iş parçacıkları serbest bırakmak için düşürmek olabilir .

Benim sürüklenmemi yakalarsanız - gerçekten okuyacak ve öğrenecek çok şey var.

Motorlar

Masa motorları oldukça önemli bir karardır, pek çok insan bunları erkenden unutur ve sonra kendilerini MyISAMkilitlenip tüm uygulamalarını engelleyen 30 GB büyüklüğünde bir masa ile savaşırken bulur .

Söyleyecek ortalama yok MyISAM berbat , ama InnoDByanıt verdiklerini tweaked neredeyse veya hemen hemen kadar hızlı MyISAMve teklifler üzerinde satır-kilitleme diye bir şey UPDATEoysa MyISAMo yazılır kilitleri tüm tablo.

MySQL'i kendi altyapınızda çalıştırma özgürlüğüne sahipseniz, percona sunucusuna da göz atmak isteyebilirsiniz çünkü Facebook ve Google gibi şirketlerin (hızlı bilirler) birçok katkılarının yanı sıra Percona'nın kendi drop- yerine InnoDB, aradı XtraDB.

Percona-server (ve -client) kurulumu (Ubuntu'da) için ana fikre bakın: http://gist.github.com/637669

Boyut

Veritabanı boyutu çok, çok önemlidir - ister inanın ister inanmayın, Intarweb'lerdeki çoğu insan hiçbir zaman büyük ve yoğun bir MySQL kurulumuyla uğraşmadı, ancak bunlar gerçekten var. Bazı insanlar trol yapacak ve "PostgreSQL Kullan !!! 111" gibi bir şey söyleyecek, ama şimdilik onları görmezden gelelim.

Sonuç olarak, boyuta bakılırsa, donanım hakkında karar verilecek. 80 GB'lık bir veritabanını 1 GB RAM'de gerçekten hızlı çalıştıramazsınız.

Endeksler

Bu değil: ne kadar çok, o kadar iyi. Yalnızca gerekli endeksler ayarlanmalı ve kullanım ile kontrol edilmelidir EXPLAIN. MySQL'in EXPLAINgerçekten sınırlı olduğunu ekleyin , ancak bu bir başlangıç.

Önerilen konfigürasyonlar

Bunlar my-large.cnfve my-medium.cnfdosyalar hakkında - bunların kimin için yazıldığını bile bilmiyorum. Kendininkini yuvarla.

Ayarlama astarı

Harika bir başlangıç, ayarlama astarıdır . Bu bir bash betiğidir (ipucu: linux'a ihtiyacınız olacak), çıktılarını alan SHOW VARIABLESve SHOW STATUSonu yararlı bir öneriye dönüştürür. Sunucunuz bir süre çalışmışsa, onlara dayandırılacak veriler olacağı için öneri daha iyi olacaktır.

Ayarlama astarı sihirli bir sos değil. Yine de değiştirilmesini önerdiği tüm değişkenleri okumalısınız.

Okuma

Mysqlperformanceblog'u tavsiye etmeyi gerçekten çok seviyorum . MySQL ile ilgili her türlü ipucu için harika bir kaynak. Ve bu sadece MySQL değil, aynı zamanda doğru donanım hakkında çok şey biliyorlar veya AWS vb. İçin kurulumlar öneriyorlar. Bu adamların yıllara dayanan deneyimleri var.

Elbette bir başka büyük kaynak da planet-mysql'dir .


Bilmiyorum tuning primer, nasıl karşılaştırılır mysqltuner?
greg0ire

38

Bu ayarları kullanıyoruz:

etc/my.cnf
innodb_buffer_pool_size = 384M
key_buffer = 256M
query_cache_size = 1M
query_cache_limit = 128M
thread_cache_size = 8
max_connections = 400
innodb_lock_wait_timeout = 100

aşağıdaki özelliklere sahip bir sunucu için:

Dell Server
CPU cores: Two
Processor(s): 1x Dual Xeon
Clock Speed: >= 2.33GHz
RAM: 2 GBytes
Disks: 1×250 GB SATA

16
Bence siz (ve bağlandığınız yazar) query_cache_size ve query_cache_limit'e yanlış bir yoldan sahip. MySQL'e söylüyorsunuz: 1MB'lık bir önbellek ayırın, ancak içine 128MB'den büyük herhangi bir sorgu koymayın. dev.mysql.com/doc/refman/5.0/en/query-cache-configuration.html
agtb

Max_connections'ı düşürürdüm. Hangi motoru kullanacağıma karar veririm ve her ikisi için de çok fazla alan ayırmazdım.
Rick James

19

Veritabanı bellek kullanımı karmaşık bir konudur. MySQL Performans blog sorunuzu kapsayan iyi bir iş yapar ve listelerinin "rezerv" belleğe derece pratik yüzden pek çok neden.

Eğer gerçekten kesin bir sınır koymak istiyorsanız, bunu yapabilirsiniz, ancak yerleşik bir ayar olmadığı için bunu işletim sistemi seviyesinde yapmanız gerekir. Linux'ta ulimit'i kullanabilirsiniz , ancak bunu empoze etmek için MySQL'in başlama şeklini değiştirmeniz gerekebilir.


En iyi çözüm, sunucunuzu ayarlamaktır, böylece normal MySQL bellek ayarlarının bir kombinasyonu MySQL kurulumunuz tarafından genel olarak daha düşük bellek kullanımına neden olur. Bu elbette veritabanınızın performansı üzerinde olumsuz bir etkiye sahip olacaktır, ancak ince ayar yapabileceğiniz bazı ayarlar my.inişunlardır:

key_buffer_size
query_cache_size
query_cache_limit
table_cache
max_connections
tmp_table_size
innodb_buffer_pool_size

Oradan başlayıp istediğiniz sonuçları alıp alamayacağınıza bakardım. Orada birçok makale MySQL bellek ayarlarını düzenleyerek ilgili olup.


Düzenle:

MySQL'in daha yeni 5.1.x sürümlerinde bazı değişken adlarının değiştiğine dikkat edin .

Örneğin:

table_cache

Şimdi:

table_open_cache

2
Selam! Cevabınız için teşekkürler. İnsanların alıntı yaptığı denklemin şu olduğunu fark ettim: key_buffer_size + (read_buffer_size + sort_buffer_size) * max_connections = Total Memory. Aşağıdakileri ayarladım: key_buffer_size = 128M, read_buffer_size = 1M, sort_buffer_size = 2M, max_connections = 120 ve sunucudaki toplam bellek 512M. Bununla birlikte, birçok sorgulamadan sonra, boş bellek 12M'ye kadar düştü ve muhtemelen daha fazla kullanımla azalmaya devam edecek. Bunun böyle olmasının bir nedeni var mı ve önlenebilir mi? Teşekkürler!

Ya da belki sunucudaki toplam belleği (512M) değil, boş belleği (yani tüm işletim sistemi ile ilgili ve diğer programları yükledikten sonra kullanılabilir bellek) dikkate almam gerekiyor?

1
RAM'de depolanabilen geçici tabloların boyutunu artırmak amacıyla tmp_table_size'yi değiştirecekseniz, ayrıca max_heap_table_size değerini artırmayı unutmayın - MySQL ikisinin minimumunu kullandığından ...
Dave Rix

1
@TimothyMilsud - Böyle bir formül gerçekten işe yaramıyor. Ve bir formül çok fazla RAM kullanıldığını iddia ettiğinde çoğu sunucu oldukça iyi çalışır.
Rick James

19

mysqld.exe RAM'de 480 mb kullanıyordu. Bu parametreyi my.ini'ye eklediğimi buldum

table_definition_cache = 400

bellek kullanımını 400.000+ kb'den 105.000 kb'a düşüren


Bu hangi bölümün altına giriyor? Benimkine ekledim ve hizmet başlamayı reddetti.
Sözdizimi Hatası

Boşver, onu [wampmysqld] altına taşıdım ve harika çalıştı ve kullandığım belleği önemli ölçüde azalttı. Bu süreçte localhost sayfa yüklerimi de hızlandırmış olabileceğini düşünüyorum, şimdi daha hızlı görünüyorlar.
Sözdizimi Hatası

Varsayılan ve minimum 400 olsa da, sizin durumunuzda onu 400'ün üzerine getiren nedir?
Wadih M.

5

içinde /etc/my.cnf:

[mysqld]
...

performance_schema = 0

table_cache = 0
table_definition_cache = 0
max-connect-errors = 10000

query_cache_size = 0
query_cache_limit = 0

...

256MB Bellek ile sunucuda iyi iş çıkardınız.


Neden table_definition_cache= 0? Bazı açıklamalar güzel olurdu. Ve temelde sorguları önbelleğe almıyorsunuz ... aynı etkiye sahipseniz query_cache_type = 0:)
Khom Nazid

0

Docker mysql konteynerinizi optimize etmek istiyorsanız, aşağıdaki komut yardımcı olabilir. Mysql docker container'ı varsayılan 480mb'den sadece 100 mbs'ye kadar çalıştırabildim

docker run -d -p 3306: 3306 -e MYSQL_DATABASE = test -e MYSQL_ROOT_PASSWORD = çok veya -e MYSQL_USER = test -e MYSQL_PASSWORD = test -v / mysql: / var / lib / mysql --name mysqldb mysql --table_definition_ --performance_schema = 0 --default-authentication-plugin = mysql_native_password

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.