第23回「mysqlslapを使って負荷テストをしてみよう」 では、MySQLにバンドルされているmysqlslapを使って負荷テストを行いました。今回はSysBenchというベンチマークソフトを利用して、負荷テストを行う方法を紹介していきます。
検証環境
今回は第23回「mysqlslapを使って負荷テストをしてみよう」 で使用したCentOS7に、SysBenchをインストールして実行しています。MySQLのバージョンは5.7.13を使用しています。
SysBenchとは?
SysBenchは、PCやサーバのベンチマークを取るために使われるオープンソースのソフトウェアです。ライセンスにはGPLv2が採用されています。SysBenchのソースコード はGitHub上で公開されています。
SysBenchはCPUやメモリ、ファイルI/Oなどの基本的な性能を測るベンチマークだけではなく、データベースソフト向けのトランザクション性能を確認するためのOLTPというベンチマークも用意されていて、簡単に実行することができます。また、ベンチマークを実行できるDBはMySQLだけではなく、PostgreSQLやOracle Database等のデータベースでも起動用のDriverが用意されており、ベンチマークが実行できます。
ただし、今回説明に用いたyumレポジトリに用意されているものでは、PostgreSQLとMySQL用のドライバしか入っていないため、それ以外のデータベースへの実行はできません。Oracleやその他のDriverが用意されているデータベースでも実行したい場合は、ソースコードからコンパイルすることで実行できますが、今回はソースコードからインストールする方法に関しては説明を行いません。
インストール方法
CentOSを利用している場合はEPELでrpmが用意されているため、EPELを有効にすると、以下のコマンドでインストールが行えます。
$ sudo yum install sysbench -y
読み込んだプラグイン:fastestmirror
…中略…
完了しました!
以下のコマンドを入力した際にバージョン情報が表示されれば問題なくインストールが完了しています。
$ sysbench --version
sysbench 0.4.12
SysBenchの使い方
SysBenchはMySQL専用のベンチマークではなく、一般的なベンチマークソフトとして利用できます。SysBenchには以下のような種類のベンチマークが用意されていて、それぞれベンチマークを実行することができます。
種類 説明
fileio File I/Oのテスト
cpu CPU のベンチマーク
memory メモリ機能のベンチマーク
threads スレッドのベンチマーク
mutex スレッドのMutexのベンチマーク
oltp OLTP(オンライントランザクション処理)に関するテストベンチマーク
これらは以下のように、コマンドを実行する際に--test=
optionとして渡すことで指定することができます。たとえば、CPUのベンチマークを行いたい場合は以下のようなコマンドを実行します。
$ sysbench --test=cpu run
実行を行うと、どのような条件でベンチマークが行われているかの表示が行われます。今回は特に指定を行わなかったので、1スレッドでCPUのパフォーマンスベンチマークが開始されたという情報が表示されています。
sysbench 0.4.12: multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 1
Doing CPU performance benchmark
Threads started!
続けてテストが終了すると、実行結果が表示されます。
Done.
Maximum prime number checked in CPU test: 10000
Test execution summary:
total time: 11.6803s
total number of events: 10000
total time taken by event execution: 11.6772
per-request statistics:
min: 1.08ms
avg: 1.17ms
max: 1.42ms
approx. 95 percentile: 1.21ms
Threads fairness:
events (avg/stddev): 10000.0000/0.00
execution time (avg/stddev): 11.6772/0.00
このテストでは10000個以下の素数を数えるテストが実行されました。10000個と言うのはデフォルトの設定で--cpu-max-prime
オプションで変更可能です。Test execution summary
では実行時間が表示されていて、total time
から実行が終了するまでに約11秒かかっていることがわかります。今回は1スレッドで実行しているので、CPUの1スレッドでの実行時間がこの値となります。
スレッド数を増やしたい場合は--num-threads=
オプションの値を変更することで、指定したスレッド数実行されます。今回より早く終わるか遅くなるかでCPUの性能を簡単に比較することができます。同様に他のテストでも各種の性能を比較することができますが、ここでは説明を行いません。またテストごとのオプションを確認したい場合はsysbench --test=option help
とコマンドを入力すると、optionに指定したテストの種類に関するオプションを確認することができます。
たとえば次のようにoltpを入れてhelpを実行すると、以下のように各種オプションと指定できる値が書かれたヘルプが表示されます。説明文の最後に書かれている[]で囲まれた部分がdefault値です。
$ sysbench --test=oltp help
sysbench 0.4.12: multi-threaded system evaluation benchmark
oltp options:
--oltp-test-mode=STRING test type to use {simple,complex,nontrx,sp} [complex]
--oltp-reconnect-mode=STRING reconnect mode {session,transaction,query,random} [session]
--oltp-sp-name=STRING name of store procedure to call in SP test mode []
--oltp-read-only=[on|off] generate only 'read' queries (do not modify database) [off]
…省略…
SysBenchを実行する前の準備
SysBenchを実行する前に、SysBench用のデータベースとユーザを作成します。
mysqlコマンドラインクライアントでログインして、以下のCREATE文を実行してデータベースを作成します。
mysql> CREATE DATABASE sbtest;
Query OK, 1 row affected (0.00 sec)
続けて、ユーザの作成です。sbtestデータベースだけに権限を与えるようにすれば良いので以下のようなコマンドになります。
mysql> CREATE USER sbtest@localhost;
mysql> GRANT ALL PRIVILEGES ON sbtest.* TO sbtest@localhost IDENTIFIED BY 'Password1!';
Query OK, 0 rows affected, 1 warning (0.00 sec)
Password1!
の部分はデータベースのポリシーに合わせて適切な値に変更して実行してください。またSysBenchに必要なデータベースはsbtestだけなので必要な権限だけを与えましょう。
続けてSysBenchを実行する前にテーブルを作成します。といってもSysBenchで必要なテーブルやレコードに関しては自動で作成してくれるので、コマンドを利用して作成をします。以下のコマンドを入力します。passwordは先ほどユーザを作成する際に指定したものを入力します。
$ sysbench --test=oltp --mysql-password=Password1! --db-driver=mysql prepare
sysbench 0.4.12: multi-threaded system evaluation benchmark
Creating table 'sbtest'...
Creating 10000 records in table 'sbtest'...
sbtestテーブルが作成されテスト用の10000レコードが作成されました。このコマンドで用意されたテーブルとデータを確認してみましょう。作成されたテーブルは以下のようになってます。
$ mysql -uroot -p sbtest
mysql> SHOW CREATE TABLE sbtest;
+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| sbtest | CREATE TABLE `sbtest` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`k` int(10) unsigned NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `k` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=latin1 |
+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
sbtestというテーブルが作成されていることが確認できました。続いて、中に入っているデータを確認してみます。
mysql> SELECT * FROM sbtest;
+-------+---+---+----------------------------------------------------+
| id | k | c | pad |
+-------+---+---+----------------------------------------------------+
| 1 | 0 | | qqqqqqqqqqwwwwwwwwwweeeeeeeeeerrrrrrrrrrtttttttttt |
| 2 | 0 | | qqqqqqqqqqwwwwwwwwwweeeeeeeeeerrrrrrrrrrtttttttttt |
| 3 | 0 | | qqqqqqqqqqwwwwwwwwwweeeeeeeeeerrrrrrrrrrtttttttttt |
…中略…
| 9998 | 0 | | qqqqqqqqqqwwwwwwwwwweeeeeeeeeerrrrrrrrrrtttttttttt |
| 9999 | 0 | | qqqqqqqqqqwwwwwwwwwweeeeeeeeeerrrrrrrrrrtttttttttt |
| 10000 | 0 | | qqqqqqqqqqwwwwwwwwwweeeeeeeeeerrrrrrrrrrtttttttttt |
+-------+---+---+----------------------------------------------------+
10000 rows in set (0.01 sec)
以上のように10000件のダミーデータが用意されていることがわかりました。これらを利用してベンチマークを行っていきます。
また今回はMySQLにデータベースやユーザを追加しましたが、--mysql-user=
オプションで別のユーザを、--mysql-db=
オプションで別のデータベースを指定して既存のユーザで実行することもできます。
SysBenchを実行する
それではSysBenchをMySQLに向けて実行をしてみましょう。以下のコマンドを実行します。
$ sysbench --num-threads=4 --test=oltp --mysql-password=Password1! --db-driver=mysql run
sysbench 0.4.12: multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 4
Doing OLTP test.
Running mixed OLTP test
Using Special distribution (12 iterations, 1 pct of values are returned in 75 pct cases)
Using "BEGIN" for starting transactions
Using auto_inc on the id column
Maximum number of requests for OLTP test is limited to 10000
Threads started!
--test=cpu
で実行した時と同様に、最初に設定情報が出力されます。今回は4スレッドにして実行してみました。
OLTPのテストのデフォルトではトランザクションを使うように設定されていて、SELECT、UPDATE、DELETE、INSERTの実行が行われます。トランザクションを使わないように設定したい場合は--oltp-test-mode=
をnontrx
に変更します。デフォルト値はcomplex
になっています。UPDATEやINSERT、DELETEといった更新系の処理が必要ない場合は、--oltp-read-only=
をon
に変更するとSELECT文だけ実行されるようになります。
Done.
OLTP test statistics:
queries performed:
read: 141456
write: 50278
other: 20104
total: 211838
transactions: 10000 (414.12 per sec.)
deadlocks: 104 (4.31 per sec.)
read/write requests: 191734 (7940.08 per sec.)
other operations: 20104 (832.55 per sec.)
Test execution summary:
…省略…
データベースの性能を測るときには、TPS(Transaction per second)という、1秒間にトランザクション処理を何回行えたかという指標を参考にすることが多いです。今回のOLTPベンチマークではtransactionsのところに書かれている(414.12 per sec.)というベンチマーク結果になったことがわかります。これらの数値は、チューニングを行った際に効果があったか無かったのか確認するための指標に利用します。
まとめ
今回はベンチマークによく使われるSysBenchというソフトウェアを紹介しました。このソフトウェアはmysqlslapとは違い、別途インストールする必要があるものの、MySQLに限らずその他のデータベースサーバでも同様のテストを実行できるので、一度使い方を覚えるとさまざまなデータベースサーバのベンチマークが取れるようになるので便利です。サーバのパラメータや、サーバ自体を入れ替えた場合などに、性能を比較検討する際の手助けと思います。みなさまもぜひ一度実行してみてはいかがでしょうか。