sysbench 0.5のインストールと簡単な使い方

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

$

まとめ

OLTPなベンチマークは書いた情報で実行する事が可能かと思います。いかんせん0.5系の情報は少ないので海外のブログとか漁ると他にも情報が出てくると思います。他にもluaスクリプトは用意されているので軽く眺めてみると良いかと。私はまだ全部見れてませんけど…。
パラメータを変更しつつ何回かベンチマークしてるけどイマイチ載せようと思うような結果が出てなかったり…。とはいえそのうちベンチマーク結果も載せたいと考えてます。