Browse Tag: mysqlbench

mysqlbench のインストールとその使い方

mysqlbench のインストール方法は、つぎのとおり。

  1. 日本 MySQL ユーザ会のサイトから mysqlbench-0.1.tgz をダウンロードして、展開する
  2. Makefile を libmysqlclient_r.so があるライブラリパスに、mysql のヘッダーファイルがあるヘッダーファイルパスに変更する
  3. make を実行すると、mysqlbench の実行ファイルが生成される

Makefile の差分、CentOS 5.2 x86_64 の場合

— Makefile-org        2009-01-13 10:41:03.000000000 +0900
+++ Makefile    2009-01-09 22:09:14.000000000 +0900
@@ -1,8 +1,8 @@
CC = gcc
CFLAGS = -O2 -D_REENTRANT
-LDFLAGS = -Wl,-R/usr/lib/mysql
+LDFLAGS = -Wl,-R/usr/lib64/mysql
MYSQL_INCLUDE= -I/usr/include/mysql
-MYSQL_LFLAGS= -L/lib -L/usr/lib/mysql
+MYSQL_LFLAGS= -L/lib -L/usr/lib64/mysql
MYSQL_LIBS= -lm -lz -lnsl -lcrypt
# NORMLIB=-lmysqlclient
PTLIBS=-lmysqlclient_r -lpthread

ビルドできたところで、さっそく使ってみる。

まず、テスト用のデータベースとユーザを準備する。

  1. % mysql -u root
  2. mysql> create database testdb;
  3. mysql> grant all on testdb.* to ‘test’@’localhost’ identified by ‘test’;
  4. mysql> flush privileges;
  5. % ./mysqlbench -i -U test -P test -E innodb -s 100 testdb

これで準備は OK。上の例だと、test というデータベースはすでに存在しているので、testdb というテスト用のデータベースを作成して、そこに innodb のテーブルを scaling factor 100 で用意する。100 だと 10 万件のテーブルが用意される。

これで準備できたので、さっそくベンチマークを計測してみる。

%  ./mysqlbench -U test -P test testdb -c 50 -t 500 testdb

starting vacuum…OPTIMIZE TABLE tellers: Commands out of sync; you can’t run this command now
DELETE FROM history: Commands out of sync; you can’t run this command now
OPTIMIZE TABLE history: Commands out of sync; you can’t run this command now
end.
all connection OK
go
end.

transaction type                    . . . : TPC-B (sort of)
scaling factor                      . . . : 100
number of clients                     . . : 50
number of transactions per client         : 500
number of transactions actually processed : 25000/25000
tps (include connections establishing)  . : 6071.722096
tps (exclude connections establishing)  . : 6090.218549

「number of transactions per client」は、MySQL に設定されている同時接続最大数です。tps というのが実際のベンチマークの指標となる数値を示している。

これで、MySQL の設定などにやってパフォーマンスを計測できます。

他にも MySQL のベンチマークツールがあるので、試してみる。

mysqlbench

MySQL で、ベンチマークをとるときには mysqlbench というツールが便利だということで、付属の README の内容を勝手に翻訳してみた。

README.mysqlbench の内容

このベンチマークツールは、postgresql-8.0 のソースコード内部に含まれている pgbench をベースにしたツールです。

pgbench では、次のことができます。

– TPC-B をシュミレーションした想定

– サーバに対して大量の接続をしてクエリーを流すこと

イメージ:
サーバ                        クライアント
| MySQL | <–ネットワーク– | 一度だけ大量の雪像をする |
|       | <———– |                               |
|       | <———– |                               |
|       | <———– |                               |

mysqlbench と pgbench の違っている点は次のとおりです:

-vacuum (-C, -n -v) のためのオプションは動作しません、なぜなら MySQL は vacuum をもっていないからです

– -S オプションはありません

– -d オプションはありません
– デフォルトのデータベース名は、”test” です
– mysqlbench は、大量の接続を作るために PThread を使っていて、pgbench は接続用に select() お使っています
– -E オプションは、ストレージを指定するためのオプションです (innodb あるいは myisam あるいは nbcluster)

README.pgbench にさらに詳細な情報が書かれています。

コンパイル方法:

Makefile を編集して、make コマンドを実行するだけです。

使い方:
./mysqlbench [オプション] <データベース名>

option:
-c 一度に生成したい接続数
-t 1回の接続で何回クエリーを実行するか
-h <ホスト名> -U <MySQL ユーザ名> -P <MySQL ユーザのパスワード>
-E innodb
-E myisam

pgbench の mysql 版といったツールですね。

TPC-B というのは、Transaction Processing Performance Council というところが制定したデータベースの性能を測定するためのベンチマーク方法とのことです。TPC-A というベンチマーク方法もあるとのこと。

README.pgbench も、最後の ChangeLog を除く部分を翻訳してみた。

pgbench とは何か?

pgbench は、”TPC-B” のならったベンチマークテストを実行するための単純なプログラムです。pgbench は、PostgreSQL のクライアントアプリケーションで PostgresQL のみで動作します。このツールは、select/update/insert 操作を含んだ大量の小さく単純なトランザクションを1秒あたりに正常に完了したトランザクションの数を tps(transactions per second) として計算します。対象のデータは、最低でも 100k 個の要素のテーブルを含んでいます。

pgbench からの出力例は次のようになります:

number of clients: 4
number of transactions per client: 100
number of processed transactions: 400/400
tps = 19.875015(including connections establishing)
tps = 20.098827(excluding connections establishing)

“JDBCBench” というすでに存在しているプログラムに似ていますが、そのプログラムは Java を必須としていてすべてのプラットフォームでは使えません。ほとんどの人が Java を意識する必要があります。だから純粋な C 言語で書くことを決定してそのプログラムを pgbench を名づけました。

o pgbench の機能

– pgbench は、ligpq だけを使った C 言語で書かれています、だからとても移植性が高くインストールも簡単です
– pgbench は、libpq の機能を使った非同期の接続をシュミレーションすることができます、スレッドにならないことが必須です

pgbench の使い方

(1) 次のコマンドでデータベースを初期化します:

pgbench -i <データベース名>

<データベース名>はデータベースの名前です。pgbench は4つのテーブル、accounts、branches、history と tellers を使います。これらのテーブルは破棄されます。もし同じ名前をもったテーブルがある場合にはよく注意してください。デフォルトのデータベースは次のものを含んでいます:

テーブル           要素の数
————————-
branches        1
tellers         10
accounts        100000
history         0

-s オプションを使うことによって要素の数を増やすことができます。巻末を参照してください。

(2) ベンチマークテストを実行します

pgbench <データベース名>

デフォルトの設定は次のとおりです:

number of clients: 1
number of transactions per client: 10

オプション

pgbench は、次のオプションをもっています。

-h ホスト名
データベースが動作しているホスト名です。もし省略されると Unix ドメインソケット経由で localhost に接続します。

-p ポート番号
接続するポート番号です。デフォルトは、libpq のデフォルトでたいてい 5432 です。

-c クライアント数
シュミレーションするクライアントの数。デフォルトは、1。

-t トランザクション数
クライアントごとに実行するトランザクションの数。
-s 規模的な数値

これは -i オプションと一緒に使われる必要があります。生成する個の要素の数にあたります。例えば、-100 では 10M の account テーブルが用意されます。デフォルトは、1です。メモ:規模的な数字はテストするためのもっとに大きいクライアント数になります。

-U ログイン
データベースサーバにログインするのユーザ名

-P パスワード
データベースのパスワード。注意:このオプションを使うというならパスワードを表示するようになってからである。これはテスト段階のみで使われるものである。

-n

vacuum なしで履歴テーブルを削除しない

-v
テストの前に vacum を実行する。これは時間がかかります。-n と -v オプションを指定されたときは無効です。

-S
TPC-B のかわりに select のみのトランザクションを評価します。

-C
それぞれのトランザクションあたりの接続数。pgbench を通常モードで実行しはじめるとき1度だけ必要。これは、接続のオーバーヘッドを測定するために役に立つ。
-l
ログファイルにそれぞれのトランザクションを書き込む時間。pgbench_log.xxx という名前になり xxx は pgbench プロセスの PID を示す。ログのフォーマットは、次のとおり:

クライアントID トランザクション時間

時間はマイクロ秒で計測された時間です。

-d
デバックオプションです。

o pgbench での「トランザクション」とは具体的には何を表しているか?

(1) begin;

(2) update accounts set abalance = abalance + :delta where aid = :aid;

(3) select abalance from accounts where aid = :aid;

(4) update tellers set tbalance = tbalance + :delta where tid = :tid;

(5) update branches set bbalance = bbalance + :delta where bid = :bid;

(6) insert into history(tid,bid,aid,delta) values(:tid,:bid,:aid,:delta);

(7) end

ライセンス

BSD ライセンスと同じ。

次は、実際に mysqlbench のコンパイル方法や使い方を紹介します。