Tabel InnoDB yang berat tidak akan menggunakan semua CPU saya

8

Saya memiliki basis data paket log, yang hampir tidak pernah dipertanyakan. Itu hanya perlu cepat pada sisipan. Saya menggunakan InnoDB karena saya ingin mempertahankan kepatuhan ACID, karena kehilangan satu paket saja dapat merusak pelanggan kami. Dalam skenario penyempurnaan kinerja, saya mengirim 1.000.000 paket ke server melalui beberapa koneksi DB. Tetapi apa pun pengaturan yang saya gunakan di my.cnf, saya tidak bisa mendapatkan proses mysqld untuk menggunakan lebih dari 900% CPU pada sistem dengan 12 core. (Tidak ada yang berjalan di kotak.)

Saya sudah mengatur yang berikut ini

  • innodb_file_per_table = 1
  • innodb_write_io_threads = 64
  • innodb_read_io_threads = 64
  • innodb_thread_concurrency = 0

Jika saya menggunakan MyISAM, saya bisa mendapatkan semua paket yang ditulis dalam waktu sekitar 6 detik. Tapi InnoDB membutuhkan waktu sekitar 25. Bisakah saya membuat MySQL menggunakan sisa sumber daya sistem dan memasukkan lebih cepat?

Sunting: Berikut skema untuk tabel:

+-------+----------------------+------+-----+---------+-------+
| Field | Type                 | Null | Key | Default | Extra |
+-------+----------------------+------+-----+---------+-------+
| t     | bigint(20) unsigned  | YES  |     | NULL    |       |
| a     | char(1)              | YES  |     | NULL    |       |
| sa    | int(10) unsigned     | YES  |     | NULL    |       |
| sb    | int(10) unsigned     | YES  |     | NULL    |       |
| sc    | int(10) unsigned     | YES  |     | NULL    |       |
| sd    | int(10) unsigned     | YES  |     | NULL    |       |
| sp    | smallint(5) unsigned | YES  |     | NULL    |       |
| da    | int(10) unsigned     | YES  |     | NULL    |       |
| db    | int(10) unsigned     | YES  |     | NULL    |       |
| dc    | int(10) unsigned     | YES  |     | NULL    |       |
| dd    | int(10) unsigned     | YES  |     | NULL    |       |
| dp    | smallint(5) unsigned | YES  |     | NULL    |       |
+-------+----------------------+------+-----+---------+-------+

sunting2: Saya telah mengumpulkan lebih banyak sisipan bersama sehingga satu permintaan mendekati panjang maksimum (sekitar 16.000.000 karakter). Basis data sekarang melonjak menjadi 1100% selama dua detik, kemudian turun menjadi 100% untuk sisa waktu. Total waktu sekarang 21 detik, atau sekitar 16% lebih cepat daripada ketika saya mulai.

sep332
sumber

Jawaban:

7

Anda harus mendongkrak innodb_io_capacity juga.

Standarnya adalah 200. Naikkan menjadi 5000 sebagai permulaan. Saya akan pergi ke 20000.

Anda mungkin juga ingin memastikan ib_logfile0dan ib_logfile1cukup besar. Nilai default untuk innodb_log_file_size adalah 5M. Saya akan menaikkannya menjadi 1G sebagai permulaan.

Pool Buffer InnoDB yang lebih besar juga akan membantu, mungkin 4G.

Untuk rekap, gunakan pengaturan tambahan ini:

[mysqld]
innodb_io_capacity=5000
innodb_buffer_pool_size=4G
innodb_log_file_size=1G

Setelah menambahkan pengaturan ini ke my.cnf, untuk mengubah ukuran ib_logfile0 / ib_logfile1 lakukan hal berikut

service mysql stop
rm -f /var/log/mysql/ib_logfile[01]
service mysql start

File ib_logfile0 dan ib_logfile1 dibuat ulang. Jangan khawatir, saya sudah melakukan ini berkali-kali .

Anda mungkin harus melakukan sesuatu yang tidak biasa untuk InnoDB

Coba yang berikut ini:

  • Kunci Meja Lengkap pada tabel InnoDB
  • Lakukan Beban Massal
  • Lepaskan Kunci
RolandoMySQLDBA
sumber
Apakah akan membantu untuk memiliki beberapa kumpulan buffer? Atau karena hanya satu meja, apakah itu penting?
sep332
Hanya satu kolam penyangga. Dengan begitu tidak ada batasan virtual. Saya memiliki klien yang memiliki MySQL 5.5.9 menggunakan kolam penyangga 162GB tunggal dan ini berjalan sangat baik.
RolandoMySQLDBA
Dengan menggunakan ini saya mendapatkan sekitar 950% CPU, tetapi sepertinya tidak lebih cepat.
sep332
Coba kunci tabel penuh pada tabel InnoDB sebelum memuat massal.
RolandoMySQLDBA
3

Ada sejumlah faktor yang memengaruhi kemampuan untuk memaksimalkan penggunaan beberapa inti.

  • Beberapa mutex akan berdampak pada banyak CPU sehingga beberapa menunggu sebelum mereka dapat melanjutkan.
  • Anda memerlukan utas aktif sebanyak CPU. Jika beban kerja Anda menghasilkan 9 utas paralel, Anda tidak dapat mengisi 12 inti.
  • Kapasitas I / O harus cukup untuk menyediakan pekerjaan yang cukup untuk semua CPU. Jika Anda antri pada disk I / O atau menunggu pesan jaringan, maka Anda tidak akan dapat mengisi CPU.

Alat seperti SAR akan memungkinkan Anda untuk menentukan apakah ada hambatan yang mengurangi kapasitas Anda. Hanya diperingatkan, menghilangkan satu bottleneck, hanya akan memindahkan bottleneck.

BillThor
sumber