CUBE SUGAR CONTAINER

技術系のこと書きます。

sysbench を使って MySQL をベンチマークする

MySQL の設定や構成またはバージョンの違いによるパフォーマンスの変化を調べるにはベンチマークツールが必要になる。 今回は sysbench というツールを使って MySQL のパフォーマンスを測ってみよう。

検証環境には CentOS7 を使った。

$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
$ uname -r
3.10.0-229.11.1.el7.x86_64

MySQL (MariaDB) のインストール

まずは測定対象となる MySQL をインストールする。 CentOS7 では MySQL の代わりに MySQL フォークの MariaDB を使用することになる。

$ sudo yum -y install mariadb-server

インストールできたら MariaDB のサービスを開始する

$ sudo systemctl start mariadb
$ sudo systemctl enable mariadb
ln -s '/usr/lib/systemd/system/mariadb.service' '/etc/systemd/system/multi-user.target.wants/mariadb.service'

sysbench をインストールする

続いて今回の主役となる sysbench をインストールする。 sysbench は EPEL のリポジトリにあるので先にインストールする必要がある。

$ sudo yum -y install epel-release
$ sudo yum -y install sysbench

sysbench を使ってパフォーマンスを測る

まずは測定に使うデータベースを作っておく。 sysbench が使用するデータベースのデフォルト名は sbtest なので、これに合わせておこう。

$ mysqladmin -u root create sbtest

次に、測定の下準備として sysbench prepare サブコマンドでレコードをあらかじめ登録しておく。

$ sysbench --test=oltp --mysql-user=root --db-driver=mysql prepare
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Creating table 'sbtest'...
Creating 10000 records in table 'sbtest'...

上記を実行すると、以下の様なテーブルが作られる。

$ mysql -u root -D sbtest -e "desc sbtest"
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| k     | int(10) unsigned | NO   | MUL | 0       |                |
| c     | char(120)        | NO   |     |         |                |
| pad   | char(60)         | NO   |     |         |                |
+-------+------------------+------+-----+---------+----------------+

いよいよ測定に入る。 sysbench run サブコマンドを実行しよう。 実行結果は大体見たとおりで、実行にかかった時間が短いほどパフォーマンスが高いと言える。

$ sysbench --test=oltp --mysql-user=root --db-driver=mysql run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

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!
Done.

OLTP test statistics:
    queries performed:
        read:                            140000
        write:                           50000
        other:                           20000
        total:                           210000
    transactions:                        10000  (431.45 per sec.)
    deadlocks:                           0      (0.00 per sec.)
    read/write requests:                 190000 (8197.56 per sec.)
    other operations:                    20000  (862.90 per sec.)

Test execution summary:
    total time:                          23.1776s
    total number of events:              10000
    total time taken by event execution: 23.1258
    per-request statistics:
         min:                                  1.87ms
         avg:                                  2.31ms
         max:                                 23.34ms
         approx.  95 percentile:               2.93ms

Threads fairness:
    events (avg/stddev):           10000.0000/0.00
    execution time (avg/stddev):   23.1258/0.00

パラメータをチューニングしてみる

試しに innodb_buffer_pool_size でも変更してみよう。 デフォルトの値は次の通り。 134217728 / 1024 / 1024 = 128 (MB)

$ mysql -u root -e "show variables like 'innodb_buffer_pool_size'"
    +-------------------------+-----------+
    | Variable_name           | Value     |
    +-------------------------+-----------+
    | innodb_buffer_pool_size | 134217728 |
    +-------------------------+-----------+

適当に 512MB にでもしてみよう。

$ sudo sed -i -e "/\[mariadb\]/a\innodb_buffer_pool_size=512M" /etc/my.cnf.d/server.cnf
$ tail -n 5 /etc/my.cnf.d/server.cnf
[mariadb]
innodb_buffer_pool_size=512M

[mariadb-5.5]
$ sudo systemctl restart mariadb

設定した値が反映されていることを確認する。

$ mysql -u root -e "show variables like 'innodb_buffer_pool_size'"
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 536870912 |
+-------------------------+-----------+

もう一度 sysbench を実行してみよう。

$ sysbench --test=oltp --mysql-user=root --db-driver=mysql run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

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!
Done.

OLTP test statistics:
    queries performed:
        read:                            140000
        write:                           50000
        other:                           20000
        total:                           210000
    transactions:                        10000  (442.47 per sec.)
    deadlocks:                           0      (0.00 per sec.)
    read/write requests:                 190000 (8406.91 per sec.)
    other operations:                    20000  (884.94 per sec.)

Test execution summary:
    total time:                          22.6005s
    total number of events:              10000
    total time taken by event execution: 22.5479
    per-request statistics:
         min:                                  1.87ms
         avg:                                  2.25ms
         max:                                 22.50ms
         approx.  95 percentile:               2.90ms

Threads fairness:
    events (avg/stddev):           10000.0000/0.00
    execution time (avg/stddev):   22.5479/0.00

パラメータを変更したことでベンチマークの実行時間が 0.5779 秒短縮された。 ほとんど誤差に近い気もするけど、ベンチマークの結果としてパフォーマンスが約 2.5% 向上したことが確認できた!

まとめ

パラメータのチューニングや構成毎のパフォーマンスを比較する際にはベンチマークが必須なので MySQL を使うときは sysbench をどんどん使っていきたい。