データベース負荷テストツールまとめ(4)
データベース負荷テストツールまとめの第4回です。
- データベース負荷テストツールまとめ(1) TPC-B、TPC-Wベースのツールを6つ紹介
- データベース負荷テストツールまとめ(2) TPC-Cベースのツールを6つ紹介
- データベース負荷テストツールまとめ(3) TPC-Hベースのツールを2つ紹介
今回はTPC-Eベースのツールを見ていきたいと思います。
TPC-Eとは
TPC-EはRDBMSベンチマーク仕様の一つで、オンライントランザクション(OLTP)の性能を測定するものです。証券会社の業務をモデルとして取引や市場の監視、メンテナンス処理を行い、1秒あたりに行った取引件数を性能の指標値とします。
OLTPのベンチマークとしてはこれまでTPC-Cがよく用いられてきました。しかしTPC-Cは1992年の策定から実に18年が経過しており、その間コンピュータのCPU性能はムーアの法則にしたがって伸びてきたものの、ストレージ性能がそれにまったく追いついていませんでした。結果として近年のTPC-Cの公式スコアは、新型サーバ1台の全力を引き出すためにHDDを1,000本以上ストライピイングするといった、実際にはありえない構成になってしまっていました。
TPC-EはTPC-Cと比べてストレージよりもCPUに負荷をかける設計になっています。またテストデータがニューヨーク証券取引所の実際のデータをもとにして作られており、より説得力のあるベンチマーク結果が得られるものと期待されています。
モデルの複雑さ
TPC-Eはこれまでご紹介したベンチマークモデルに比べてかなり複雑です。前回までのエントリは一応仕様書を読んでから書いていたのですが、今回はあきらめました。モデルの複雑さはER図で見ていただくと分かりやすいので、他のモデルとあわせてご覧ください。
SysBench OLTPテストのモデルです。テーブルは1つだけで、ごく単純な作りとなっています。
TPC-Bのモデルです。pgbench、mysqlbenchが採用しているものです。ただし、これら二つのツールでは図にあるような参照整合性制約は付与されていません。理解しやすいように後付けしました。
TPC-Cのモデルです。tpcc-mysql、DBT-2が採用しているものです。stockテーブルが正規化されていませんが、これは仕様通りです。おそらく意図的なものだと思います。
そしてこれがTPC-Eのモデルです。tpcemysqlが採用しているものです。正直ベンチマークのためだけにここまで作り込むのか、といった印象です。
tpcemysql (Percona BenchWork)
- 対応RDBMS:MySQL、Oracle、PostgreSQL
- 対応OS:Linuxなど
- 言語:C++
- 作者:Percona Inc.
- ライセンス:独自 (同梱のEULA.txt参照)
- トランザクション仕様:TPC-Eベース
- URL:https://launchpad.net/percona-benchwork
tpcemysqlはMySQLのコンサル会社であるPercona Inc.によって開発されたベンチマークツールです。Percona製ベンチマークツールは第2回でtpcc-mysqlをご紹介したところですが、それからしばらく見ないうちに各種ツールをまとめたセットがPercona BenchWorkとして提供されるようになっていました。セットアップにBazaarがいらなくなっているので、比較的気軽に試すことができます。
ライセンスが独自となっていますが、これはTPCが提供するプログラムを組み込んでいるためです。TPC-EはEGenLoaderと呼ばれるテストデータ生成プログラム、EGenDriverと呼ばれるクライアントシミュレータ、それからEGenTxnHarnessと呼ばれるDBMSインタフェースプログラムを組み込んでテストを行うことが義務付けられています。要するに乱数の発生を偏らせたり、複数の処理をマージするような不正ができないようになっているのです。一般的なオープンソースソフトウェアとは扱いが異なりますので、二次利用される場合はライセンス違反とならないように注意してください。TPC-Eの構成図を以下に示します。
簡単に使い方を説明しておきます。Percona BenchWorkのアーカイブを展開したらpercona-benchwork/src/EGen_v1.5.1/prjディレクトリに移動します。ここにMakefileがあります。
$ cd percona-benchwork/src/EGen_v1.5.1/prj $ ls EGen.sln EGenGenerateAndLoad.vcproj EGenUtilities.vcproj EGenBaseLoader.vcproj EGenLoader.vcproj EGenValidate.vcproj EGenDriverCELib.vcproj EGenLogger.vcproj Makefile EGenDriverDMLib.vcproj EGenMSSQLLoader.vcproj Makefile.new EGenDriverMEELib.vcproj EGenNullLoader.vcproj Readme EGenFlatFileLoad.vcproj EGenTables.vcproj VS2008
configureはないのでmakeを叩けばビルドできます。ビルドするには事前にunixODBC、unixODBC-develがインストールされている必要があります。ただtpcemysqlはLinux x86_64の環境でしかテストされていないと思われるので、それ以外の環境ではおそらく動きません。Linux i386ではそのままだと2GB以上のテストデータを出力することができなかったのですが、Makefileに以下のパッチを当てれば動作させることが可能です。
*** Makefile_org 2010-01-22 16:01:26.000000000 +0900 --- Makefile 2010-05-09 15:55:23.000000000 +0900 *************** *** 23,29 **** # Defines for Linux (MySQL C API Wrapper) CXX=g++ ! CCFLAGS=-g -O2 -Wall -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -I/usr/include/mysql -DMYSQL_ODBC -DODBC_WRAPPER -DUSE_PREPARE LDFLAGS=-g -O2 -Wall LIBS=-lpthread -lmysqlclient_r --- 23,29 ---- # Defines for Linux (MySQL C API Wrapper) CXX=g++ ! CCFLAGS=-g -O2 -Wall -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -I/usr/include/mysql -DMYSQL_ODBC -DODBC_WRAPPER -DUSE_PREPARE LDFLAGS=-g -O2 -Wall LIBS=-lpthread -lmysqlclient_r
ビルドが成功すると、EGen_v1.5.1/bin以下に3つのファイルが生成されます。
$ ls -l bin 合計 7232 -rwxrwxr-x 1 taira taira 2987554 5月 9 16:03 EGenLoader -rwxrwxr-x 1 taira taira 3940256 5月 9 16:04 EGenSimpleTest -rwxrwxr-x 1 taira taira 459762 5月 9 16:03 EGenValidate
EGen_v1.5.1ディレクトリへ移動し、bin/EGenLoaderでテストデータの生成を行います。
$ bin/EGenLoader -h EGen v1.6.0 Usage: EGenLoader [options] Where Option Default Description -b number 1 Beginning customer ordinal position -c number 5000 Number of customers (for this instance) -t number 5000 Number of customers (total in the database) -f number 500 Scale factor (customers per 1 tpsE) -w number 300 Number of Workdays (8-hour days) of initial trades to populate -i dir flat_in/ Directory for input files -l [FLAT|ODBC|CUSTOM|NULL] FLAT Type of load -m [APPEND|OVERWRITE] OVERWRITE Flat File output mode -o dir flat_out/ Directory for output files -x -x Generate all tables -xf Generate all fixed-size tables -xd Generate all scaling and growing tables (equivalent to -xs -xg) -xs Generate scaling tables (except BROKER) -xg Generate growing tables and BROKER -g Disable caching when generating growing tables Error: Unrecognized option: h
TPC-Eはデフォルト設定でテストデータ生成を行うと、テキストファイルで30GB、MySQL InnoDBにロードして100GBというかなり大きなデータベースになります。最初は-w 30ぐらいに絞っておくことをおすすめします。
テストデータ生成が終わったら、EGen_v1.5.1/scripts/mysqlディレクトリに移動してデータベースのセットアップを行います。
$ cd scripts/mysql $ ls -l 合計 32 -rw-r--r-- 1 taira taira 10666 1月 22 16:01 1_create_table.sql -rw-r--r-- 1 taira taira 3633 1月 22 16:01 2_load_data.sql -rw-r--r-- 1 taira taira 5633 1月 22 16:01 3_create_fk.sql -rw-r--r-- 1 taira taira 647 1月 22 16:01 4_create_index.sql -rw-r--r-- 1 taira taira 181 1月 22 16:01 5_create_sequence.sql $ mysql -u tpce -p tpce < 1_create_table.sql $ mysql -u tpce -p tpce < 2_load_data.sql $ mysql -u tpce -p tpce < 3_create_fk.sql $ mysql -u tpce -p tpce < 4_create_index.sql $ mysql -u tpce -p tpce < 5_create_sequence.sql
普通のPCでデフォルト設定にしてしまうと、セットアップに数日かかると思います。気長に待ちましょう。
データベースが準備できたら、bin/EGenSimpleTestで負荷テストを実行します。
$ bin/EGenSimpleTest -h EGen v1.6.0 (for MySQL) (Prepared Statement) Usage: EGenSimpleTest {options} where Option Default Description ========= =================== ============================================= -e string flat_in Path to EGen input files -S string localhost Database server -D string tpce Database name -U string tpce Database user -P string tpce Database password -c number 1000 Configured customer count -a number 1000 Active customer count -f number 500 # of customers for 1 TRTPS -d number 300 # of Days of Initial Trades -l number 1000 # of customers in one load unit -t number Duration of the test (seconds) -r number Duration of ramp up period (seconds) -u number # of Users Error: Unrecognized option: h
$ bin/EGenSimpleTest -S northwood -d 30 -t 180 -r 60 -u 8 EGen v1.6.0 (for MySQL) (Prepared Statement) Using the following settings: Input files location: flat_in Database server: northwood Database name: tpce Database user: tpce Database password: tpce Configured customer count: 1000 Active customer count: 1000 Scale Factor: 500 #Days of initial trades: 30 Load unit size: 1000 Test duration (sec): 180 Ramp up duration (sec): 60 # of Users: 8 Waiting for Trade-Cleanup transaction finished... ... done Start measuring. | [MEE] | [DM] | [CE] | sec. | TR, MF | DM | BV, CP, MW, SD, TL, TO, TS, TU | MEEThreads, ReqQueue (1st line: count, 2nd line: 90%ile response [msec.]) 10 | 1, 0, 1, 0, 1, 5, 2, 1, 1, 2, 0 | 30, 0 450, 0, 170, 0, 810, -1, 360, -1, 450, -1, 0 20 | 0, 0, 0, 0, 0, 2, 1, 0, 1, 4, 0 | 30, 0 0, 0, 0, 0, 0, 5870, 740, 0, 460, -1, 0 ... 180 | 3, 0, 0, 3, 7, 8, 10, 2, 6, 13, 3 | 30, 0 580, 0, 0, 10, 390, -1, 220, -1, 850, 2100, -1 Stopping all threads... [Histograms] === Trade-Result === 90%ile : 960 msec. max : 1220 msec. 0, 0 10, 0 20, 0 30, 1 ... [TradeResult(TR) transaction] Succeed: 35 Lated: 0 Retried: 0 Failed: 0 0.194444 TpsE
TPC-Eは普通のPCで試すと毎秒1トランザクションにも達しないという、とても厳しいテストです。もう少し高性能なサーバで試してみないとなんとも言えないのですが、スロークエリログには例えば以下のようなクエリが出力されています。
「ある顧客が注目している証券一覧について、指定日の時価総額と最終取引時の時価総額を表示する」というクエリ。巨大なテーブルにランダムアクセスした上で集計を行う処理です。
SELECT COALESCE(SUM(s_num_out * dm_close), 0), COALESCE(SUM(s_num_out * lt_price), 0) FROM watch_item, watch_list, last_trade, security, daily_market WHERE wl_c_id = N AND wi_wl_id = wl_id AND dm_s_symb = wi_s_symb AND dm_date = 'S' AND lt_s_symb = dm_s_symb AND s_symb = dm_s_symb;
「ある顧客アカウントについて、最新50件の取引履歴を表示する」というクエリ。巨大なテーブルをインデックスで引っ掛けたあと、テーブル結合を4回、さらにソートしたうえでLIMIT句で絞り込みをかける処理です。
SELECT t_id, DATE_FORMAT(t_dts, '%Y-%m-%d %H:%i:%s.%f'), st_name, tt_name, t_s_symb, t_qty, t_exec_name, t_chrg, s_name, ex_name FROM trade, status_type FORCE INDEX(PRIMARY), trade_type FORCE INDEX(PRIMARY), security, exchange WHERE t_ca_id = N AND st_id = t_st_id AND tt_id = t_tt_id AND s_symb = t_s_symb AND ex_id = s_ex_id ORDER BY t_dts DESC LIMIT 50
実は、これまでご紹介したTPC-B/Cにはこのような集計、ソートを伴うクエリはありませんでした。今後はTPC-Eも利用することによって、これまでとは違ったノウハウが得られるのではないかと思います。
DBT-5
- 対応RDBMS:PostgreSQL
- 対応OS:Linuxなど
- 言語:C++
- 作者:OSDL(現在のThe Linux Foundation)
- ライセンス:The Artistic License (EGen部分を除く)
- トランザクション仕様:TPC-Eベース
- URL:http://sourceforge.net/projects/osdldbt/
DBT-5はOSDL(Open Source Development Labs)が開発したTPC-Eの実装です。PostgreSQLをターゲットとしています。OSDLではこれまでDBT-1(TPC-Wベース)、DBT-2(TPC-Cベース)、DBT-3(TPC-Hベース)、DBT-4(TPC-Appベース)とTPCの実装を行ってきており、DBT-5が現時点で最も新しいプロダクトとなります。
DBT-5の最初のバージョンは2006年ごろに開発が行われ、その後2007年にPostgreSQLのカンファレンスであるPGCon 2007でお披露目されました。
ただ、当時のバージョンはTPC-Eのドラフト版をもとに開発されていたこともあり、まだ完成品と呼べるものではありませんでした。それが今年の1月から一気に開発が進み、つい先日、4月4日にバージョン0.1.0がリリースされたところです。
ソースを読んだところ、DBT-5ではトランザクション部分がPostgreSQLの拡張モジュールとして実装されていました。おそらく性能を稼ぐためにPL/pgSQLを使っていないのだと思いますが、業務ロジックをCの拡張モジュールで作るとはなかなか大胆なことをするなあという印象です。少なくとも他のDBMSへの移植性はまったくないです。
OLTP-2
- 対応RDBMS:Microsoft SQL Server
- 対応OS:Microsoft Windows
- 作者:富士通テクノロジー・ソリューションズ
- トランザクション仕様:TPC-Eベース
- URL:http://primeserver.fujitsu.com/primergy/performance/
OLTP-2はドイツの富士通テクノロジー・ソリューションズ社によって開発されたTPC-Eの実装です。富士通のPRIMERGYサーバの性能測定に用いられているものですが、ソフトウェア自体は公開されていません。OLTP-2の概要は以下の資料で確認することができます。
- OLTP-2 ベンチマーク解説 (PDF)
OLTP-2に限りませんが、商用ベンダによるTPC-Eの実装は現在のところすべてWindows+SQL Serverの構成をとっているようです。実際にTPC-Eの公式スコアを見ても、公開されているのはこの構成における結果のみとなっています。私は、TPC-EにはOracleやDB2が苦手とする何らかの処理が巧妙に組み込まれているのではないかと考えているのですが、具体的なところはまだ分かっていません。