MySQL道普請便り

第26回SysBenchを使ってMySQLの負荷テストをする

第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には以下のような種類のベンチマークが用意されていて、それぞれベンチマークを実行することができます。

種類説明
fileioFile I/Oのテスト
cpuCPU のベンチマーク
memoryメモリ機能のベンチマーク
threadsスレッドのベンチマーク
mutexスレッドのMutexのベンチマーク
oltpOLTP(オンライントランザクション処理)に関するテストベンチマーク

これらは以下のように、コマンドを実行する際に--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に限らずその他のデータベースサーバでも同様のテストを実行できるので、一度使い方を覚えるとさまざまなデータベースサーバのベンチマークが取れるようになるので便利です。サーバのパラメータや、サーバ自体を入れ替えた場合などに、性能を比較検討する際の手助けと思います。みなさまもぜひ一度実行してみてはいかがでしょうか。

おすすめ記事

記事・ニュース一覧