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 をどんどん使っていきたい。