BenchBase (formerly OLTPBench) is a Multi-DBMS SQL Benchmarking Framework via JDBC.
Table of Contents
To clone and build BenchBase using the postgres
profile,
git clone --depth 1 https://github.com/cmu-db/benchbase.git
cd benchbase
./mvnw clean package -P postgres
This produces artifacts in the target
folder, which can be extracted,
cd target
tar xvzf benchbase-postgres.tgz
cd benchbase-postgres
Inside this folder, you can run BenchBase. For example, to execute the tpcc
benchmark,
java -jar benchbase.jar -b tpcc -c config/postgres/sample_tpcc_config.xml --create=true --load=true --execute=true
A full list of options can be displayed,
java -jar benchbase.jar -h
Benchmarking is incredibly useful, yet endlessly painful. This benchmark suite is the result of a group of PhDs/post-docs/professors getting together and combining their workloads/frameworks/experiences/efforts. We hope this will save other people's time, and will provide an extensible platform, that can be grown in an open-source fashion.
BenchBase is a multi-threaded load generator. The framework is designed to be able to produce variable rate, variable mixture load against any JDBC-enabled relational database. The framework also provides data collection features, e.g., per-transaction-type latency and throughput logs.
The BenchBase framework has the following benchmarks:
This framework is design to allow for easy extension. We provide stub code that a contributor can use to include a new benchmark, leveraging all the system features (logging, controlled speed, controlled mixture, etc.)
Run the following command to build the distribution for a given database specified as the profile name (-P
). The following profiles are currently supported: postgres
, mysql
, mariadb
, sqlite
, cockroachdb
, phoenix
, and spanner
.
./mvnw clean package -P <profile name>
The following files will be placed in the ./target
folder:
benchbase-<profile name>.tgz
benchbase-<profile name>.zip
Once you build and unpack the distribution, you can run benchbase
just like any other executable jar. The following examples assume you are running from the root of the expanded .zip
or .tgz
distribution. If you attempt to run benchbase
outside of the distribution structure you may encounter a variety of errors including java.lang.NoClassDefFoundError
.
To bring up help contents:
java -jar benchbase.jar -h
To execute the tpcc
benchmark:
java -jar benchbase.jar -b tpcc -c config/postgres/sample_tpcc_config.xml --create=true --load=true --execute=true
For composite benchmarks like chbenchmark
, which require multiple schemas to be created and loaded, you can provide a comma separated list:
java -jar benchbase.jar -b tpcc,chbenchmark -c config/postgres/sample_chbenchmark_config.xml --create=true --load=true --execute=true
The following options are provided:
usage: benchbase
-b,--bench <arg> [required] Benchmark class. Currently
supported: [tpcc, tpch, tatp, wikipedia,
resourcestresser, twitter, epinions, ycsb,
seats, auctionmark, chbenchmark, voter,
sibench, noop, smallbank, hyadapt,
otmetrics, templated]
-c,--config <arg> [required] Workload configuration file
--clear <arg> Clear all records in the database for this
benchmark
--create <arg> Initialize the database for this benchmark
-d,--directory <arg> Base directory for the result files,
default is current directory
--dialects-export <arg> Export benchmark SQL to a dialects file
--execute <arg> Execute the benchmark workload
-h,--help Print this help
-im,--interval-monitor <arg> Throughput Monitoring Interval in
milliseconds
-jh,--json-histograms <arg> Export histograms to JSON file
--load <arg> Load data using the benchmark's data
loader
-s,--sample <arg> Sampling window
Instead of first building, packaging and extracting before running benchbase, it is possible to execute benchmarks directly against the source code using Maven. Once you have the project cloned you can run any benchmark from the root project directory using the Maven exec:java
goal. For example, the following command executes the tpcc
benchmark against postgres
:
mvn clean compile exec:java -P postgres -Dexec.args="-b tpcc -c config/postgres/sample_tpcc_config.xml --create=true --load=true --execute=true"
this is equivalent to the steps above but eliminates the need to first package and then extract the distribution.
To enable logging, e.g., for the PostgreSQL JDBC driver, add the following JVM property when starting...
-Djava.util.logging.config.file=src/main/resources/logging.properties
To modify the logging level you can update logging.properties
and/or log4j.properties
.
./mvnw -B release:prepare
./mvnw -B release:perform
Build or pull a dev image to help building from source:
./docker/benchbase/build-dev-image.sh
./docker/benchbase/run-dev-image.sh
or
docker run -it --rm --pull \
-v /path/to/benchbase-source:/benchbase \
-v $HOME/.m2:/home/containeruser/.m2 \
benchbase.azure.cr.io/benchbase-dev
Build the full image:
# build an image with all profiles
./docker/benchbase/build-full-image.sh
# or if you only want to build some of them
BENCHBASE_PROFILES='postgres mysql' ./docker/benchbase/build-full-image.sh
Run the image for a given profile:
BENCHBASE_PROFILE='postgres' ./docker/benchbase/run-full-image.sh --help # or other benchbase args as before
or
docker run -it --rm --env BENCHBASE_PROFILE='postgres' \
-v results:/benchbase/results benchbase.azurecr.io/benchbase --help # or other benchbase args as before
See the docker/benchbase/README.md for further details.
Github Codespaces and VSCode devcontainer support is also available.
Please see the existing MySQL and PostgreSQL code for an example.
We welcome all contributions! Please open a pull request. Common contributions may include:
Please see the CONTRIBUTING.md for addition notes.
Please use GitHub's issue tracker for all issues.
BenchBase is the official modernized version of the original OLTPBench.
The original OLTPBench code was largely written by the authors of the original paper, OLTP-Bench: An Extensible Testbed for Benchmarking Relational Databases, D. E. Difallah, A. Pavlo, C. Curino, and P. Cudré-Mauroux. In VLDB 2014. Please see the citation guide below.
A significant portion of the modernization was contributed by Tim Veil @ Cockroach Labs, including but not limited to:
lib
directory and dependencies..java
files to standard Maven resources
directory..tgz
or .zip
with an executable .jar
.resources
from inside .jar
instead of directory.try-with-resources
for all java.lang.AutoCloseable
instances.printStackTrace()
or System.out.println
in favor of proper logging.assert
.commit()
during Loader
operations.Worker
and Loader
usage of Connection
objects and cleaned up transaction handling.Catalog
that can be populated directly from the configured Benchmark database. The old catalog was proxied through HSQLDB
-- this remains an option for DBMSes that may have incomplete catalog support.If you use this repository in an academic paper, please cite this repository:
D. E. Difallah, A. Pavlo, C. Curino, and P. Cudré-Mauroux, "OLTP-Bench: An Extensible Testbed for Benchmarking Relational Databases," PVLDB, vol. 7, iss. 4, pp. 277-288, 2013.
The BibTeX is provided below for convenience.
@article{DifallahPCC13,
author = {Djellel Eddine Difallah and Andrew Pavlo and Carlo Curino and Philippe Cudr{\'e}-Mauroux},
title = {OLTP-Bench: An Extensible Testbed for Benchmarking Relational Databases},
journal = {PVLDB},
volume = {7},
number = {4},
year = {2013},
pages = {277--288},
url = {http://www.vldb.org/pvldb/vol7/p277-difallah.pdf},
}