MySQLのインストールとベンチマーク(sysbench)
MySQL
MySQLも気がつけば5.6ですね。(私がバリバリ使っていた時は4.1とか5.0の時代でした...).
現在ダウロードできる5.6, 5.5, 5.1 を切り替えてインストールできる環境の構築とそれぞれでベンチマークを取ってみることにします。
MySQLのダウンロードは MySQL :: Download MySQL Community Server ここですが、色々種類があります。
RPM版とかもありますが、私が毎回使っているのは
です。RPMだと各種ファイルが散らばってしまってあんまり好きじゃないですので毎度 TAR Archive でインストールしています。3バージョン以下のようにダウンロードしました。(ファイル名の命名とかバラバラやな...)
$ ls -ltr 合計 608308 -rw-rw-r-- 1 keisyu keisyu 304788904 2月 13 01:45 2014 mysql-5.6.16-linux-glibc2.5-x86_64.tar.gz -rw-rw-r-- 1 keisyu keisyu 184478489 2月 13 01:47 2014 mysql-5.5.36-linux2.6-x86_64.tar.gz -rw-rw-r-- 1 keisyu keisyu 133630298 2月 13 01:48 2014 mysql-5.1.73-linux-x86_64-glibc23.tar.gz
install
mysqlユーザを追加します。
$ sudo groupadd mysql $ sudo useradd -r -g mysql mysql
tar.gzを /usr/local 以下に展開します
$ sudo tar -zxvf mysql-5.6.16-linux-glibc2.5-x86_64.tar.gz -C /usr/local/
3バージョンとも展開しました。アクティブにたいバージョンをmysqlにシンボリックリンクします。
$ cd /usr/local $ sudo ln -s mysql-5.6.16-linux-glibc2.5-x86_64 mysql $ ls -l ... lrwxrwxrwx 1 root root 34 2月 13 01:54 2014 mysql -> mysql-5.6.16-linux-glibc2.5-x86_64 drwxr-xr-x 13 root root 4096 11月 5 20:28 2013 mysql-5.1.73-linux-x86_64-glibc23 drwxr-xr-x 13 root root 4096 2月 13 01:52 2014 mysql-5.5.36-linux2.6-x86_64 drwxr-xr-x 13 root root 4096 2月 13 01:50 2014 mysql-5.6.16-linux-glibc2.5-x86_64
PATHに設定しときます (.zshrc とかにも書いとく)
$ export PATH=/usr/local/mysql/bin:$PATH
初期DBの作成をします
$ sudo ./scripts/mysql_install_db --user=mysql --datadir=/var/mysql/data56
たまにココで
Installing MySQL system tables..../bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
なんて怒られることありますが、その場合は libaio というライブラリをインストールしてください。
$ sudo yum install libaio
my.cnfと起動
my.cnf は書けば長くなることが多いですがひとまずは最低限の記述を定義しておき /etc/my.cnf に保存します
[mysqld] character-set-server=utf8 #5.1では default-character-set=utf8 socket=/tmp/mysql.sock
起動します.
$ sudo /usr/local/mysql/bin/mysqld_safe --user=mysql --datadir=/var/mysql/data56 &
停止は mysqladmin で行います
$ sudo /usr/local/mysql/bin/mysqladmin shutdown
起動は service に登録すると便利です。
$ sudo cp support-files/mysql.server /etc/init.d/mysql # ファイル内のdatadirの定義だけ追記しときます $ sudo /sbin/service mysql start $ sudo /sbin/service mysql stop さらに必要に応じて $ sudo chkconfig --add mysql $ sudo chkconfig mysql on
接続確認
# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.6.16 MySQL Community Server (GPL) Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show variables like 'version%'; +-------------------------+------------------------------+ | Variable_name | Value | +-------------------------+------------------------------+ | version | 5.6.16 | | version_comment | MySQL Community Server (GPL) | | version_compile_machine | x86_64 | | version_compile_os | linux-glibc2.5 | +-------------------------+------------------------------+ 4 rows in set (0.00 sec)
sysbench
sysbench ( System performance benchmark ) はベンチマークツールです。CPU,メモリ,I/Oのパフォマンスも計測できますがDataBaseのベンチマークも行うことができます。 インストールは epel のレポジトリにありますので yum でインストール可能です。
ベンチマークをする際には以下のようなパラメータを指定します。
- 検査テーブルのレコード数
- Readonlyのみ/ReadWrite
- 同時アクセス数(スレッド数)
- 計測時間
- MySQL接続情報
等を指定します。例えば100万行の検査テーブルに対して60秒間,4スレッドをReadのみのパフォーマンスを計測する場合は以下のコマンドでまず準備をします。
sysbench \ --test=oltp\ --oltp-read-only=on\ --db-driver=mysql\ --mysql-user=root\ --mysql-socket=/tmp/mysql.sock\ --oltp-table-size=1000000\ --num-threads=4\ --max-requests=0\ --max-time=60\ prepare
最後の prepare の部分を以下に変更します。
prepare | 初期化(検査前に1回だけ行う) |
run | 計測 |
cleanup | 後始末(最後に行う) |
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 Doing read-only 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 Threads started! Time limit exceeded, exiting... (last message repeated 3 times) Done. OLTP test statistics: queries performed: read: 260260 write: 0 other: 37180 total: 297440 transactions: 18590 (309.81 per sec.) deadlocks: 0 (0.00 per sec.) read/write requests: 260260 (4337.32 per sec.) other operations: 37180 (619.62 per sec.) Test execution summary: total time: 60.0048s total number of events: 18590 total time taken by event execution: 239.8965 per-request statistics: min: 1.62ms avg: 12.90ms max: 76.98ms approx. 95 percentile: 19.17ms Threads fairness: events (avg/stddev): 4647.5000/8.26 execution time (avg/stddev): 59.9741/0.00
という風な結果が60秒後に表示されます。 309 TPS(transactions/sec) って部分の指標を結果としてよく使うと思います。
ベンチマーク (のまね事)
5.6, 5.5, 5.1 のMySQLでそれぞれ計測してみます。以下の点などを考慮していないのでまったくもって計測のまね事だということにご注意ください。
- my.cnfの設定を全くしてなく全てデフォルト(Innodbのメモリ関連の値も全くチューニングなし)
- sysbenchを動かすサーバがMySQLの稼働しているサーバと同じ
- そもそもMacBookProのViertualBox上のCentOS
Threads=> | 1 | 4 | 8 | 16 |
---|---|---|---|---|
MySQL5.6 | 314 | 312 | 312 | 316 |
MySQL5.5 | 375 | 371 | 370 | 395 |
MySQL5.1 | 375 | 361 | 360 | 355 |
前述のとおりお遊びなのでこのデータを考察することの意味はありませんが
1スレッドですでにCPUがぶっ飛んでるからスレッド数を上げたところで意味なし... 5.5が一番TPS高いのはちょっと面白かった。
...
...
そうはいってもイマイチ面白みのなさすぎる結果だったのでVirtualBoxのCPU割り当てを8個にしてみた。
Threads=> | 1 | 4 | 8 | 16 |
---|---|---|---|---|
MySQL5.6+1CPU | 314 | 312 | 312 | 316 |
MySQL5.6+8CPU | 128 | 244 | 185 | 196 |
う~ん?