Summary:
This diff includes an initial script running a set of benchmarks for
regression test. The script does the following things:
checkout the specified rocksdb commit (or origin/master as default)
make clean && DEBUG_LEVEL=0 make db_bench
setup test directories
run set of benchmarks and store results
Currently, the script will run couple benchmarks, store all the benchmark
output, extract micros per op and percentile information for each benchmark
and store them in a single SUMMARY.csv file. The SUMMARY.csv will make the
follow-up regression detection easier.
In addition, the current script only takes env arguments to set important
attributes of db_bench. Will follow-up with a patch that allows db_bench
to construct options from an options file.
Test Plan:
NUM_KEYS=100 ./tools/regression_test.sh
Sample SUMMARY.csv file:
commit id, benchmark, ms-per-op, p50, p75, p99, p99.9, p99.99
7e23ddf575890510e7d2fc7a79b31a1bbf317917, fillseq, 15.28, 54.66, 77.14, 5000.00, 17900.00, 18483.00
7e23ddf575890510e7d2fc7a79b31a1bbf317917, overwrite, 13.54, 57.69, 86.39, 3000.00, 15600.00, 17013.00
7e23ddf575890510e7d2fc7a79b31a1bbf317917, readrandom, 1.04, 0.80, 1.67, 293.33, 395.00, 504.00
7e23ddf575890510e7d2fc7a79b31a1bbf317917, readwhilewriting, 2.75, 1.01, 1.87, 200.00, 460.00, 485.00
7e23ddf575890510e7d2fc7a79b31a1bbf317917, deleterandom, 3.64, 48.12, 70.09, 200.00, 336.67, 347.00
7e23ddf575890510e7d2fc7a79b31a1bbf317917, seekrandom, 24.31, 391.87, 513.69, 872.73, 990.00, 1048.00
7e23ddf575890510e7d2fc7a79b31a1bbf317917, seekrandomwhilewriting, 14.02, 185.14, 294.15, 700.00, 1440.00, 1527.00
Reviewers: sdong, IslamAbdelRahman, kradhakrishnan, yiwu, andrewkr, gunnarku
Reviewed By: gunnarku
Subscribers: gunnarku, MarkCallaghan, andrewkr, dhruba, leveldb
Differential Revision: https://reviews.facebook.net/D57597
main
parent
e1951b6f28
commit
fca5aa6fcc
@ -0,0 +1,176 @@ |
||||
#!/bin/bash |
||||
# REQUIRE: db_bench binary exists in the current directory |
||||
|
||||
function main { |
||||
commit=${1:-"origin/master"} |
||||
test_root_dir=${2:-"/tmp/rocksdb/regression_test"} |
||||
|
||||
init_arguments |
||||
|
||||
checkout_rocksdb $commit |
||||
build_db_bench |
||||
setup_test_directory |
||||
|
||||
# an additional dot indicates we share same env variables |
||||
run_db_bench "fillseq" 0 |
||||
run_db_bench "overwrite" |
||||
run_db_bench "readrandom" |
||||
run_db_bench "readwhilewriting" |
||||
run_db_bench "deleterandom" |
||||
run_db_bench "seekrandom" |
||||
run_db_bench "seekrandomwhilewriting" |
||||
|
||||
echo "" |
||||
echo "Benchmark completed! Results are available in $RESULT_PATH" |
||||
} |
||||
|
||||
############################################################################ |
||||
function init_arguments { |
||||
K=1024 |
||||
M=$((1024 * K)) |
||||
G=$((1024 * M)) |
||||
|
||||
current_time=$(date +"%F-%H:%M:%S") |
||||
RESULT_PATH=${4:-"/tmp/rocksdb/regression/results/$current_time"} |
||||
COMMIT_ID=`git log | head -n1 | cut -c 8-` |
||||
SUMMARY_FILE="$RESULT_PATH/SUMMARY.csv" |
||||
|
||||
DB_PATH=${2:-"/tmp/rocksdb/regression/db/"} |
||||
WAL_PATH=${3:-"/tmp/rocksdb/regression/wal/"} |
||||
NUM_THREADS=${NUM_THREADS:-16} |
||||
NUM_KEYS=${NUM_KEYS:-$((1 * G))} |
||||
KEY_SIZE=${KEY_SIZE:-100} |
||||
VALUE_SIZE=${VALUE_SIZE:-900} |
||||
CACHE_SIZE=${CACHE_SIZE:-$((1 * G))} |
||||
STATISTICS=${STATISTICS:-0} |
||||
COMPRESSION_RATIO=${COMPRESSION_RATIO:-0.5} |
||||
HISTOGRAM=${HISTOGRAM:-1} |
||||
STATS_PER_INTERVAL=${STATS_PER_INTERVAL:-1} |
||||
STATS_INTERVAL_SECONDS=${STATS_INTERVAL_SECONDS:-60} |
||||
MAX_BACKGROUND_FLUSHES=${MAX_BACKGROUND_FLUSHES:-4} |
||||
MAX_BACKGROUND_COMPACTIONS=${MAX_BACKGROUND_COMPACTIONS:-16} |
||||
SEEK_NEXTS=${SEEK_NEXTS:-10} |
||||
SEED=${SEED:-$( date +%s )} |
||||
} |
||||
|
||||
# $1 --- benchmark name |
||||
# $2 --- use_existing_db (optional) |
||||
function run_db_bench { |
||||
USE_EXISTING_DB=${2:-1} |
||||
echo "" |
||||
echo "=======================================================================" |
||||
echo "Benchmark $1" |
||||
echo "=======================================================================" |
||||
echo "" |
||||
db_bench_error=0 |
||||
cmd="(./db_bench --benchmarks=$1 --db=$DB_PATH --wal_dir=$WAL_PATH \ |
||||
--use_existing_db=$USE_EXISTING_DB \ |
||||
--threads=$NUM_THREADS \ |
||||
--num=$NUM_KEYS \ |
||||
--key_size=$KEY_SIZE \ |
||||
--value_size=$VALUE_SIZE \ |
||||
--cache_size=$CACHE_SIZE \ |
||||
--statistics=$STATISTICS \ |
||||
--compression_ratio=$COMPRESSION_RATIO \ |
||||
--histogram=$HISTOGRAM \ |
||||
--seek_nexts=$SEEK_NEXTS \ |
||||
--stats_per_interval=$STATS_PER_INTERVAL \ |
||||
--stats_interval_seconds=$STATS_INTERVAL_SECONDS \ |
||||
--max_background_flushes=$MAX_BACKGROUND_FLUSHES \ |
||||
--max_background_compactions=$MAX_BACKGROUND_COMPACTIONS \ |
||||
--seed=$SEED \ |
||||
2>&1 || db_bench_error=1) | tee -a $RESULT_PATH/$1" |
||||
echo $cmd |
||||
eval $cmd |
||||
exit_on_error $db_bench_error |
||||
|
||||
update_report "$1" "$RESULT_PATH/$1" |
||||
} |
||||
|
||||
# $1 --- name of the benchmark |
||||
# $2 --- the filename of the output log of db_bench |
||||
function update_report { |
||||
main_result=`cat $2 | grep $1` |
||||
perc_statement=`cat $2 | grep Percentile` |
||||
|
||||
# Obtain micros / op |
||||
main_pattern="$1"'[[:blank:]]+:[[:blank:]]+([0-9\.]+)[[:blank:]]+micros/op' |
||||
[[ $main_result =~ $main_pattern ]] |
||||
micros_op=${BASH_REMATCH[1]} |
||||
|
||||
# Obtain percentile information |
||||
perc_pattern='Percentiles: P50: ([0-9\.]+) P75: ([0-9\.]+) P99: ([0-9\.]+) P99.9: ([0-9\.]+) P99.99: ([0-9\.]+)' |
||||
[[ $perc_statement =~ $perc_pattern ]] |
||||
|
||||
perc[0]=${BASH_REMATCH[1]} # p50 |
||||
perc[1]=${BASH_REMATCH[2]} # p75 |
||||
perc[2]=${BASH_REMATCH[3]} # p99 |
||||
perc[3]=${BASH_REMATCH[4]} # p99.9 |
||||
perc[4]=${BASH_REMATCH[5]} # p99.99 |
||||
|
||||
printf "$COMMIT_ID, %30s, %10.2f, %10.2f, %10.2f, %10.2f, %10.2f, %10.2f\n" \ |
||||
$1 $micros_op ${perc[0]} ${perc[1]} ${perc[2]} ${perc[3]} ${perc[4]} \ |
||||
>> $SUMMARY_FILE |
||||
exit_on_error $? |
||||
} |
||||
|
||||
function exit_on_error { |
||||
if [ $1 -ne 0 ]; then |
||||
echo "" |
||||
echo "ERROR: Benchmark did not complete successfully. " \ |
||||
"Partial results are output to $RESULT_PATH" |
||||
echo "ERROR" >> $SUMMARY_FILE |
||||
exit $1 |
||||
fi |
||||
} |
||||
|
||||
function checkout_rocksdb { |
||||
echo "Checking out commit $1 ..." |
||||
|
||||
git fetch --all |
||||
exit_on_error $? |
||||
|
||||
git checkout $1 |
||||
exit_on_error $? |
||||
} |
||||
|
||||
function build_db_bench { |
||||
echo "Building db_bench ..." |
||||
|
||||
make clean |
||||
exit_on_error $? |
||||
|
||||
DEBUG_LEVEL=0 make db_bench -j32 |
||||
exit_on_error $? |
||||
} |
||||
|
||||
function setup_test_directory { |
||||
echo "Deleting old regression test directories and creating new ones" |
||||
|
||||
rm -rf "$DB_PATH" |
||||
exit_on_error $? |
||||
|
||||
rm -rf "$WAL_PATH" |
||||
exit_on_error $? |
||||
|
||||
rm -rf "$RESULT_PATH" |
||||
exit_on_error $? |
||||
|
||||
mkdir -p "$DB_PATH" |
||||
exit_on_error $? |
||||
|
||||
mkdir -p "$WAL_PATH" |
||||
exit_on_error $? |
||||
|
||||
mkdir -p "$RESULT_PATH" |
||||
exit_on_error $? |
||||
|
||||
printf "%40s, %30s, %10s, %10s, %10s, %10s, %10s, %10s\n" \ |
||||
"commit id" "benchmark" "ms-per-op" "p50" "p75" "p99" "p99.9" "p99.99" \ |
||||
$micros_op ${perc[0]} ${perc[1]} ${perc[2]} ${perc[3]} ${perc[4]} \ |
||||
>> $SUMMARY_FILE |
||||
} |
||||
|
||||
############################################################################ |
||||
|
||||
main $@ |
||||
Loading…
Reference in new issue