データベース負荷テストツールまとめ(1)

Webシステム開発において性能試験を行う場合、hp LoadRunnerやApache JMeterといったウェブブラウザをエミュレーションしてくれる負荷テストツールを用いるのが定番だと思います。そんななか、たまにデータベース単体での性能を測ってほしいと頼まれることがあるので、そうした便利なツールはあるのかなと思って調べてみました。
データベースに対する負荷テストツールは探すとたくさん出てくるのですが、案件で使用しているRDBMSに対応していなかったり、トランザクション仕様が希望と異なっていたり、微妙に作りが悪かったりと、ニーズに合致したツールはすぐには見つかりません。そんなときにこのエントリがツール探しの参考になればと思います。

pgbench

pgbenchはTPC-Bをベースとした性能測定ツールで、PostgreSQL本体に付属しています。TPC-BはTPCによって1994年に策定されたトランザクション仕様で、以下のSQLを順番に実行するものです。更新を主体としたデータベースのベンチマークソフトになります。

UPDATE accounts SET abalance = abalance + :1 WHERE aid = :2;
SELECT abalance FROM accounts WHERE aid = :1;
UPDATE tellers SET tbalance = abalance + :1 WHERE aid = :2;
UPDATE branches SET bbalance = abalance + :1 WHERE aid = :2;
INSERT INTO history (aid, aid, aid, delta) VALUES (:1, :2, :3, :4);
COMMIT;

TPC-B自体は1995年にはもうobsolete扱いになっており、現在公式には使われていません。
いまどきのサーバではデフォルトの設定で試験を行うと全データがメモリ上に収まってしまうため、ほぼCOMMIT時のfdatasync()ベンチマークといった様相になります。PostgreSQLの場合はWALログをONにしているかどうかやwal_sync_methodの設定、ストレージにバッテリ保護されたライトバックキャッシュがあるかどうか、といった点が性能の決定要因になります。Googleで検索して普通のPCサーバで100tps前後の結果を載せているページがあったら、「ああ、これはDBサーバの総合的な性能を測っているのではなくて、HDDの性能を測っているんだな」と思った方がいいです。
pgbenchはTPC-B以外にも、簡単なスクリプトを書くことでユーザ指定のトランザクションを実行することができます。

mysqlbench

mysqlbenchはpgbenchをMySQLに移植したもので、MyNAのWebサイトで公開されています。メーリングリストの過去ログを漁ったのですが、結局どなたが作ったのか分かりませんでした。
傾向はもちろんpgbenchと同じで、特にInnoDBを使った場合は完全にfsync()あるいはO_DIRECT時のwrite()ベンチマークになります。innodb_flush_log_at_trx_commitの設定を変えてみたり、SSDを使ってみたりすると面白いと思います。
pgbenchにあるユーザ指定のトランザクションを実行する機能は、mysqlbenchには実装されていません。

JDBCBench

JDBCBenchはpgbenchの元になったプログラムで、どうやらこれがオリジナルのようです。ただ残念ながらダウンロード先が見つかりませんでした。とりあえずmysqlbenchに同梱されているので、そこから取り出すのがよいと思います。作者のMark Matthews氏は現在Sun Micorosystemsに在籍しており、MySQLのJDBCドライバConnector/Jの開発をされています。
このツールはJavaで書かれているためRDBMS、OSを選びません。とはいえ基本的にはMySQLを想定して書かれていますので、別のRDBMSで動かしたい場合はまずCREATE TABLE文から修正していく必要があります。
このツールにはいくつか問題があります。まずMySQLのMyISAMを想定して作られたためかトランザクションが意識されていません。JDBCはデフォルトでオートコミットなので、InnoDBや他のRDBMSの場合3つのUPDATE文と1つのINSERT文でそれぞれCOMMITが行われてしまいます。そのためまともな性能を測ることができません。直してから使いましょう。
もう一つ、PreparedStatementが使われていません。これはMySQLにとってはどうでもいいことなのですが、SQLの解析フェーズが非常に重いOracleの場合はきちんとした性能が取れなくなってしまっています。ここは直すくらいなら一から書き直した方が早いかもしれません。

DbBench

pgbenchをFirebird向けに移植したものです。MySQLにも対応しています。Delphiで作成されておりWindows上で動作します。
今回ご紹介するツールの中で、唯一GUIを備えています。クライアントライブラリも同梱されているので、データベースをセットアップすればすぐに測定を開始できます。将来的にはPostgreSQLにも対応したいとのことです。

DBT-1

DBT-1はOSDL(Open Source Development Labs)が開発したデータベース負荷テストツールです。TPC-Wをベースとしたトランザクションの性能を測定することができます。
TPC-WはWebのショッピングサイトを模したベンチマーク仕様であり、商品検索、購入といった14の処理が組み合わされています。基本的には商品検索処理の負荷が高く、以下のようなSQLが負荷の大半を占める形です。これは書籍をジャンル名で検索し、タイトル順にソートして最初の50件を表示するものです。

SELECT i_id, i_title, a_fname, a_lname
FROM item, author
WHERE i_subject = :1
AND i_a_id = a_id
ORDER BY i_title ASC
LIMIT 50;

TPC-Wも2005年にobsoleteになりました。現在公式には使われていません。
DBT-1はもともとSAP DBをターゲットに開発され、その後PostgreSQLへの対応が行われました。内部的にはデータベース内に格納されたストアドプロシージャをODBCまたはlibpq経由で実行するというアーキテクチャになっています。ほとんどのロジックがストアドプロシージャ内に閉じているため、一般的なWebシステムとは性能の傾向が異なると考えられます。
SAP DBはSAPがR/3のために自社開発したRDBMSですが、その後MySQL ABと提携しMaxDBと名前を変えて開発が続けられています。ただSAP R/3以外で使われているケースはほとんどないのではないかと思います。MaxDBはその後2007年にSAPに返還されました。(ニュースリリース)

DBT-1 IPA版

日本OSS推進フォーラムは「情報システムのユーザー、ベンダー、学識経験者の有識者が参集し、OSSの活用上の課題について、自由な立場で議論し、課題解決に向けての取組み」を行う組織だそうです。IPAが事務局を務めています。
DBT-1 IPA版はオリジナルのDBT-1をフォークして、対応RDBMSを追加したバージョンです。

  • MaxDB版:SAP DB版を修正してMaxDBで動くようにしたもの。ODBC経由でストアドプロシージャを実行します。
  • Oracle版:元のPostgreSQL版をOracleに移植したもの。OCI(Oracle Call Interface)経由でPL/SQLのストアドプロシージャを実行します。
  • MySQL非ストアド版:MySQL用にデータベースへのインタフェース部分を新たに書き起こしたもの。ストアドプロシージャは使わずに、ODBC経由で個々のSQLを発行します。
  • PostgreSQL非ストアド版:MySQL版をPostgreSQLに移植したもの。ストアドプロシージャは使わずに、ODBC経由で個々のSQLを発行します。

報告書を読むと、IPA版はかなり苦労して作った跡が見受けられます。残念ながら、継続的にメンテナンスされているソフトウェアではないため不具合をみつけても報告する先がないこと、加えてSAP DB時代の設計を引きずっててしまったためかLinuxのシステム開発でまず使われることのないODBCを採用していることが、ツール自体や測定結果の扱いをかなり難しくしてしまっています。SQLも見れば見るほど全部書き直したくなります。今からDBT-1、DBT-1 IPA版を使うことは私はあまりおすすめしません。

続きます

今回はまずTPC-B、TPC-Wをベースとしたツールをご紹介しました。データベースの負荷テストツールはたくさんあって1エントリでまとめきることは難しいので、今後もう1〜2回かけていろいろご紹介していきたいと思います。それではまた。