Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana Benchmark Kinerja MySQL Menggunakan SysBench

Pada artikel ini kita akan membahas sysbench, standar aktual untuk benchmarking MySQL. Kita akan melihat dasar-dasar penggunaan sysbench dan bagaimana kita bisa menggunakan sysbench untuk belajar tentang MySQL dan yang kedua adalah aspek yang paling penting bagi kita. Kami praktis akan menggunakan sysbench sebagai alat untuk menghasilkan lalu lintas yang kami ketahui banyak karena sysbench akan menyimpan beberapa informasi tentang lalu lintas yang dihasilkan setiap detik.

Pengujian SysBench MySQL 

Sysbench adalah alat benchmark multi-utas berdasarkan luaJIT. Ini adalah standar aktual untuk benchmark MySQL, harus dapat terhubung ke database.

Instalasi Sysbench

Pertama, kita perlu menginstal sysbench, saya menginstal sysbench di server lain sehingga kami dapat menguji dampak sebenarnya dari beban pada server MySQL kami.

curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bashyum -y install sysbench

Itu sudah diatur Sangat mudah untuk menginstal sysbench, lebih baik mengizinkan sysbench untuk berinteraksi dengan Server MySQL di tingkat firewall, karena ini lingkungan pengujian saya telah menonaktifkan firewall di kedua host untuk mencegah kesulitan.

Lingkungan Siap untuk SysBench:

Untuk pengujian ini, saya membuat database sbtest dan pengguna sbtest_user dan akan memberikan semua HAK ISTIMEWA kepada sbtest_user di database sbtest.

menggunakan root;

mysql> buat database sbtestmysql> buat pengguna sbtest_user yang diidentifikasi dengan 'password';mysql> berikan semua pada sbtest.* ke `sbtest_user`@`%`;mysql> tampilkan hibah untuk sbtest_user;+------- -------------------------------------------------- +| Hibah untuk [email protected]%                            |+----------------------------------------- -----------------+| HIBAH PENGGUNAAN DI *.* KEPADA `sbtest_user`@`%`                || BERIKAN SEMUA HAK ISTIMEWA DI `sbtest`.* KEPADA `sbtest_user`@`%` |+------------------------------- --------------------------+

Kinerja MySQL Menggunakan SysBench

Konfigurasi Tolok Ukur:

Langkah persiapan sysbench membuat tabel dengan data yang akan digunakan dalam benchmark. Dalam contoh ini kita menjalankan perintah persiapan. Ada beberapa parameter dengan MySQL di awal, itu akan menjadi parameter koneksi. Parameter lainnya adalah parameter dari pengujian oltp_read_write.lua dan kami menetapkan pengujian itu sendiri yaitu oltp_read_write.lua dan bahwa kami menjalankan perintah persiapan. Opsi yang dimulai dengan MySQL adalah menentukan koneksi MySQL, nama host dan port untuk terhubung, nama pengguna dan kata sandi untuk terhubung, dan skema default untuk koneksi. Tabel dan parameter table_size adalah properti dari pengujian oltp_read_write.lua.

Artinya langkah persiapan akan membuat 16 tabel dengan 10.000 aturan di masing-masing tabel. Langkah selanjutnya adalah menjalankan benchmark.

Untuk menjalankan biasanya semua parameter dilewatkan yang akan lolos ke persiapan dan beberapa parameter tambahan yang kami tinjau sekarang, ini khusus untuk menjalankan benchmark yang sebenarnya. “WAKTU” parameter menentukan batas waktu untuk menjalankan benchmark, nol berarti waktu tidak terbatas, benchmark akan berjalan sampai kita menekan control+c. Beginilah cara kami menggunakan sysbench di lab dan ini adalah cara orang biasanya menggunakannya dalam pembelajaran dan bukan dalam penyiapan tolok ukur.

Kami hanya ingin melepaskan lalu lintas pada sesuatu yang akan kami periksa dan kami dapat menghentikannya dengan control+c setelah kami selesai dengan pemeriksaan.

“interval laporan” parameter menentukan seberapa sering sysbench dicetak statistik. Biasanya, ini diatur ke 1 seperti dalam contoh kita yang membuat sysbench mencetak baris untuk setiap detik. Bahkan dalam pengaturan benchmarking, parameter ini banyak digunakan karena bayangkan jika kita memiliki benchmark selama satu jam dan kita hanya memiliki statistik agregat di akhir, itu tidak memberi tahu apa pun tentang distribusi data seperti bagaimana kinerja di server dari waktu ke waktu. . “utas” opsi menentukan jumlah utas klien atau koneksi MySQL untuk digunakan di sysbench. Jumlah utas klien juga akan berpengaruh pada jumlah utas server yang dapat digunakan. “tarif” parameter menentukan tingkat kedatangan transaksi sysbench sebagai cara untuk benar-benar memenuhi beban yang disebabkan oleh benchmark. Jika transaksi dapat dilanjutkan, mereka akan diantrekan, ini lagi-lagi sesuatu yang biasanya digunakan dalam jenis penyiapan ini yang akan kita gunakan sekarang dalam jenis penyiapan pembelajaran.

Dari host sysbench:

Siapkan kumpulan data:

Pada mesin virtual benchmarking, kita akan menjalankan perintah sysbench prepare untuk membuat database untuk benchmark kita.

Di sini kita dapat melihat bahwa kita menggunakan sbtest_user sebagai username, password adalah password dan kita terhubung ke 192.168.66.5 DB sebagai database server.

sysbench \--db-driver=mysql \--mysql-user=sbtest_user \--mysql_password=password \--mysql-db=sbtest \--mysql-host=192.168.66.5 \--mysql-port =3306 \--tables=16 \--table-size=10000 \/usr/share/sysbench/oltp_read_write.lua preparesysbench 1.0.20 (menggunakan paket LuaJIT 2.1.0-beta2)Membuat tabel 'sbtest1'...Memasukkan 10.000 record ke 'sbtest1'Membuat indeks sekunder pada 'sbtest1'......Membuat tabel 'sbtest16'...Memasukkan 10.000 record ke 'sbtest16'Membuat indeks sekunder di 'sbtest16'..

Anda memiliki database sbtest di sini, mari kita ubah skema default ke database sbtest, periksa tabel apa yang kita miliki.

Kami menetapkan bahwa benchmark harus membuat enam belas tabel dan itu membuat 16 tabel, kita bisa melihatnya di sini

mysql> tampilkan tabel;+------------------+| Tables_in_sbtest +------------------+| sbtest1          || sbtest2         |...| sbtest16         |+------------------+16 baris dalam kumpulan (0,01 detik)

Mari kita periksa beberapa record dari sebuah tabel.

mysql> pilih * dari sbtest1 limit 6;

kita akan menjalankan benchmark. Tolok ukur ini akan memiliki satu baris output untuk setiap detik karena kami menetapkan hubungan, intervalnya sama dengan satu dan memiliki empat utas klien karena kami menetapkan utas sama dengan empat.

--events=N                    batas jumlah acara [0]--time=N                     batas total waktu eksekusi dalam detik [10]

Dua pengaturan di atas (acara dan waktu) mengatur berapa lama SysBench harus terus berjalan. Itu dapat menjalankan sejumlah kueri atau dapat terus berjalan selama waktu yang telah ditentukan.

Pada host sysbench:

sysbench \--db-driver=mysql \--mysql-user=sbtest_user \--mysql_password=password \--mysql-db=sbtest \--mysql-host=192.168.66.5 \--mysql-port =3306 \--tables=16 \--table-size=10000 \--threads=4 \--time=0 \--events=0 \--report-interval=1 \ /usr/share/sysbench/ oltp_read_write.lua runPERINGATAN:Baik batas waktu maupun acara dinonaktifkan, menjalankan testysbench 1.0.20 tanpa akhir (menggunakan paket LuaJIT 2.1.0-beta2)Menjalankan pengujian dengan opsi berikut:Jumlah utas:4Laporkan hasil antara setiap 1 detik )Menginisialisasi generator nomor acak dari waktu saat iniMenginisialisasi utas pekerja...Utas dimulai![ 1s ] thds:4 tps:62,79 qps:1320.63 (r/w/o:933.91/257.15/129.57) lat (ms,95%):80.03 err/dtk:0,00 pengintaian/dtk:0,00[ 2dtk] thds:4 tps:77,01 qps:1530,26 (r/w/o:1065,18/312,05/153,03) lat (md,95%):61,08 err/dtk:0,00 pengintaian /s:0,00[ 3s ] thds:4 tps:74,03 qps:1463,67 (r/w/o:1025,47/289,13/149,07) lat (ms,95%):70,55 err/s:0,00 pengintaian/dtk:0,00[ 4s ] thds:4 tps:69,99 qps:1414. 84 (r/w/o:991,89/282,97/139,98) lat (md,95%):65,65 err/d:0,00 pengintaian/d:0,00[ 5d ] thds:4 tps:74,02 qps:1488,34 (r/w/ o:1048.24/292.07/148.03 lat (md,95%):74.46 err/s:0.00 reconn/s:0.00[ 6s ] thds:4 tps:72.99 qps:1444.89 (r/w/o:1003.92/294.98/ 145,99) lat (md,95%):70,55 err/s:0,00 pengintaian/dtk:0,00[ 7s ] thds:4 tps:63,00 qps:1271,04 (r/w/o:890.03/255.01/126.00) lat (md, 95%):87.56 err/s:0.00 reconn/s:0.00[ 8s ] thds:4 tps:72.99 qps:1439.82 (r/w/o:1008.87/284.96/145.98) lat (ms,95%):73.13 err /dtk:0,00 pengintaian/dtk:0,00[ 9dtk] thds:4 tps:74.00 qps:1488,01 (r/w/o:1038.01/302.00/148.00) lat (ms,95%):73.13 err/s:0.00 pengintaian/ s:0,00

jadi kita dapat melihat bahwa itu melakukan sekitar 70 80 transaksi per detik di mesin saya yang diterjemahkan menjadi kira-kira lebih dari seribu kueri per detik. Ini berjalan di VirtualBox di laptop.

Dari query tersebut kita dapat melihat berapa banyak yang dibaca, berapa yang ditulis, berapa banyak yang lainnya berapa persentil ke-95 untuk transaksi (r/w/o:1038.01/302.00/148,00), bagaimana banyak kesalahan per detik (err/s:0.00 ) yang kami miliki dan berapa banyak koneksi per detik (reconn/s:0.00) yang kami miliki. Karena kita tentukan waktu sama dengan nol ini akan berjalan sampai kita menekan ctrl+c.

Mari kita periksa daftar proses pertunjukan di host database.

mysql> tampilkan daftar proses;+----+-----------------+------------------ --+--------+-----+-------+-------------------- --------+--------------------------------------+| ID | Pengguna            | Tuan Rumah              | db     | Perintah | Waktu  | Nyatakan                    | Info                             |+----+-----------------+--------------------+--- -----+---------+-------+-------------------------- --+---------------------------------------+| 5 | event_scheduler | localhost          | NULL   | Daemon  | 23200 | Menunggu antrian kosong     | NULL                              || 11 | root            | localhost          | NULL   | Tidur   | 18438 | | NULL                                         || 19 | root            | localhost          | sbtest | Kueri   | 0 | mulai                  | tampilkan daftar proses                   || 23 | root            | localhost          | NULL   | Tidur   | 4098 | | NULL                                         || 30 | sbtest_user     | 192.168.66.6:37298 | sbtest | Tidur   | 0 | | NULL                                         || 31 | sbtest_user     | 192.168.66.6:37300 | sbtest | Jalankan | 0 | menunggu komit pawang | BERKOMITMEN                           || 32 | sbtest_user     | 192.168.66.6:37302 | sbtest | Tidur   | 0 | | NULL                                         || 33 | sbtest_user     | 192.168.66.6:37304 | sbtest | Jalankan | 0 | Membuka tabel             | PILIH c FROM sbtest13 WHERE id=4978 |+----+-----------------+----------------- ---+--------+--------+-------+------------------- ---------+---------------------------------------+ 

8 baris dalam set (0,00 detik)

Server database praktis selalu sibuk. Saya melihat bahwa waktu yang dieksekusi tidak pernah berubah dari nol secara praktis, dan sangat mudah untuk menangkap server database beraksi seperti saat menjalankan "SELECT c FROM sbtest13 WHERE id=4978". Dan pastinya, kami memiliki empat koneksi dari mesin benchmark

Secara default, SysBench akan mencoba mengeksekusi kueri secepat mungkin. Untuk mensimulasikan lalu lintas yang lebih lambat, opsi ini dapat digunakan. Anda dapat menentukan di sini berapa banyak transaksi yang harus dilakukan per detik.

--rate=N                      tarif transaksi rata-rata. 0 untuk tarif tak terbatas [0]

Pada host sysbench

[[email protected] ~]# sysbench \--db-driver=mysql \--mysql-user=sbtest_user \--mysql_password=password \--mysql-db=sbtest \--mysql-host=192.168.66.5 \--mysql-port=3306 \--tables=16 \--table-size=10000 \--threads=4 \--time=0 \--events=0 \--report-interval=1 \--rate=40 \/usr/share/sysbench/oltp_read_write.lua runWARNING:Kedua event dan batas waktu dinonaktifkan, menjalankan testysbench 1.0.20 tanpa akhir (menggunakan paket LuaJIT 2.1.0-beta2)Menjalankan pengujian dengan mengikuti options:Jumlah utas:4Target tingkat transaksi:40/dtkLaporkan hasil antara setiap 1 detikMenginisialisasi pembuat nomor acak dari waktu saat iniMenginisialisasi utas pekerja...Utas dimulai![ 1s ] thds:4 tps:42,87 qps:858,43 (r /w/o:600.20/171.49/86.74 lat (ms,95%):73.13 err/s:0.00 reconn/s:0.00[ 1s ] panjang antrian:0, concurrency:1[ 2s ] thds:4 tps:41.01 qps:857.25 (r/w/o:609.17/164.05/84.02) lat (ms,95%):101.13 err/s:0.00 reconn/s:0.00[ 2s ] panjang antrian:0, konkurensi:3[ 3s ] thds :4 tp:57,01 qps:1119,29 (r/w/o:778.20/228.06/113.03) lat (ms,95%):73.13 err/s:0,00 pengintaian/dtk:0,00[ 3d ] panjang antrian:0, konkurensi:2... [ 15s ] thds:4 tps:0,00 qps:0,00 (r/w/o:0,00/0,00/0,00) lat (ms,95%):0,00 err/s:0,00 pengintaian:0,00[ 15s ] panjang antrian:145, konkurensi:4[ 16s ] thds:4 tps:0,00 qps:0,00 (r/w/o:0,00/0,00/0,00) lat (ms,95%):0,00 err/s:0,00 pengintaian:0,00[ 16s ] panjang antrian:179, konkurensi:4

Jadi parameter baru di sini adalah –rate sama dengan 40 yang berarti bahwa kita akan memiliki dua baris per detik dua baris output dan bukan satu. Karena kami menyetel tingkat kedatangan peristiwa pembandingan menjadi 40 per detik, kami akan melihat TPS saat ini.

Ini tidak dijamin menjadi 40/detik tetapi kedatangan menjamin bahwa rata-rata kami melakukan sekitar 40 transaksi per detik dan kami dapat memantau panjang antrian dan konkurensi pada baris kedua. Jika kita melakukan daftar proses singkat, akan lebih mudah untuk menangkap database dalam keadaan di mana beberapa koneksi hanya menunggu di sini.

Saat sesi sibuk, Anda dapat melihat bahwa transaksi per detik adalah nol (tps:0.00 ).

mysql> tampilkan daftar proses;+----+-----------------+------------------ --+--------+-----+-------+-------------------- ----+-------------------------------------------- -------------------------------------------------- -------+| ID | Pengguna            | Tuan Rumah              | db     | Perintah | Waktu  | Nyatakan                | Info                                                                                                      ------+--------------------- -----+---------+-------+------------------------+- -------------------------------------------------- -------------------------------------------------- -+| 5 | event_scheduler | localhost          | NULL   | Daemon  | 19162 | Menunggu antrian kosong | NULL                                                                                          | 8 | root            | localhost          | NULL   | Kueri   | 0 | mulai              | tampilkan daftar proses                                                                       | || 21 | sbtest_user     | 192.168.66.6:49060 | sbtest | Jalankan | 33 | memperbarui              | PERBARUI sbtest8 SET k=k+1 WHERE id=5005                                                    || 22 | sbtest_user     | 192.168.66.6:49062 | sbtest | Jalankan | 22 | memperbarui              | PERBARUI sbtest14 SET c='54592761471-89397085016-24424731626-29460127219-18466786462-73074657089-48925 | 23 | sbtest_user     | 192.168.66.6:49064 | sbtest | Jalankan | 21 | memperbarui              | PERBARUI sbtest10 SET c='68520795048-46094139936-88850487689-12482054639-29231339380-71050139550-93403 || 24 | sbtest_user     | 192.168.66.6:49066 | sbtest | Jalankan | 31 | memperbarui              | DELETE FROM sbtest14 WHERE id=4994                                                      |+----+-----------------+------------------ --+--------+-----+-------+-------------------- ----+-------------------------------------------- -------------------------------------------------- -------+10 baris dalam set (0,00 detik)

Kita dapat melihat bahwa ini tertidur selama beberapa detik, ini hampir tidak mungkin dalam skenario sebelumnya untuk mendapatkan sesuatu seperti ini.

Lalu lintas tulis yang padat dengan Laporan akhir:

Mari kita jalankan beban kerja tulis-berat (tetapi tidak hanya tulis) dan, misalnya, kinerja subsistem I/O pengujian, seperti yang saya sebutkan time=300 kemudian benchmark akan berjalan selama 300 detik dan akan memberikan kita laporan akhir untuk menganalisanya.

[[email protected] ~]#   sysbench \--db-driver=mysql \--mysql-user=sbtest_user \--mysql_password=password \--mysql-db=sbtest \--mysql-host=192.168.66.5 \--mysql-port=3306 \--tables=16 \--table-size=10000 \--threads=8 \--time=300 \--events=0 \--report-interval=1 \--rate=40 \/usr/share/sysbench/oltp_read_write.lua runsysbench 1.0.20 (menggunakan paket LuaJIT 2.1.0-beta2) Menjalankan pengujian dengan opsi berikut:Jumlah thread:8Target transaksi rate:40/secReport hasil antara setiap 1 detik Menginisialisasi generator nomor acak dari waktu saat iniMenginisialisasi utas pekerja...Utas dimulai![ 1s ] thds:8 tps:39.87 qps:810.27 (r/w/o:570.08/159.46/80.73) lat ( ms,95%):82,96 err/s:0,00 pengintaian/dtk:0,00[ 1s ] panjang antrian:0, konkurensi:1[ 2s ] thds:8 tps:43,02 qps:847,39 (r/w/o:590.27/172.08 /85.04) lat (md,95%):125,52 err/s:0,00 pengintaian/dtk:0,00[ 2s ] panjang antrian:0, konkurensi:0...[ 350s ] thds:8 tps:0,00 qps:0,00 (r /w/o:0,00/0,00/0,00) lat (md,95%):0,00 err/dt :0,00 Reconn/S:0,00 [350 -an] Panjang antrian:6545, Concurrency:1SQL Statistik:Pertanyaan dilakukan:Baca:78624 Tulis:22385 Lainnya:11205 Total:112214 Transaksi:5589 (15,94 per detik. Sec.) Kesalahan yang diabaikan:27 (0,08 per detik.) Menghubungkan kembali:0 (0,00 per detik) Statistik Umum:Total Waktu:350.6412S Total Jumlah Acara:5589Latency (MS):Min:12.45 AVG:74639.59 MAX:213244.02 95th persentil:                 100000.00         jumlah:                       417160677.24Kewajaran utas:   kejadian (rata-rata/stddev):          698.6    waktu eksekusi (rata-rata/stddev):   52145.0847/15557.93

ANALISIS LAPORAN:

Ini cukup berguna untuk memeriksa laporan akhir yang hanya akan memberi Anda rata-rata. Hasil antara akan memungkinkan untuk melacak kinerja setiap detik. Laporan akhir mungkin terlihat seperti di atas, Anda akan menemukan di sini informasi tentang kueri yang dieksekusi, transaksi yang dieksekusi, berapa banyak kesalahan yang terjadi, koneksi yang hilang terjadi, berapa throughput dan total waktu yang telah berlalu. Anda juga dapat memeriksa metrik latensi dan distribusi kueri di seluruh rangkaian pesan.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara membagi string nama di mysql?

  2. PEMBARUAN MySQL:5 Tip Teratas untuk Pengembang T-SQL

  3. Cara INSERT Jika Baris Tidak Ada (UPSERT) di MySQL

  4. Cara Menghitung Selisih Antara Dua Tanggal di MySQL

  5. LINQ to Entities tidak mengenali metode 'System.String ToString()' metode, dan metode ini tidak dapat diterjemahkan ke dalam ekspresi toko