MySQL'in birden fazla çekirdek kullanması mümkün mü?


131

Asla tek bir çekirdekten fazlasını kullanmayan bazı özel MySQL sunucularına sunuldum. MySQL için DBA'dan daha geliştiriciyim, bu nedenle yardıma ihtiyacım var

Kurmak

Sunucular bir OLAP / DataWarehouse (DW) tipi yük ile oldukça ağır:

  • Birincil: 96 GB RAM, 8 çekirdek + tek RAID 10 dizi
  • Test: 4 çekirdekli 32GB RAM
  • En büyük DB 540 GB, toplam ise 1,1 TB ve çoğunlukla InnoDB masalarıdır
  • Solaris 10 Intel-64
  • MySQL 5.5.x

Not: En büyük DB, OLTP DR sunucusundan çoğaltılmıştır ve DW bundan yüklenir. Tam bir DW değil: sadece 6 ay ila 6 hafta arası, bu yüzden OLTP DB'den daha küçük.

Test sunucusundaki gözlemler

  • 3 ayrı bağlantı
  • her birinin bir eşzamanı vardır (ve farklı) ALTER TABLE...DROP KEY...ADD INDEX
  • 3 masa 2,5, 3,8 ve 4,5 milyon sıraya sahiptir.
  • CPU kullanımı% 25'e kadar çıkar (bir çekirdek maksimuma çıkarıldı) ve daha yüksek değil
  • 3 ALTER 12-25 dakika sürer (en küçüğü tek olan 4.5)

Sorular

  1. Birden fazla çekirdeğin kullanılmasına izin vermek için hangi ayar veya yama gereklidir?
    Yani, MySQL neden mevcut tüm çekirdeği kullanmıyor? (diğer RDBMS'ler gibi)
  2. Çoğaltmanın sonucu mu?

Diğer notlar

  • Bir RDBMS "thread" ve bir OS "thread" arasındaki farkı anlıyorum
  • Herhangi bir paralellik biçimi hakkında soru sormuyorum
  • InnoDB ve thread için bazı sistem değişkenleri en düşük seviyededir
    (hızlı bir kazanç arayışı içinde)
  • Kısa vadede, disk düzenini değiştiremiyorum
  • Gerekirse işletim sistemi çimdiklenebilir
  • En küçük masadaki tek bir ALTER TABLE, 4.5 dakika sürer (şok edici IMO)

Düzenle 1

  • innodb_thread_concurrency her ikisinde de 8 olarak ayarlanmıştır. Evet, yanlış ama MySQL'in çoklu çekirdek kullanmasını sağlamaz
  • innodb_buffer_pool_size birincil olarak 80 GB, testte 10 GB'dir (başka bir örnek kapatılır). Bu şimdilik.
  • innodb_file_per_table = AÇIK

Düzenle 2

Test etmek

  • innodb_flush_method, olması gerektiği zaman O_DIRECT olarak görünmüyor
  • RolandoMySQLDBA'nın ayarlarını takip edecek

Önemli bir şeyi kaçırdıysam bana bildirin

Şerefe

Güncelleme

RolandoMySQLDBA'nın yanıtındaki değiştirilmiş innodb_flush_method + 3 x thread ayarları
Sonuç:> Testlerde kullanılan 1 çekirdek = pozitif sonuç


@ Test: innodb_file_per_table = AÇIK. SHOW ENGINE INNODB STATUS \ G yalnızca komut satırı mı?
gbn

@ Test: SQLyog'da çıktı alamadım ve birinden bunu komut satırından çalıştırmasını istemek zorundayım
gbn 12:11

1
webyog.com/forums/index.php?showtopic=1290 olmadan çalışmalısınız \G. Ayrıca, 5.5 SHOW INNODB STATUSlehine reddedildiğini düşünüyorum SHOW ENGINE INNODB STATUS(eski komut satırında çalışan bir hata alıyorum.
Derek Downey

1
Diğer tüm cevaplar iyi olsa da, bir geliştirici olduğunuz için, Shard Query kodlarına bir göz atmanızı tavsiye ederim code.google.com/p/shard-query Özellikle bir datawarehouse ortamında size yardımcı olabilir.
Jonathan,

Teşekkürler, düşündüğümüz bir seçenek. Ben de DBA rolünü üstlüyorum.
gbn

Yanıtlar:


123

Aslında Mayıs 2011'de Percona Live NYC konferansında bir MySQL Uzmanı ile innodb_thread_concurrency'i tartıştım .

Şaşırtıcı bir şey öğrendim: Belgelere rağmen innodb_thread_concurrency, 0'da ( en iyi eşzamanlılık) bırakmak en iyisidir . Bu şekilde, InnoDB innodb_concurrency_ticketsverilen MySQL örneği kurulumunda açılacak en iyi sayıya karar verir .

innodb_thread_concurrency0'a ayarladıktan sonra innodb_read_io_threadsve innodb_write_io_threads(her ikisi de MySQL 5.1.38'den beri) maksimum 64 değerine ayarlayabilirsiniz . Bu, daha fazla çekirdek kullanmalıdır.


Bunu deneyeceğim. Ben şeyler dayalı zaten 0'a innodb_thread_concurrency çıkaracağını ben de okudum
GBN

9
İnnodb_thread_concurrency için +1 = 0
randomx

3
@gbn - DBA.SE'deki 1. kişiden gelen bir teşekkür, bir güven artırıcı ve çok takdir edilir. Teşekkürler ve rica ederim !!!
RolandoMySQLDBA

global innodb_read_io_threads = 8 değerini ayarlayın Hata Kodu: 1238. 'innodb_read_io_threads' değişkeni salt okunur bir değişkendir
wgq3g23g

2
@ wgq3g23g RDS yapıyorsanız, DB Parametre Grubunda bunu değiştirin ve örneği yeniden başlatın. EC2 veya çıplak metal yapıyorsanız, bu seçeneği mysqld'e ekleyin my.cnfve yeniden başlatın. Lütfen.
RolandoMySQLDBA

29

MySQL otomatik olarak birden fazla çekirdek kullanacaktır, bu nedenle% 25'lik yükünüz tesadüf 1 veya Solaris'te olası bir yanlış yapılandırma olabilir. Solaris'i nasıl ayarlayacağınızı biliyormuş gibi davranmayacağım, ama işte solaris'e özgü bazı ayar bilgileri üzerinden geçen bir makale .

InnoDB ayar sayfaları MySQL 5.5 'te elden geçirilmiş, bu yüzden orada bazı iyi bilgiler de var. Gönderen InnoDB'nin disk GÇ ipuçları :

Unix üst aracı veya Windows Görev Yöneticisi, iş yükünüzle CPU kullanım yüzdesinin% 70'ten az olduğunu gösteriyorsa, iş yükünüz büyük olasılıkla diske bağlıdır. Belki de çok fazla işlem taahhüdünde bulunuyorsunuz ya da tampon havuzu çok küçük. Yapımı tampon havuzu daha büyük yardımcı olabilir, ancak fiziksel bellek fazla% 80'ine eşit ayarlamayın.

Kontrol edilecek diğer şeyler:

  • Anahtarlama innodb_flush_method O_DIRECT değer testidir. Bu yardımcı olursa, dosya sistemini forcedirectioseçenekle takmanız gerekebilir.

  • Değişim innodb_flush_log_at_trx_commit veya 2 (OS kazasında son saniye kaybetme sakıncası yoksa) (Mysql kazasında son saniye kaybetme sakıncası yoksa) 1'den 0'a.

  • İnnodb_use_sys_malloc değerini kontrol edin . Bu makale değişken hakkında daha fazla bilgi içermektedir .

    O zamanlar, çok çekirdekli işlemciler için ayarlanmış hiçbir bellek ayırıcı kütüphanesi yoktu. Bu nedenle, InnoDB mem alt sisteminde kendi hafıza ayırıcısını uyguladı. Bu tahsisatçı, darboğaz olabilecek tek bir muteks tarafından korunur.

    Ancak, bölümün sonunda, değişkeni açmanın ne demek olduğu hakkında bazı uyarılar var (varsayılan olarak 5.5'te açıktır).

    InnoDB bellek ayırıcısı devre dışı bırakıldığında, InnoDB'nin innodb_additional_mem_pool_size parametresinin değerini göz ardı edeceğini unutmayın.

  • Çoğaltmanın bazı sorunlara neden olması mümkündür. Paralellikle ilgilenmediğinizi, ancak bu çalışma grubunun tanımından anladığınızı fark ediyorum :

    Şu anda, çoğaltma çok çekirdekli makinelerde iyi ölçeklenmiyor. Tekli iş parçacığı iş parçacığı çoğaltma olaylarını tek tek yürütür ve ayrı ana sunucunun işlemcisi tarafından sunulan eşzamanlı çoklu istemci bağlantıları tarafından üretilen bir yükle baş edemez.

Sonuçta, InnoDB gerçekleşen disk tabanlı işlemler nedeniyle veri depolama için en iyi motor olmayabilir. Datawarehouse tablo (larını) Sıkıştırılmış MyISAM olarak değiştirmeyi düşünebilirsiniz .

1 Tesadüf olarak, yükünüzün% 25'in üzerine çıkmasını engelleyen bir darboğaz var, ancak zorunlu olarak tek bir çekirdekli sorun değil.


Teşekkürler. Soruya Ayarlar bölümü eklendi. Sorun, tek bir çekirdeği kullanan birkaç yoğun sorgular: bellek ya da iş parçacığı ayarları henüz değil. Daha fazla konu hala aynı çekirdek üzerinde çalışıyor
gbn

Gbn güncelleme için teşekkürler, hala arıyorum. Bunun bir 'tesadüf' olduğunu düşünüyordum. Yalnızca solaris sorunu olup olmadığını merak ediyorum ( developers.sun.com/solaris/articles/mysql_perf_tune.html ), ancak bu sistem hakkında fazla bir şey bilmiyorum.
Derek Downey

1
@Destest: Bu makaleyi Solaris yöneticisine
yazacağım.

1
Şimdi, çoğaltma (isteğe bağlı olarak) Slave'de çok iş parçacıklı. InnoDB, bu Yanıtın yazıldığı günden beri geliştirilmiştir. Özellikle sıkıştırılmışsa değil, MyISAM'ı kullanmanızı tavsiye etmem.
Rick James,

15

Tek bir bağlantı sadece tek bir çekirdek kullanır. (Tamam, InnoDB, bazı giriş / çıkış işlemleri için çekirdekler, dolayısıyla çekirdekler kullanır, ancak bu önemli değildir.)

3 ALTER aldınız, bu yüzden 3 çekirdeğin değerinden fazlasını kullanmıyordunuz.

Ne yazık ki, BÖLÜM bile birden fazla çekirdek kullanmıyor.

Yakın zamana kadar, 4-8 çekirdekten sonra çoklu bağlantılar kopardı. Percona'nın Xtradb'si (MariaDB'ye dahil), birden fazla çekirdeği daha iyi kullanıyor, ancak yine de iş parçacığı başına sadece bir tane kullanıyor. Yaklaşık 32 çekirdekte maksimuma çıkarlar.


(2015'teki güncelleme :) 5,6 ile çoklu bağlantılar, yaklaşık 48 çekirdekte maksimuma çıkıyor. 5.7 daha iyi olacağına söz verir. (Yani Oracle kıyaslamaları söylüyor.) Ancak tek bir bağlantı için birden fazla çekirdek kullanmıyor.
Rick James

Güncelleme (Oracle'ın OpenWorld'üne gittikten sonra): Yeni sürüm 8.x herhangi bir paralelliğe sahip olmayacak.
Rick James

9

IMHO ve tarif edilen kullanım durumunda, asla birden fazla çekirdek kullanmayacaksınız. Bunun nedeni, iş yükünüzün CPU'ya bağlı değil, IO'ya bağlı olmasıdır. 3 bağlantınız yeni bir Dizin oluşturduğundan, her birinin tüm tabloyu diskten okuması gerekir: Dizinleri hesaplamak değil, zaman alan budur.


8

Darboğazınızın dosya sisteminizin IO performansı olabileceğini göz önünde bulundurun.

@RolandoMySQLDBA tarafından önerilen ayarlara ek olarak , aynı zamanda mysql veri dizinini ( benim için monte edilmiş ) tutan bölümün noatimemontaj ayarlarını da /etc/fstabyaptım ./data01/mysql/dev/sdb1/data01

Varsayılan olarak linux, özellikle veri tabanları gibi yüksek IO uygulamaları için IO performansını olumsuz yönde etkileyen HER ÇOK okuma veya yazma erişim zamanını kaydeder. Bu, hatta bir dosyadan veri okumak bile diske yazmaya yazma anlamına gelir ... WAT!

Bunu devre dışı bırakmak için, istediğiniz montaj noktası için noatimemount seçeneğini /etc/fstabaşağıdaki gibi ekleyin (benim durumumda örnek):

/dev/sdb1  /data01  ext4  defaults,noatime  0  2

Ardından bölümü yeniden yerleştirin:

mount -o,remount /data01

Bu, bu bölümü kullanan uygulamaların okuma / yazma performansını artırmalıdır. AMA ... hiçbir şey tüm verilerinizi bellekte tutmaya kalkar.

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.