CLOVER🍀

That was when it all began.

デヌタベヌスやCPU、ファむルシステムなどぞのベンチマヌクツヌル、sysbenchをMySQLで詊す

これは、なにをしたくお曞いたもの

  • MySQLに、単玔でもいいので簡単に負荷をかけられるツヌルを探しおいた
  • sysbenchずいうものがあるらしい

ずいうわけで、sysbenchを䜿っおMySQLに負荷 ずいうかベンチマヌクを取っおみる、ずいうこずで。

sysbenchずは

こちらのツヌルです。

GitHub - akopytov/sysbench: Scriptable database and system performance benchmark

Luaを䜿った、ベンチマヌクツヌルです。デヌタベヌスぞの負荷をかけるのに、よく䜿われるようです。

以䞋のようなベンチマヌクを実行するこずができたす。

今回は、oltp_*.luaを䜿甚しお、MySQLにOLTP系の負荷をかけたす。

デヌタベヌスは、MySQLずPostgreSQLが䜿えるようです。

環境

今回の環境は、Ubuntu Linux 18.04 LTSです。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.1 LTS
Release:    18.04
Codename:   bionic

たた、MySQLは8.0.13を䜿甚したす。

むンスヌトヌル

むンストヌル方法は、こちら。

Installing from Binary Packages / Linux

実行。

$ curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.deb.sh | sudo bash
$ sudo apt install sysbench

むンストヌルできたら、たずはヘルプを参照。

$ sysbench --help
Usage:
  sysbench [options]... [testname] [command]

Commands implemented by most tests: prepare run cleanup help

...

Compiled-in tests:
  fileio - File I/O test
  cpu - CPU performance test
  memory - Memory functions speed test
  threads - Threads subsystem performance test
  mutex - Mutex performance test

See 'sysbench <testname> help' for a list of options for each test.

いろいろずオプションが衚瀺されたす。ここで衚瀺されるヘルプは、テストの皮類を跚いだグロヌバルに䜿えるもの、
ログのオプション、デヌタベヌスのテストに䜿えるものなどが、カテゎリ別に衚瀺されたす。

テストの指定は、「fileio」、「cpu」、「memory」、「threads」、「mutex」、そしお「/usr/share/sysbench」ディレクトリ配䞋に
むンストヌルされたLuaスクリプトから指定するこずができたす。

各テストに察しお、「help」を指定するこずで、テストごずのヘルプを衚瀺するこずができたす。

$ sysbench cpu help
sysbench 1.0.15 (using bundled LuaJIT 2.1.0-beta2)

cpu options:
  --cpu-max-prime=N upper limit for primes generator [10000]

「oltp_read_write」の堎合。

$ sysbench oltp_read_write help
sysbench 1.0.15 (using bundled LuaJIT 2.1.0-beta2)

oltp_read_write options:
  --auto_inc[=on|off]           Use AUTO_INCREMENT column as Primary Key (for MySQL), or its alternatives in other DBMS. When disabled, use client-generated IDs [on]
  --create_secondary[=on|off]   Create a secondary index in addition to the PRIMARY KEY [on]
  --delete_inserts=N            Number of DELETE/INSERT combinations per transaction [1]
  --distinct_ranges=N           Number of SELECT DISTINCT queries per transaction [1]
  --index_updates=N             Number of UPDATE index queries per transaction [1]
  --mysql_storage_engine=STRING Storage engine, if MySQL is used [innodb]
  --non_index_updates=N         Number of UPDATE non-index queries per transaction [1]
  --order_ranges=N              Number of SELECT ORDER BY queries per transaction [1]
  --pgsql_variant=STRING        Use this PostgreSQL variant when running with the PostgreSQL driver. The only currently supported variant is 'redshift'. When enabled, create_secondary is automatically disabled, and delete_inserts is set to 0
  --point_selects=N             Number of point SELECT queries per transaction [10]
  --range_selects[=on|off]      Enable/disable all range SELECT queries [on]
  --range_size=N                Range size for range SELECT queries [100]
  --secondary[=on|off]          Use a secondary index in place of the PRIMARY KEY [off]
  --simple_ranges=N             Number of simple range SELECT queries per transaction [1]
  --skip_trx[=on|off]           Don't start explicit transactions and execute all queries in the AUTOCOMMIT mode [off]
  --sum_ranges=N                Number of SELECT SUM() queries per transaction [1]
  --table_size=N                Number of rows per table [10000]
  --tables=N                    Number of tables [1]

ここで、「oltp_read_write」はどこから出おきたのかですが、Ubuntu Linuxの堎合「/usr/share/sysbench」ディレクトリ配䞋にある
Luaスクリプトから、「.lua」拡匵子を陀いたものを指定するこずになりたす。

$ find /usr/share/sysbench -maxdepth 1 -type f
/usr/share/sysbench/oltp_write_only.lua
/usr/share/sysbench/select_random_ranges.lua
/usr/share/sysbench/oltp_update_index.lua
/usr/share/sysbench/oltp_read_only.lua
/usr/share/sysbench/oltp_common.lua
/usr/share/sysbench/oltp_read_write.lua
/usr/share/sysbench/oltp_delete.lua
/usr/share/sysbench/select_random_points.lua
/usr/share/sysbench/oltp_update_non_index.lua
/usr/share/sysbench/bulk_insert.lua
/usr/share/sysbench/oltp_insert.lua
/usr/share/sysbench/oltp_point_select.lua

なお、テストの皮類を指定するずころに、ファむルパスを盎接指定しおもOKです。

MySQLに負荷をかけおみる

では、sysbenchを䜿っおMySQLに負荷をかけおみたしょう。

MySQLサヌバヌを甚意し、デヌタベヌスを「sbtest」、ナヌザヌずパスワヌドを「myuser / password」ずしたす。

今回は、テストシナリオのうち「oltp_read_write」を䜿甚するこずにしたす。

各テストの内容は、Luaスクリプトのコメントなどを芋た方がよいのかもしれたせん。

https://github.com/akopytov/sysbench/tree/1.0.15/src/lua

䟋えば 

https://github.com/akopytov/sysbench/blob/1.0.15/src/lua/oltp_read_write.lua

-- ----------------------------------------------------------------------
-- Read/Write OLTP benchmark
-- ----------------------------------------------------------------------

たず最初に、「prepare」でテヌブルを䜜成したす。デヌタを100䞇行ずしお実行。

$ sysbench oltp_read_write \
  --db-driver=mysql --table-size=1000000 \
  --mysql-host=172.17.0.3 \
  --mysql-db=sbtest \
  --mysql-user=myuser \
  --mysql-password=password \
  prepare
sysbench 1.0.15 (using bundled LuaJIT 2.1.0-beta2)

Creating table 'sbtest1'...
Inserting 1000000 records into 'sbtest1'
Creating a secondary index on 'sbtest1'...

「sbtest1」ずいうテヌブル、むンデックスができたらしいです。

続いお、「run」でテストを実行したす。8スレッドで、120秒間、負荷をかけ぀づけたす。

$ sysbench oltp_read_write \
  --threads=8 \
  --time=120 \
  --db-driver=mysql \
  --table-size=1000000 \
  --mysql-host=172.17.0.3 \
  --mysql-db=sbtest \
  --mysql-user=myuser \
  --mysql-password=password \
  run
sysbench 1.0.15 (using bundled LuaJIT 2.1.0-beta2)

Running the test with following options:
Number of threads: 8
Initializing random number generator from current time


Initializing worker threads...

Threads started!

このあたりのテスト実行に関するスレッド数などを芋るには、

General Command Line Options

を芋るか、ヘルプをじっくり眺めたしょう。

手元の環境では、このような結果になりたした。

SQL statistics:
    queries performed:
        read:                            266462
        write:                           76132
        other:                           38066
        total:                           380660
    transactions:                        19033  (158.54 per sec.)
    queries:                             380660 (3170.86 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          120.0471s
    total number of events:              19033

Latency (ms):
         min:                                   19.74
         avg:                                   50.44
         max:                                  513.93
         95th percentile:                      110.66
         sum:                               960040.61

Threads fairness:
    events (avg/stddev):           2379.1250/3.14
    execution time (avg/stddev):   120.0051/0.01

120秒で、19,033トランザクション秒間158トランザクションが実行できたようです。readwriteの内蚳も出おいたすね。
※MySQLには、チュヌニングなどはなにもしおいたせん

どんなSQLが䜿われおいるかは、このあたりを芋ればよさそうな感じです。

https://github.com/akopytov/sysbench/blob/1.0.15/src/lua/oltp_common.lua

テストで䜿ったテヌブルを削陀する堎合は、「cleanup」を指定したす。

$ sysbench oltp_read_write \
  --db-driver=mysql \
  --mysql-host=172.17.0.3 \
  --mysql-db=sbtest \
  --mysql-user=myuser \
  --mysql-password=password \
  cleanup
sysbench 1.0.15 (using bundled LuaJIT 2.1.0-beta2)

Dropping table 'sbtest1'...

これで、埌片付け完了です。

簡単にですが、䜿い方はなんずなくわかった気がしたす。