Hatena::ブログ(Diary)

SH2の日記 RSSフィード

2010-05-10 データベース負荷テストツールまとめ(4) このエントリーを含むブックマーク

データベース負荷テストツールまとめの第4回です。

今回はTPC-Eベースのツールを見ていきたいと思います。

TPC-Eとは

TPC-EはRDBMSベンチマーク仕様の一つで、オンライントランザクション(OLTP)の性能を測定するものです。証券会社の業務をモデルとして取引や市場の監視、メンテナンス処理を行い、1秒あたりに行った取引件数を性能の指標値とします。

f:id:sh2:20100509231739p:image

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つだけで、ごく単純な作りとなっています。

f:id:sh2:20100505231930p:image

TPC-Bのモデルです。pgbench、mysqlbenchが採用しているものです。ただし、これら二つのツールでは図にあるような参照整合性制約は付与されていません。理解しやすいように後付けしました。

f:id:sh2:20100505231931p:image

TPC-Cのモデルです。tpcc-mysql、DBT-2が採用しているものです。stockテーブルが正規化されていませんが、これは仕様通りです。おそらく意図的なものだと思います。

f:id:sh2:20100505231929p:image

そしてこれがTPC-Eのモデルです。tpcemysqlが採用しているものです。正直ベンチマークのためだけにここまで作り込むのか、といった印象です。

f:id:sh2:20100505160259p:image

tpcemysql (Percona BenchWork)

tpcemysqlはMySQLのコンサル会社であるPercona Inc.によって開発されたベンチマークツールです。Percona製ベンチマークツールは第2回でtpcc-mysqlをご紹介したところですが、それからしばらく見ないうちに各種ツールをまとめたセットがPercona BenchWorkとして提供されるようになっていました。セットアップにBazaarがいらなくなっているので、比較的気軽に試すことができます。

ライセンスが独自となっていますが、これはTPCが提供するプログラムを組み込んでいるためです。TPC-EはEGenLoaderと呼ばれるテストデータ生成プログラム、EGenDriverと呼ばれるクライアントシミュレータ、それからEGenTxnHarnessと呼ばれるDBMSインタフェースプログラムを組み込んでテストを行うことが義務付けられています。要するに乱数の発生を偏らせたり、複数の処理をマージするような不正ができないようになっているのです。一般的なオープンソースソフトウェアとは扱いが異なりますので、二次利用される場合はライセンス違反とならないように注意してください。TPC-Eの構成図を以下に示します。

f:id:sh2:20100509151656p:image

簡単に使い方を説明しておきます。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

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

OLTP-2はドイツ富士通テクノロジー・ソリューションズ社によって開発されたTPC-Eの実装です。富士通PRIMERGYサーバの性能測定に用いられているものですが、ソフトウェア自体は公開されていません。OLTP-2の概要は以下の資料で確認することができます。

OLTP-2に限りませんが、商用ベンダによるTPC-Eの実装は現在のところすべてWindowsSQL Serverの構成をとっているようです。実際にTPC-Eの公式スコアを見ても、公開されているのはこの構成における結果のみとなっています。私は、TPC-EにはOracleDB2が苦手とする何らかの処理が巧妙に組み込まれているのではないかと考えているのですが、具体的なところはまだ分かっていません。

続きます

というわけで第4回はTPC-Eベースの負荷テストツールを確認しました。TPC-Eは仕様書が291ページもあってこれまで実装にチャレンジする人がなかなかいなかったのですが、最近になってようやく動くものがでてきたところです。これからの動向にも注目していきたいと思います。

これでTPC関連はひととおり紹介し終えたので、次からはTPC以外の負荷テストツールを確認していきます。まだまだ続きますので、引き続きよろしくお願いいたします。

Connection: close