Saya telah disajikan dengan beberapa server MySQL khusus yang tidak pernah menggunakan lebih dari satu inti. Saya lebih pengembang daripada DBA untuk MySQL jadi butuh bantuan
Mempersiapkan
Server-servernya lumayan kuat dengan jenis beban OLAP / DataWarehouse (DW):
- Utama: RAM 96GB, 8 core + satu array RAID 10
- Tes: RAM 32GB dengan 4 core
- DB terbesar adalah 540 GB, totalnya sekitar 1.1TB dan sebagian besar tabel InnoDB
- Solaris 10 Intel-64
- MySQL 5.5.x
Catatan: DB terbesar adalah yang direplikasi dari server OLTP DR dan DW dimuat dari ini. Ini bukan DW lengkap: hanya bertahan 6 bulan hingga 6 minggu sehingga lebih kecil dari OLTP DB.
Pengamatan pada server uji
- 3 koneksi terpisah
- masing-masing memiliki bersamaan (dan berbeda)
ALTER TABLE...DROP KEY...ADD INDEX
- 3 tabel memiliki baris 2,5, 3,8 dan 4,5 juta
- Penggunaan CPU meningkat hingga 25% (satu inti sudah maksimal) dan tidak lebih tinggi
- 3 ALTER memakan waktu 12-25 menit (satu untuk yang terkecil membutuhkan 4,5)
Pertanyaan
- Pengaturan atau tambalan apa yang diperlukan untuk memungkinkan lebih dari satu inti digunakan?
Artinya, mengapa MySQL tidak menggunakan semua core yang tersedia? (seperti RDBMS lainnya) - Apakah ini konsekuensi dari replikasi?
Catatan lain
- Saya mengerti perbedaan antara "utas" RDBMS dan "utas" OS
- Saya tidak bertanya tentang segala bentuk paralelisme
- Beberapa variabel sistem untuk InnoDB dan utas bersifat kurang optimal
(mencari kemenangan cepat) - Jangka pendek, saya tidak dapat mengubah tata letak disk
- OS dapat di-tweak jika perlu
- Satu ALTER TABLE di meja terkecil membutuhkan waktu 4,5 menit (IMO mengejutkan)
Edit 1
- innodb_thread_concurrency diatur ke 8 pada keduanya. Ya, itu salah tetapi tidak akan membuat MySQL menggunakan banyak core
- innodb_buffer_pool_size adalah 80GB pada primer, 10GB pada tes (contoh lain dimatikan). Ini OK untuk saat ini.
- innodb_file_per_table = ON
Edit 2
- innodb_flush_log_at_trx_commit = 2
- innodb_use_sys_malloc = ON
- innodb_flush_method harus O_DIRECT (tetapi SHOW VARIABLES tidak menunjukkan ini)
- innodb_doublewrite = OFF
- Sistem file = ZFS (Dan sysadmin saya menemukan ini: http://blogs.oracle.com/realneel/entry/mysql_innodb_zfs_best_practices )
Untuk menguji
- innodb_flush_method tidak ditampilkan sebagai O_DIRECT kapan seharusnya
- akan mengikuti pengaturan RolandoMySQLDBA
Beri tahu saya jika saya melewatkan sesuatu yang penting
Tepuk tangan
Memperbarui
Mengubah innodb_flush_method + 3 x pengaturan ulir dalam jawaban RolandoMySQLDBA
Hasil:> 1 inti digunakan untuk pengujian = hasil positif
\G
. Juga, saya pikir SHOW INNODB STATUS
sudah usang mendukung SHOW ENGINE INNODB STATUS
di 5,5 (saya mendapatkan kesalahan menjalankan mantan di command-line.