Symfoware

Symfowareについての考察blog

JDBCドライバ経由でデータベースの負荷テストを行う - JdbcRunner

真面目にデータベースの性能テストを行ったことがないので、
ちょっと勉強してみようかと。

各種ベンチマークソフトがあるようなのですが、
テスト対象のデータベースが固定だったりします。

同じツールで色々なデータベースのテストができないものか調べていると、

JdbcRunner - 汎用データベース負荷テストツール

これは便利そう。



微調整



Vectorから「jdbcrunner-1.2」をダウンロード。
解凍します。

いくつかJDBCドライバが同梱されているのですが、
どうも動的にロードではなく、jdbcrunner-1.2.jarに含まれている模様。

最新のJDBCドライバを使用してテストしたかったので、
build.xmlを若干編集してビルドしなおしました。


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project name="jdbcrunner_build" default="create_run_jar" basedir=".">
  3.     <description>
  4.         JdbcRunner build
  5.     </description>
  6.     <property file="src/jdbcrunner/resources.properties" />
  7.     <target name="create_run_jar" depends="compile,makedir,deletedir">
  8.         <jar destfile="jdbcrunner-1.2.1.jar" filesetmanifest="mergewithoutmain" duplicate="preserve">
  9.             <manifest>
  10.                 <attribute name="Main-Class" value="JR" />
  11.             </manifest>
  12.             <fileset dir="classes" />
  13. <!--            <fileset dir="meta-inf" /> -->
  14.             <fileset file="helper.js" />
  15. <!--            <zipgroupfileset dir="lib" includes="*.jar" /> -->
  16.         </jar>
  17.     </target>
  18.     <target name="compile" depends="makedir,deletedir">
  19.         <javac srcdir="src" destdir="classes" debug="on" encoding="UTF-8">
  20.             <classpath>
  21.                 <fileset dir="lib" includes="*.jar" />
  22.             </classpath>
  23.         </javac>
  24.         <copy todir="classes">
  25.             <fileset dir="src" includes="**/*.properties" />
  26.         </copy>
  27.     </target>
  28.     <target name="makedir" depends="deletedir">
  29.         <mkdir dir="classes" />
  30.     </target>
  31.     <target name="deletedir">
  32.         <delete dir="classes" />
  33.     </target>
  34. </project>




ダウンロードしたファイルを解凍したフォルダでantを実行。


$ ant



jdbcrunner-1.2.1.jarが出力されました。
これにはJDBCドライバは含まれていません。





JDBCドライバ



テストしたいデータベースのドライバをlibフォルダに集めておきます。

623_01.png


テストデータを登録するときのコマンドで、lib以下のjarファイルを含めるように
指定することになります。


$ java -cp jdbcrunner-1.2.1.jar:lib/* JR scripts/tpcb_load.js






テストサンプル



こちらを参考に、TPC-Bテストを実行してみます。
9. テストキット Tiny TPC-B

対象はMariaDBです。

scripts/tpcb_load.js、scripts/tpcb.jsを編集。
接続文字列とユーザーを微調整。


  1. // MariaDB
  2. var jdbcUrl = "jdbc:mariadb://192.168.1.103:3306/sample";
  3. var jdbcUser = "admin";
  4. var jdbcPass = "P@ssw0rd";




テストデータをロード。


$ java -cp jdbcrunner-1.2.1.jar:lib/* JR scripts/tpcb_load.js




テスト実行。


$ java -cp jdbcrunner-1.2.1.jar:lib/* JR scripts/tpcb.js
...
19:10:49 [INFO ] [Total tx count] 81089 tx
19:10:49 [INFO ] [Throughput] 450.5 tps
19:10:49 [INFO ] [Response time (minimum)] 3 msec
19:10:49 [INFO ] [Response time (50%tile)] 27 msec
19:10:49 [INFO ] [Response time (90%tile)] 52 msec
19:10:49 [INFO ] [Response time (95%tile)] 71 msec
19:10:49 [INFO ] [Response time (99%tile)] 201 msec
19:10:49 [INFO ] [Response time (maximum)] 1238 msec
19:10:49 [INFO ] < JdbcRunner SUCCESS



ちゃんとテストが実行できました。




Derbyのテスト



jdbcrunnerはOracle,MySQL(MariaDB),PostgreSQLのテストに
対応していますが、自分でスクリプトを修正することで、
他のデータベースのテストも行えます。

サンプルとして、Derbyのテストを行ってみます。

まず、tpcb.js、tpcb_load.jsの接続文字列を変更。
※パスワードは不要ですが、何か指定していないとエラーになる。


  1. // Apache Derby
  2. var jdbcUrl = "jdbc:derby://192.168.1.103:1527/data/sample;create=true";
  3. var jdbcUser = "sa";
  4. var jdbcPass = "password";




tpcb_load.jsでは、データベースの種類によりcreate文を変更しています。
その箇所を微調整。
PostgreSQLのCreate文を間借りします。


  1. function init() {
  2. ...
  3.         } else if (getDatabaseProductName() == "PostgreSQL") {
  4.             dropTable();
  5.             createTablePostgreSQL();
  6.             
  7.         } else if (getDatabaseProductName() == "Apache Derby") {
  8.             dropTable();
  9.             createTablePostgreSQL();
  10.             
  11.         } else {
  12. ...
  13. }
  14. function fin() {
  15. ...
  16.         } else if (getDatabaseProductName() == "PostgreSQL") {
  17.             createIndexPostgreSQL();
  18.             createForeignKeyPostgreSQL();
  19.             gatherStatsPostgreSQL();
  20.             
  21.         } else if (getDatabaseProductName() == "Apache Derby") {
  22.             createIndexPostgreSQL();
  23.             createForeignKeyPostgreSQL();
  24.             
  25.         } else {
  26. ...
  27. }




この状態だとprimary key設定時にエラーとなったので、


19:18:10 [ERROR] エージェント 0 で例外が発生しました
jdbcrunner.ApplicationException: データベースアクセス中に例外が発生しました
org.apache.commons.dbcp.SQLNestedException: Borrow prepareStatement from pool failed




not null制約を付加します。


  1. function createTablePostgreSQL() {
  2.     info("Creating tables ...");
  3.     
  4.     execute("CREATE TABLE branches ("
  5.         + "bid INTEGER NOT NULL, "
  6.         + "bbalance INTEGER, "
  7.         + "filler CHAR(88))");
  8.     
  9.     execute("CREATE TABLE tellers ("
  10.         + "tid INTEGER NOT NULL, "
  11.         + "bid INTEGER, "
  12.         + "tbalance INTEGER, "
  13.         + "filler CHAR(84))");
  14.     
  15.     execute("CREATE TABLE accounts ("
  16.         + "aid INTEGER NOT NULL, "
  17.         + "bid INTEGER, "
  18.         + "abalance INTEGER, "
  19.         + "filler CHAR(84))");
  20.     
  21.     execute("CREATE TABLE history ("
  22.         + "tid INTEGER, "
  23.         + "bid INTEGER, "
  24.         + "aid INTEGER, "
  25.         + "delta INTEGER, "
  26.         + "mtime TIMESTAMP, "
  27.         + "filler CHAR(22))");
  28. }





MariaDB同様、テストデータをロード。


$ java -cp jdbcrunner-1.2.1.jar:lib/* JR scripts/tpcb_load.js




テスト実行。


$ java -cp jdbcrunner-1.2.1.jar:lib/* JR scripts/tpcb.js
...
19:27:13 [INFO ] [Total tx count] 134737 tx
19:27:13 [INFO ] [Throughput] 748.5 tps
19:27:13 [INFO ] [Response time (minimum)] 2 msec
19:27:13 [INFO ] [Response time (50%tile)] 11 msec
19:27:13 [INFO ] [Response time (90%tile)] 23 msec
19:27:13 [INFO ] [Response time (95%tile)] 33 msec
19:27:13 [INFO ] [Response time (99%tile)] 106 msec
19:27:13 [INFO ] [Response time (maximum)] 4885 msec
19:27:13 [INFO ] < JdbcRunner SUCCESS


関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2015/07/05(日) 19:35:33|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<MariaDB, PostgreSQL, Derby, H2SQLのベンチマーク比較 | ホーム | MariaDB 10にJDBCドライバ(MariaDB Connector/J 1.1.9)で接続する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1747-a2d48051
この記事にトラックバックする(FC2ブログユーザー)