Saturday, March 30, 2013

python 版 mysqlbench

python の練習の続き。

やっている仕事の関係上、python から RDBMS、特に MySQL を触る必要があることが多い(多かった...?)のだが、練習がてら、まずは素直に python-mysqldb を使い、pgbench のMySQL移植の mysqlbench を、さらに python に移植してみた。
なお、mysqlbench のオリジナルは PostgreSQLの石井さんが作った TPC-Bライクなスタンドアロン型のベンチマークツール pgbench であることは言うまでもない。

現状版がこれ↓


で、移植元は、お名前がわからないのが残念なのだが日本の MySQL ユーザ会の有志の方が作成されたこれ↓である。



まず、移植元の mysqlbench の実行結果がこんな感じなのに対して、
(微妙にエラーが出ているのは愛嬌)

$  ~/mysqlbench-0.1/mysqlbench  -U username -P password -h 192.168.1.1 -c 10 -t 1000 pgbench
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                      . . . : 1
number of clients                     . . : 10
number of transactions per client         : 1000
number of transactions actually processed : 10000/10000
tps (include connections establishing)  . : 264.557585
tps (exclude connections establishing)  . : 264.608737


今回の python 移植版はこんな感じになる。

$ python python-mysqlbench.py -U username -P password -h 192.168.1.1 -c 10 -t 1000 -D pgbench
all threads completed
transaction type                    . . . : TPC-B (sort of)
scaling factor                      . . . : 1
number of clients                     . . : 10
number of transactions per client         : 1000
number of transactions actually processed : 10000/10000
tps (include connections establishing)  . : 270.410621
tps (exclude connections establishing)  . : 270.462350


だいたい誤差くらいの範囲で同じ値が出るようになったようだ。

まだエラー処理が足りない(特に SQL 発行部分をちゃんと try ~ exception にしていない部分があるの)と、コマンドラインシンタックスが微妙に違う(dbname の指定方法とか...)とか、いろいろあるのだが、それはまあぼちぼちということで。(そういうわけで、まだβ版です...)

なお、また「pep8 でエラーがでるじゃねえか」とワカモノから怒られるような気がするのだが、以下の通り移植元のURLを記載した行と、大元の石井さんのPostgreSQL用のC実装のファイルヘッダに含まれる $Id$ 行がひっかかる。

$ pep8  python-mysqlbench.py
python-mysqlbench.py:9:80: E501 line too long (112 characters)
python-mysqlbench.py:24:80: E501 line too long (86 characters)

まあ、これはしかたないよねぇ...ということで。

No comments:

Post a Comment