MySQL neden hafızamın bittiğini söylüyor?


9

INSERT...SELECTJDBC ile MySQL'de oldukça büyük bir yürütme yapmaya çalışıyordum ve aşağıdaki istisnayı aldım:

Exception in thread "main" java.sql.SQLException: Out of memory (Needed 1073741824 bytes)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)

Aslında bir ResultSet nesnesi döndürmediğim için, Java yığın alanının bir sorun olmaması gerektiğini düşündüm. Ancak, yine de yukarı denedim ve hiç iyi olmadı. Daha sonra ifadeyi MySQL Workbench'te yürütmeye çalıştım ve aslında aynı şeyi aldım:

Error Code 5: Out of memory (Needed 1073741816 bytes)

Bu işlemleri tamamlamak için bol miktarda RAM'e sahip olmalıyım (seçtiğim tüm tabloya sığacak kadar), ancak tüm belleğimden yararlanmak için ince ayar yapmam gereken çeşitli ayarlar olduğunu tahmin ediyorum. Bir Windows Server 2008 AMI ile Amazon EC2 Yüksek Bellek Çift Ekstra Büyük Örnek çalıştırıyorum . Daha iyi ayarları kullanmak için my.ini dosyasıyla uğraşmayı denedim, ancak bildiğim kadarıyla işleri daha da kötüleştirebilirdim. İşte o dosyanın bir dökümü:

[client]
port=3306
[mysql]
default-character-set=latin1
[mysqld]
port=3306
basedir="C:/Program Files/MySQL/MySQL Server 5.5/"
datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"
character-set-server=latin1
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
max_connections=100
query_cache_size=1024M
table_cache=256
tmp_table_size=25G
thread_cache_size=8
myisam_max_sort_file_size=100G
myisam_repair_threads = 2
myisam_sort_buffer_size=10G
key_buffer_size=5000M
bulk_insert_buffer_size = 4000M
read_buffer_size=8000M
read_rnd_buffer_size=8000M
sort_buffer_size=1G
innodb_additional_mem_pool_size=26M
innodb_flush_log_at_trx_commit=2
innodb_log_buffer_size=13M
innodb_buffer_pool_size=23G
innodb_log_file_size=622M
innodb_thread_concurrency=18
innodb_file_per_table=TRUE
join_buffer_size=4G
max_heap_table_size = 10G

Bu sadece ortamım için daha iyi çalışacak şekilde yukarıdaki ayarları değiştirmek midir? Öyleyse, hangi ayarları kullanmalıyım? Bu örneği kullanan tek kişi benim; Büyük veri kümelerinin istatistiksel analizini içeren kişisel hobi projem için kullanıyorum. Bu nedenle, kendi sorgularım için mevcut tüm kaynakları tüketmesine izin vermekten çekinmeyin.

Bu ayarların değiştirilmesi söz konusu değilse, sorun nedir? Her şeyi nasıl daha iyi yapılandıracağınız konusunda önerebileceğiniz herhangi bir yardım için teşekkürler.


1g sorgu önbelleğini kullanan herkes ne yaptığını bilmiyor.

@winmutt Çok doğru olabilirsiniz, ancak yorumunuz daha fazla açıklama yapmadan kimseye yardımcı olmaz. Görüşleriniz için nedenler vererek bize yardımcı olabilir misiniz?
Michael McGowan

Başlamak için kullanışlı bir araç tools.percona.com/wizard
KCD

Yanıtlar:


9

Bunun bir Windows kurulumu olduğu düşünüldüğünde, @DTest hala ilk doğru yönü sağladı.

Aşağıdaki formülü uygulayın:

Çoğu insan bunu kullanır:

Maximum MySQL Memory Usage = innodb_buffer_pool_size + key_buffer_size + (read_buffer_size + sort_buffer_size) X max_connections

Bunu tercih ederim:

Maximum MySQL Memory Usage = innodb_buffer_pool_size + key_buffer_size + ((read_buffer_size + read_rnd_buffer_size + sort_buffer_size + join_buffer_size) X max_connections)

Bu değişkenler, formül yüklü RAM'in% 80'ini veya daha azını verene kadar ayarlamanız gereken değişkenlerdir.

sort_buffer_size
read_buffer_size
read_rnd_buffer_size
join_buffer_size
max_connections

4

Tampon boyutlarınızı düşürmeyi denerdim. Onları sahip olduğunuz kadar büyük hale getirmek sorunlara neden olacaktır. Bu değerleri çalıştırmak için ne kadar belleğiniz var:

query_cache_size=1024M
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=10G
key_buffer_size=5000M
bulk_insert_buffer_size = 4000M
read_buffer_size=8000M
read_rnd_buffer_size=8000M
sort_buffer_size=1G
innodb_buffer_pool_size=23G

Arabellek boyutlarının bazıları iş parçacığı başına tahsis edilir, örneğin 10G'lik myisam_sort_buffer_size her iş parçacığı için 10G ayırır.

Öncelikle bu değerleri önemli ölçüde düşürürüm ve daha sonra (eğer varsa) bu kadar RAM tahsis etmek için hangi değerleri gerçekten araştırmanız gerekir.


4

MySQL'in ne kadar bellek ayırabileceğini düşünmenin hızlı bir yolu aşağıdaki gibidir:

wget mysqltuner.pl

perl mysqltuner.pl

Bu komut dosyasını çalıştırdığınızda, yüklü RAM MySQL'in yüzde kaçının güvenli bir şekilde ayırabileceğini düşündüğünü söyleyecektir. Verilen cevap% 100'ün üzerindeyse, arabellek boyutlarınızı kesinlikle düşürmeniz gerekir. Ana odak noktası:

sort_buffer_size
read_buffer_size
read_rnd_buffer_size
join_buffer_size
max_connections
key_buffer_size ( 4G'den sonra gerçekten etkili değil)

@DTest cevabında sizin için yönü zaten belirledi, bu yüzden onun anwser'ı için +1. Perl betiği ayarlamazsanız veya herhangi bir değeri değiştirirseniz ne olacağını size söyleyecektir. İşte bir örnek:

Bir müşterim
read_buffer_size = 128K
read_rnd_buffer_size = 256K
sort_buffer_size = 2M
join_buffer_size = 128K
max_connections = 1050

İşte mysqltuner.pl çıktı:

MySQLTuner 1.2.0 - Önemli Hayden
Bug raporları, özellik istekleri ve indirmeler http://mysqltuner.com/
Ek seçenekler ve çıktı filtrelemesi için '--help' ile çalıştırın
Lütfen MySQL yönetimsel giriş bilgilerinizi
girin : lwdba Lütfen MySQL yönetiminizi girin parola:

-------- Genel istatistikler ---------------------------------------- ----------
[-] MySQLTuner betiği için sürüm denetimi atlandı
[Tamam] Şu anda desteklenen MySQL sürüm 5.0.51a-community-log
[!!] 64 bit işletim sistemine geç - MySQL şu anda kullanılamıyor tüm RAM'iniz

-------- Depolama Motoru İstatistikleri --------------------------------------- ----
[-] Durum: + Arşiv -BDB + Birleşik + InnoDB -ISAM -NDBCluster
[-] MyISAM tablolarındaki veriler: 319M (Tablolar: 108)
[-] InnoDB tablolarındaki veriler: 2M (Tablolar: 5)
[!!] Toplam parçalanmış tablolar: 22

-------- Performans Metrikleri ---------------------------------------- ---------
[-] Şunun için: 52d 23h 15m 57s (72M q [15.875 qps], 241K conn, TX: 2B, RX: 1B)
[-] Okuma / Yazma: 59% / % 41
[-] Toplam arabellekler: 34.0M global + iş parçacığı başına 2.7M (1050 max iş parçacığı)
[!!] 32 bit sistemlerde 2GB RAM ayırmak sistem kararsızlığına neden olabilir
[!!] Mümkün olan maksimum bellek kullanımı: 2.8G (Kurulu RAM'in% 72'si)
[OK] Yavaş sorgular: 0% (54 / 72M)
[OK] Mevcut bağlantıların en yüksek kullanımı: 6% (65/1050)
[OK] Anahtar arabellek boyutu / toplam MyISAM dizinleri: 8,0M / 82.1M
[Tamam] Anahtar arabellek isabet oranı:% 100.0 (4B önbellek / 1M okuma)
[!!] Sorgu önbelleği devre dışı
[OK] Geçici tablo gerektiren sıralar:% 0 (0 geçici sıralama / 948K sıralama)
[OK] Diskte geçici tablolar oluşturuldu:% 3 (diskte 11K / toplam 380K)
[!!] İş parçacığı önbelleği devre dışı
[!!] Tablo önbellek isabet oranı: 0% (64 açık / 32K açık)
[OK] Dosyayı aç kullanılan limit:% 2 (125 / 5K)
[OK] Hemen alınan tablo kilitleri:% 99 (anında 30M / 30M kilitler)
[OK] InnoDB veri boyutu / tampon havuzu: 2.7M / 8.0M

-------- Öneriler ----------------------------------------- ------------
Genel öneriler:
Daha iyi performans için tabloları birleştirmek üzere OPTIMIZE TABLE öğesini çalıştırın
Kötü sorguları gidermek için yavaş sorgu günlüğünü etkinleştirin Dosya tanımlayıcı sınırlarını önlemek için thread_cache_size öğesini
4 olarak
kademeli olarak artırın table_cache öğesini kademeli olarak artırın
Değişkenler ayarlamak için:
query_cache_size (> = 8M)
thread_cache_size (4'ten başlayın)
table_cache (> 64)

Lütfen performans metrikleri altında dikkat edin

[-] Toplam arabellekler: Diş başına 34.0M küresel + 2.7M (maksimum 1050 iş parçacığı)

MySQL, /etc/my.cnf içindeki ayarlara bağlı olarak kurulu RAM'in% 72'sine kadar ayırabilir.

34M, innodb_buffer_pool_size ve kombine key_buffer_size tabanlıdır

İş parçacığı başına 2,7M, read_buffer_size + read_rnd_buffer_size + sort_buffer_size + join_buffer_size değerlerine dayanıyordu.

2.7M'nin katları, maks_bağlantıları temel alır.

Bu nedenle, Performans metrikleri raporunda yüklü RAM'in% 100'ünün (tercihen% 80'in altında) olduğunu söyleyene kadar bu parametreleri hesaplamanız gerekir.


Aracınızı kullanabileceğimden emin değilim; Windows kullanıyorum. Belgeler Windows'un desteklenmediğini belirtti, ancak yine de denedim. Çalıştırmayı denediğimde, $ PATH'ımda mysqladmin bulamadığını, ancak MySQL'in bin dizininin gerçekten de $ PATH'ımda olduğunu belirtti.
Michael McGowan

Maalesef Windows veri dizinini fark etmedim. Farklı bir cevap ekleyeceğim.
RolandoMySQLDBA

1

Ne kadar RAM'in olduğunu söylemedin mi? En az 32GB olduğunu düşünüyorum.

innodb_buffer_pool_size - 23G

O kadar RAM için iyi.

query_cache_size = 1G

Çok büyük. Büyük olduğunda verimsizdir. En fazla 50M önerilir.

anahtar-buffer_size = 5G

Windows'ta 4G (hala) sabit bir sınır olabilir, 4G sabit bir sınırı vardı. 5G'niz 1G'ye dönüşmüş olabilir. Her neyse, tüm masalarınız InnoDB ise, neden koç israfına neden olur. 50M olarak ayarlayın.

Hata mesajı tam olarak 1G olduğundan, böyle kokuyor sort_buffer_size. 32M makul olabilir.

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.