Sunday, February 3, 2013

MySQL版の pgbench ってないの?


先日、ふとしたことから MySQL に軽く負荷をかけてみる必要が発生した。
できれば単発のSQLを投げるだけではなくて、複数threadで、しかもきちんと transaction になっているようなベンチマークが望ましい…というのが要件。
なお、当然 sysbench は試したのだが、あれは正常に動いていても一定確率で deadlock が発生する性質のもののようなので、今回の目的のためには使えなかった。

それならTPC系のOSSなベンチで何か手ごろなのがないかなぁ…と考えて、PostgresSQLならお手軽に pgbench (TPC-B相当)があるのだが、MySQLではどうなの?…というのが本日のお題。

さていきなり余談だが、マルチプラットフォームで同じベンチが動けばいいなら、JDBCBench という Java で書かれた TPC-B もあることはある


のだが、事情でむかーし使ってみた時には、この移植って少し問題があって修正が必要だったような記憶があったのと、今回は環境の都合でJVMなしでお手軽に動かしたかったのでググってみたところ、日本MySQLユーザ会の有志の方が移植したものを発見。
(当然みんな同じことを考えるんだねぇ…ということで :)


PostgreSQL 付属の pgbench を移植したもののようだ。

ではさっそく…ということで、MySQL 5.5 で動かしてみたところ、DBの初期化のところでエラーになってしまった...orz

ざっと調べたところ、これはそもそも2004年の仕事で、対応している MySQL のバージョンが古く、create table するところでInnodbとかのstorage engineを指定するDDLの syntax が古いだけだということが判明。

mysqlbench.c に以下のようなところがあるので、403行目の TYPE= を ENGINE= に修正するだけで動くようになる。

    372 /*===================================*/
    373 /* create tables and setup data */
    374 static void init(MYSQL *mysql)
    375 {
    376   MYSQL    *con;
    377   int        res;
      : 
    399   for (i = 0; i < (sizeof(DDLs) / sizeof(char *)); i++)
    400   {
    401     if (strncmp(DDLs[i], "CREATE", 6) == 0)
    402     {
    403       sprintf(sql, "%s TYPE=%s", DDLs[i], engine);
    404     }
    405     else



とかあるようだし、もっと探せばどこかで最新版がメンテされているのかなぁ…と、思いつつ、目的は果たせてしまったので、ここまでとした。

MySQLのDDL syntax がいつ変わったのかわからないのだけど、サーバのバージョンをみて、TYPE= と ENGINE= を切り替えるような処理をするのがよさげですね。

No comments:

Post a Comment