TPC-C、TPC-Hワークロードを各種DBMSに対して実行できるベンチマークソフト「HammerDB」
HammerDBは、フリーでOSSなDBMSベンチマークソフトです。
各DB専用に用意されたベンチマークソフトではなく、同じ条件(同じソフト)で負荷をかけて性能を見たいときに重宝してます。
Windows版もLinux版も用意されていて、GUIで操作できる敷居の低さも魅力の1つですね。
ただし、自動化したい、ってなるとGUIは逆にじゃまになってしまいますが、このHammerDBは、CLIも同梱しています。
しかし、CLI関連情報は、公式(英語)以外で紹介している記事がちょっと少ない。。。
そのため、こちらを使った最小限の環境構築手順と、実際にベンチマークを行うまでの手順をまとめておきたいと思います。
なお、他のベンチマークソフトも同様ですが、TPCルールに厳密に準拠しているわけではないので、このツールで出したスコアを公表値として使ってはいけません。
TPC-CとTPC-Hについての細かい説明は省略します。ご存知でない方は、それぞれTPC-C=OLTP、TPC-H=OLAPのワークロード、とだけ覚えておいて貰えればよいかと。
複雑度としては、MySQLでよく使われるSysbench<PostgreSQLでよく使われるpgBench≒TPC-B<TPC-Cという順でOLTPベンチマークがあり、別軸のOLAP系ベンチマークとしてTPC-Hがあります。
TPC本家 http://www.tpc.orgには、もっとたくさんのベンチマークがありますので、TPC-C/Hの厳密な定義の理解と合わせて読んでみてください、といっても英語でツライですが。
今回は環境構築までとし、続いて、MySQL、PostgreSQL、Oracleに対するTPH-C、TPC-Hの実行や、試験の自動化についても触れていきたいと思います。
Redisはどうしようかな。MS SQL Serverとdb2は全く解ってないので、余程の余裕が生まれない限り省略する予定です、あしからず。
CentOS7環境用意
VirtualBoxにMinimalのCentOS7イメージからOSをminimalでインストールするものとします。
例によって、firewalldとかselinuxとかは無効化してしまいます。
minimalインストールだとwgetすら入ってないので入れておきましょう。
# yum -y update # systemctl stop firewalld # systemctl disable firewalld # systemctl stop iptables # systemctl disable iptables # vi /etc/selinux/config SELINUX= enforcing -> disabled に変更 # yum -y install wget
EC2でREHLやAmazonLinuxイメージを使用しても構いません。むしろAWS上のDBに対して負荷をかけるときはそうしますね。
HammerDBのダウンロード&インストール
# wget https://jaist.dl.sourceforge.net/project/hammerdb/HammerDB/HammerDB-3.2/HammerDB-3.2-Linux.tar.gz
sourceforgeのダウンロードアイコンをクリックした後、色々リダイレクトしてからダウンロードが始まる仕組みなので、ホストマシン(Windows)のChromeでダウンロードした後、ダウンロード履歴からURLを確認しました。
もちろん、ホストマシンにダウンロードしたものをSCPなどで転送しても良いです。
# tar zxvf HammerDB-3.2-Linux.tar.gz # cd ./HammerDB-3.2 # ./hammerdbcli
これだけでHammerDBのCLIは起動する状態になりました。
なおLinuxでGUIが必要なときはREHL7以上にしないとglibcあたりでつまづきます。さらに、AWSだとLinuxGUI使えない?ので素直にWindowsServerで作りましょう。
あくまでCLI前提で進めますので、そのあたりについて多くは触れません。
各種DBへの接続用ドライバ
ドライバライブラリ確認コマンド実行
「librarycheck」を実行すると、セットアップ直後は以下のように表示されます。
エラーになっていないのは、Redisだけですね。
# cd HammerDB-3.2/ # ./hammerdbcli hammerdb>librarycheck Checking database library for Oracle Error: failed to load Oratcl - can't read "env(ORACLE_HOME)": no such variable Ensure that Oracle client libraries are installed and the location in the LD_LIBRARY_PATH environment variable Checking database library for MSSQLServer Error: failed to load tclodbc - couldn't load file "/root/HammerDB-3.2/lib/tclodbc2.5.2/libtclodbc2.5.so": libodbcinst.so.2: cannot open shared object file: No such file or directory Ensure that MSSQLServer client libraries are installed and the location in the LD_LIBRARY_PATH environment variable Checking database library for Db2 Error: failed to load db2tcl - couldn't load file "/root/HammerDB-3.2/lib/db2tcl2.0.0/libdb2tcl.so.0.0.1": libdb2.so.1: cannot open shared object file: No such file or directory Ensure that Db2 client libraries are installed and the location in the LD_LIBRARY_PATH environment variable Checking database library for MySQL Error: failed to load mysqltcl - couldn't load file "/root/HammerDB-3.2/lib/mysqltcl-3.052/libmysqltcl3.052.so": libmysqlclient.so.20: cannot open shared object file: No such file or directory Ensure that MySQL client libraries are installed and the location in the LD_LIBRARY_PATH environment variable Checking database library for PostgreSQL Error: failed to load Pgtcl - couldn't load file "/root/HammerDB-3.2/lib/pgtcl2.1.1/libpgtcl2.1.1.so": libpq.so.5: cannot open shared object file: No such file or directory Ensure that PostgreSQL client libraries are installed and the location in the LD_LIBRARY_PATH environment variable Checking database library for Redis Success ... loaded library redis for Redis
ドライバを組み込んでこのErrorを解消した状態にすれば、実際にベンチマークのワークロードを実行できるようになります。5. Verifying Client Librariesに、各DBMSへの接続に必要なライブラリの一覧と、雑に簡単にセットアップ方法が書いてあります。
しかし、これはで、必要になるたびにセットアップし直しては毎回躓いていたのです。なので今回、真面目に調べて記録に残しておこう、と。
MySQL
MySQLの場合、現時点の最新版であるHammerDB 3.2は、MySQL5.7を対象としているので、MySQL5.7のクライアントをインストールします
HammerDBのドキュメントには「Oracle用の説明に倣って LD_LIBRARY_PATH をホゲホゲ」って書いてありますが、yumでmysqlクライアントを仕込めばそれだけでOKです。
HammerDB 3.2が使っているlibmysqltcl3.052.soの依存ライブラリがlibmysqlclient.so.20(MySQL 5.7用)で生成されているため、MySQL 8.0(libmysqlclient.so.21)を入れても動きません。
もしかしたら、libmysqlclient.so.20の名前でlibmysqlclient.so.21にシンボリックリンクを張れば動くのかもしれませんが、試してません。
# wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm # yum -y localinstall mysql80-community-release-el7-3.noarch.rpm # yum -y install mysql-community-client.x86_64 --enablerepo=mysql57-community --disablerepo=mysql80-community
PostgreSQL
PostgreSQLの場合、PostgreSQL10.x系で準備します。これもlibpgtcl2.1.1.soがlibpq.so.5=postgreSQL10に依存しているため、PostgreSQL11版は厳しそうです。
epelも必要になりそうなので、一旦入れておきます。
# yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm # yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm # yum -y install postgresql10.x86_64
なお、Amazon Linux2だと、上記やり方では/etc/redhat-releaseのチェックで引っかかってしまうため、以下を実行します。
# yum install -y https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-latest-x86_64/postgresql10-libs-10.7-2PGDG.rhel7.x86_64.rpm # yum install -y https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-latest-x86_64/postgresql10-10.7-2PGDG.rhel7.x86_64.rpm
Oracle
Oracle Instant Clientを使用します。
Oracle Database Instant Clientのインストールに倣ってインストールします。
現時点では最新が19c用のものですので、以下コマンドでインストールします。MySQLやPostgreSQLのような、新しすぎてもダメ、ってことはなさそうです(今の所)。
yum install https://download.oracle.com/otn_software/linux/instantclient/193000/oracle-instantclient19.3-basic-19.3.0.0.0-1.x86_64.rpm
一式が、「/usr/lib/oracle/19.3/client64/lib」にインストールされるので、以下を実行するか、「~/.bash_profile」に以下を追加し、soruceコマンドで読み込んでおきます。
export ORACLE_HOME=/usr/lib/oracle/19.3/client64 export LD_LIBRARY_PATH=$ORACLE_HOME/lib export ORACLE_LIBRARY=$ORACLE_HOME/lib/libclntsh.so export PATH=$ORACLE_HOME/bin:$PATH
なお、SQL*Plus、SQL*Loader、DataPumpなどを入れておきたい場合は、以下も実行しておきます。
# yum install https://download.oracle.com/otn_software/linux/instantclient/193000/oracle-instantclient19.3-sqlplus-19.3.0.0.0-1.x86_64.rpm # yum install https://download.oracle.com/otn_software/linux/instantclient/193000/oracle-instantclient19.3-tools-19.3.0.0.0-1.x86_64.rpm
Oracle Client一式をOUIなどでインストールする場合、環境変数は違ったものになるかと思いますので、そちらに従ってください。
再びlibrarycheck
ここまでやると、先程のlibrarycheckは以下のようになります。
hammerdb>librarycheck Checking database library for Oracle Success ... loaded library Oratcl for Oracle Checking database library for MSSQLServer Error: failed to load tclodbc - couldn't load file "/root/HammerDB-3.2/lib/tclodbc2.5.2/libtclodbc2.5.so": libodbcinst.so.2: cannot open shared object file: No such file or directory Ensure that MSSQLServer client libraries are installed and the location in the LD_LIBRARY_PATH environment variable Checking database library for Db2 Error: failed to load db2tcl - couldn't load file "/root/HammerDB-3.2/lib/db2tcl2.0.0/libdb2tcl.so.0.0.1": libdb2.so.1: cannot open shared object file: No such file or directory Ensure that Db2 client libraries are installed and the location in the LD_LIBRARY_PATH environment variable Checking database library for MySQL Success ... loaded library mysqltcl for MySQL Checking database library for PostgreSQL Success ... loaded library Pgtcl for PostgreSQL Checking database library for Redis Success ... loaded library redis for Redis
MSSQLServerとDb2以外は「Success」になりました。
まとめ
- HammerDBは色々なDBにTPC-C/H相当の負荷をかけることができ、Windows/Linux両方に対応し、GUI/CLIが利用可能な、FreeでOpen SourceなSoftwareです。
- Linux版の場合、本体のtar.gzを展開+接続先DBに対応したクライアントをインストールすると使えるようになります。
- HammerDBのバージョンによって、対応しているDBクライアントのバージョンが決まっているので要注意です。
環境構築はココまでです。
次回からは、具体的に負荷をかけるための手順です。
HammerDBは紹介されていないけど、負荷試験に関する知識という点で、合わせて読みたいこの本を紹介しておきます。
Amazon Web Services負荷試験入門―クラウドの性能の引き出し方がわかる (Software Design plusシリーズ)
- 作者:仲川樽八,森下健
- 出版社/メーカー:技術評論社
- 発売日: 2017/09/23
- メディア:大型本
- この商品を含むブログを見る