MySQLのベンチマークとしてよく利用されるsysbenchのインストールと使い方について簡単にメモ。バージョンは0.5となります。
sysbench 0.5のダウンロード
(たぶん)sysbench 0.5はWebからダウンロード出来る場所がありません。ダウンロードはlaunchpadから行います。launchpadのアカウントの作成方法は割愛しますので予めアカウント作成しておいて下さい。
$ bzr branch lp:sysbench Branched 116 revision(s). $ ls -ld sysbench drwxr-xr-x 7 hiroi10 hiroi10 4096 Jun 1 04:07 sysbench $ cd sysbench $ ls -l total 100 -rwxr-xr-x 1 hiroi10 hiroi10 3074 Jun 1 04:07 autogen.sh -rw-r--r-- 1 hiroi10 hiroi10 7585 Jun 1 04:07 ChangeLog drwxr-xr-x 2 hiroi10 hiroi10 4096 Jun 1 04:07 config -rw-r--r-- 1 hiroi10 hiroi10 11267 Jun 1 04:07 configure.ac -rw-r--r-- 1 hiroi10 hiroi10 17992 Jun 1 04:07 COPYING drwxr-xr-x 3 hiroi10 hiroi10 4096 Jun 1 04:07 doc -rwxr-xr-x 1 hiroi10 hiroi10 7122 Jun 1 04:07 install-sh drwxr-xr-x 2 hiroi10 hiroi10 4096 Jun 1 04:07 m4 -rw-r--r-- 1 hiroi10 hiroi10 840 Jun 1 04:07 Makefile.am -rwxr-xr-x 1 hiroi10 hiroi10 10266 Jun 1 04:07 missing -rwxr-xr-x 1 hiroi10 hiroi10 1988 Jun 1 04:07 mkinstalldirs -rw-r--r-- 1 hiroi10 hiroi10 3044 Jun 1 04:07 README -rw-r--r-- 1 hiroi10 hiroi10 973 Jun 1 04:07 README-WIN.txt drwxr-xr-x 5 hiroi10 hiroi10 4096 Jun 1 04:07 sysbench -rw-r--r-- 1 hiroi10 hiroi10 26 Jun 1 04:07 TODO $
コンパイルとインストール
事前にMySQL5.6.11をインストールしておいて下さい。MySQLがインストール済みであればコンパイル前までの準備はOKです。以下例はソースから/usr/local/mysql-5.6.11にインストール済みの場合です。
$ ./autogen.sh && ./configure --prefix=/usr/local/sysbench --with-mysql=/usr/local/mysql-5.6.11 $ make $ sudo make install $ /usr/local/sysbench/bin/sysbench --version sysbench 0.5 $
以上でsysbenchの使用準備は完了です。
sysbench用のデータベースとMySQLアカウントを作成する
$ /usr/local/mysql-5.6.11/bin/mysql -uroot mysql> create database sbtest; mysql> grant all on sbtest.* to sbtest@localhost identified by 'sbtest-pw'; mysql> quit $
テスト用データをロードしてみる
その前に0.5系から使われるようになった各種luaファイルをコピーしておきます。
$ pwd /home/hiroi10/sysbench/sysbench/tests/db $ mkdir /usr/local/sysbench/lua $ cp -p *.lua /usr/local/sysbench/lua
ではロードします。以下の例は
- テーブル数12
- 1テーブルの行数3750000
- 3並列でロード
となります。環境によって--num-threadsを増やすとより速くロードが行えます。なお、--num-threadsは--oltp-tables-countの約数となるようにして下さい。
$ /usr/local/sysbench/bin/sysbench \ --test=/usr/local/sysbench/lua/parallel_prepare.lua \ --db-driver=mysql \ --oltp-tables-count=12 \ --oltp-table-size=3750000 \ --num-threads=3 \ --mysql-db=sbtest \ --mysql-user=root \ --mysql-socket=/tmp/mysql-5.6.11.sock \ run $ $ ls -lh /usr/local/mysql-5.6.11/data/sbtest total 11G -rw-rw---- 1 mysql mysql 61 May 25 23:02 db.opt -rw-rw---- 1 mysql mysql 8.5K May 25 23:30 sbtest10.frm -rw-rw---- 1 mysql mysql 900M May 25 23:33 sbtest10.ibd -rw-rw---- 1 mysql mysql 8.5K May 25 23:30 sbtest11.frm -rw-rw---- 1 mysql mysql 904M May 25 23:33 sbtest11.ibd -rw-rw---- 1 mysql mysql 8.5K May 25 23:30 sbtest12.frm -rw-rw---- 1 mysql mysql 900M May 25 23:33 sbtest12.ibd -rw-rw---- 1 mysql mysql 8.5K May 25 23:22 sbtest1.frm -rw-rw---- 1 mysql mysql 900M May 25 23:25 sbtest1.ibd -rw-rw---- 1 mysql mysql 8.5K May 25 23:22 sbtest2.frm -rw-rw---- 1 mysql mysql 900M May 25 23:25 sbtest2.ibd -rw-rw---- 1 mysql mysql 8.5K May 25 23:22 sbtest3.frm -rw-rw---- 1 mysql mysql 900M May 25 23:25 sbtest3.ibd -rw-rw---- 1 mysql mysql 8.5K May 25 23:25 sbtest4.frm -rw-rw---- 1 mysql mysql 900M May 25 23:28 sbtest4.ibd -rw-rw---- 1 mysql mysql 8.5K May 25 23:25 sbtest5.frm -rw-rw---- 1 mysql mysql 900M May 25 23:28 sbtest5.ibd -rw-rw---- 1 mysql mysql 8.5K May 25 23:25 sbtest6.frm -rw-rw---- 1 mysql mysql 900M May 25 23:28 sbtest6.ibd -rw-rw---- 1 mysql mysql 8.5K May 25 23:28 sbtest7.frm -rw-rw---- 1 mysql mysql 900M May 25 23:31 sbtest7.ibd -rw-rw---- 1 mysql mysql 8.5K May 25 23:27 sbtest8.frm -rw-rw---- 1 mysql mysql 900M May 25 23:31 sbtest8.ibd -rw-rw---- 1 mysql mysql 8.5K May 25 23:27 sbtest9.frm -rw-rw---- 1 mysql mysql 900M May 25 23:31 sbtest9.ibd $
ということでベンチマークを実行する準備が完了です。
なお、具体的に計ってませんがsysbench 0.4.12と比較すると並列にロード出来るのを抜きにしてもロードにかかる時間は0.5の方がかなり速いと感じました。
ベンチマークの実行
以下は自分がやってる実行例です。以下例はread-onlyですが--oltp-read-onlyをoffにすればread-writeのテストになります。(2013/06/13 オプション間違いがあったので直しました orz)
$ cat ./ro-bench.sh #!/bin/sh threads='8 16 32 64 128 256 512 1024' DIR="テストケース名" [ ! -d $DIR ] && mkdir $DIR cp -pi /usr/local/mysql-5.6.11/etc/my.cnf $DIR/. for thread in $threads; do echo "==== $thread ====" /usr/local/sysbench/bin/sysbench \ --test=/usr/local/sysbench/lua/oltp.lua \ --rand-init=on \ --db-driver=mysql \ --oltp-table-size=3750000 \ --rand-type=uniform \ --oltp-read-only=on \ --oltp-tables-count=12 \ --mysql-db=sbtest \ --mysql-user=sbtest \ --mysql-password=sbtest-pw \ --mysql-socket=/tmp/mysql-5.6.11.sock \ --max-time=180 \ --max-requests=0 \ --num-threads=$thread \ run | tee $DIR/ro-$thread sleep 30 done $
実際にベンチマークを取得する場合は事前にread-only、1024スレッドで60〜90秒程度を実行してバッファプールにデータ・インデックスの情報を載せてから実行しています。
$ /usr/local/sysbench/bin/sysbench \ > --test=/usr/local/sysbench/lua/oltp.lua \ > --rand-init=on \ > --db-driver=mysql \ > --oltp-table-size=3750000 \ > --rand-type=uniform \ > --oltp-read-only=on \ > --oltp-tables-count=12 \ > --mysql-user=sbtest \ > --mysql-password=sbtest-pw \ > --mysql-db=sbtest \ > --mysql-socket=/tmp/mysql-5.6.11.sock \ > --max-time=60 \ > --max-requests=0 \ > --num-threads=1024 \ > run sysbench 0.5: multi-threaded system evaluation benchmark Running the test with following options: Number of threads: 1024 Random number generator seed is 0 and will be ignored Threads started! OLTP test statistics: queries performed: read: 4549314 write: 0 other: 649902 total: 5199216 transactions: 324951 (5407.94 per sec.) deadlocks: 0 (0.00 per sec.) read/write requests: 4549314 (75711.09 per sec.) other operations: 649902 (10815.87 per sec.) General statistics: total time: 60.0878s total number of events: 324951 total time taken by event execution: 61384.6368s response time: min: 3.38ms avg: 188.90ms max: 1629.68ms approx. 95 percentile: 511.43ms Threads fairness: events (avg/stddev): 317.3350/8.68 execution time (avg/stddev): 59.9459/0.08 $