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
- 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) - Ç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
- innodb_flush_log_at_trx_commit = 2
- innodb_use_sys_malloc = AÇIK
- innodb_flush_method O_DIRECT olmalıdır (ancak VARIABLES GÖSTERMEKTEDİR)
- innodb_doublewrite = KAPALI
- Dosya sistemi = ZFS (Ve sysadmin bunu buldu: http://blogs.oracle.com/realneel/entry/mysql_innodb_zfs_best_practices )
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ç
\G
. Ayrıca, 5.5 SHOW INNODB STATUS
lehine reddedildiğini düşünüyorum SHOW ENGINE INNODB STATUS
(eski komut satırında çalışan bir hata alıyorum.