osd: erasure code benchmark workunit

Display benchmark results for the default erasure code plugins, in a tab
separated CSV file. The first two column contain the amount of KB
that were coded or decoded, for a given combination of parameters
displayed in the following fields.

seconds	KB	plugin	k	m	work.	iter.	size	eras.
1.2	10	example	2	1	encode	10	1024	0
0.5	10	example	2	1	decode	10	1024	1

It can be used as input for a human readable report. It is also intented
to be used to show if a given version of an erasure code plugin performs
better than another.

The last column ( not shown above for brievety ) is the exact command
that was run to produce the result so it can be copy / pasted to
reproduce them or to profile.

Only the jerasure techniques mentionned in
https://www.usenix.org/legacy/events/fast09/tech/full_papers/plank/plank_html/
are benchmarked, the others are assumed to be less interesting.

Signed-off-by: Loic Dachary <loic@dachary.org>
This commit is contained in:
Loic Dachary 2013-12-12 23:14:02 +01:00
parent a619fe9869
commit 81dee1b67f

View File

@ -0,0 +1,235 @@
#!/bin/bash
#
# Copyright (C) 2013 Cloudwatt <libre.licensing@cloudwatt.com>
#
# Author: Loic Dachary <loic@dachary.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Library Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Library Public License for more details.
#
set -e
export PATH=/sbin:$PATH
: ${VERBOSE:=false}
: ${CEPH_ERASURE_CODE_BENCHMARK:=ceph_erasure_code_benchmark}
: ${PLUGIN_DIRECTORY:=/usr/lib/ceph/erasure-code}
: ${PLUGINS:=example jerasure}
: ${ITERATIONS:=1024}
: ${SIZE:=1048576}
function bench_header() {
echo -e "seconds\tKB\tplugin\tk\tm\twork.\titer.\tsize\teras.\tcommand."
}
function bench() {
local plugin=$1
shift
local k=$1
shift
local m=$1
shift
local workload=$1
shift
local iterations=$1
shift
local size=$1
shift
local erasures=$1
shift
command=$(echo $CEPH_ERASURE_CODE_BENCHMARK \
--plugin $plugin \
--workload $workload \
--iterations $iterations \
--size $size \
--erasures $erasures \
--parameter erasure-code-k=$k \
--parameter erasure-code-m=$m \
--parameter erasure-code-directory=$PLUGIN_DIRECTORY)
result=$($command "$@")
echo -e "$result\t$plugin\t$k\t$m\t$workload\t$iterations\t$size\t$erasures\t$command ""$@"
}
function example_test() {
local plugin=example
bench $plugin 2 1 encode $ITERATIONS $SIZE 0
bench $plugin 2 1 decode $ITERATIONS $SIZE 1
}
#
# The results are expected to be consistent with
# https://www.usenix.org/legacy/events/fast09/tech/full_papers/plank/plank_html/
#
function jerasure_test() {
local plugin=jerasure
for technique in reed_sol_van ; do
for k in 4 6 10 ; do
for m in $(seq 1 4) ; do
bench $plugin $k $m encode $ITERATIONS $SIZE 0 \
--parameter erasure-code-technique=$technique
for erasures in $(seq 1 $m) ; do
bench $plugin $k $m decode $ITERATIONS $SIZE $erasures \
--parameter erasure-code-technique=$technique
done
done
done
done
for technique in cauchy_orig cauchy_good ; do
for packetsize in $(seq 512 512 4096) ; do
for k in 4 6 10 ; do
for m in $(seq 1 4) ; do
bench $plugin $k $m encode $ITERATIONS $SIZE 0 \
--parameter erasure-code-packetsize=$packetsize \
--parameter erasure-code-technique=$technique
for erasures in $(seq 1 $m) ; do
bench $plugin $k $m decode $ITERATIONS $SIZE $erasures \
--parameter erasure-code-packetsize=$packetsize \
--parameter erasure-code-technique=$technique
done
done
done
done
done
}
function main() {
bench_header
for plugin in ${PLUGINS} ; do
${plugin}_test || return 1
done
}
if [ "$1" = TEST ]
then
set -x
set -o functrace
PS4=' ${FUNCNAME[0]}: $LINENO: '
ITERATIONS=1
SIZE=1024
function run_test() {
dir=/tmp/erasure-code
rm -fr $dir
mkdir $dir
expected=$(cat <<EOF
plugin k m work. iter. size eras.
example 2 1 encode 1 1024 0
example 2 1 decode 1 1024 1
jerasure 2 1 encode 1 1024 0
jerasure 2 1 decode 1 1024 1
jerasure 2 2 encode 1 1024 0
jerasure 2 2 decode 1 1024 1
jerasure 2 2 decode 1 1024 2
jerasure 2 1 encode 1 1024 0
jerasure 2 1 decode 1 1024 1
jerasure 2 2 encode 1 1024 0
jerasure 2 2 decode 1 1024 1
jerasure 2 2 decode 1 1024 2
jerasure 2 1 encode 1 1024 0
jerasure 2 1 decode 1 1024 1
jerasure 2 2 encode 1 1024 0
jerasure 2 2 decode 1 1024 1
jerasure 2 2 decode 1 1024 2
jerasure 2 1 encode 1 1024 0
jerasure 2 1 decode 1 1024 1
jerasure 2 2 encode 1 1024 0
jerasure 2 2 decode 1 1024 1
jerasure 2 2 decode 1 1024 2
jerasure 2 1 encode 1 1024 0
jerasure 2 1 decode 1 1024 1
jerasure 2 2 encode 1 1024 0
jerasure 2 2 decode 1 1024 1
jerasure 2 2 decode 1 1024 2
jerasure 2 1 encode 1 1024 0
jerasure 2 1 decode 1 1024 1
jerasure 2 2 encode 1 1024 0
jerasure 2 2 decode 1 1024 1
jerasure 2 2 decode 1 1024 2
jerasure 2 1 encode 1 1024 0
jerasure 2 1 decode 1 1024 1
jerasure 2 2 encode 1 1024 0
jerasure 2 2 decode 1 1024 1
jerasure 2 2 decode 1 1024 2
jerasure 6 3 encode 1 1024 0
jerasure 6 3 decode 1 1024 1
jerasure 6 3 decode 1 1024 2
jerasure 6 3 decode 1 1024 3
jerasure 6 4 encode 1 1024 0
jerasure 6 4 decode 1 1024 1
jerasure 6 4 decode 1 1024 2
jerasure 6 4 decode 1 1024 3
jerasure 6 4 decode 1 1024 4
jerasure 10 3 encode 1 1024 0
jerasure 10 3 decode 1 1024 1
jerasure 10 3 decode 1 1024 2
jerasure 10 3 decode 1 1024 3
jerasure 10 4 encode 1 1024 0
jerasure 10 4 decode 1 1024 1
jerasure 10 4 decode 1 1024 2
jerasure 10 4 decode 1 1024 3
jerasure 10 4 decode 1 1024 4
jerasure 6 3 encode 1 1024 0
jerasure 6 3 decode 1 1024 1
jerasure 6 3 decode 1 1024 2
jerasure 6 3 decode 1 1024 3
jerasure 6 4 encode 1 1024 0
jerasure 6 4 decode 1 1024 1
jerasure 6 4 decode 1 1024 2
jerasure 6 4 decode 1 1024 3
jerasure 6 4 decode 1 1024 4
jerasure 10 3 encode 1 1024 0
jerasure 10 3 decode 1 1024 1
jerasure 10 3 decode 1 1024 2
jerasure 10 3 decode 1 1024 3
jerasure 10 4 encode 1 1024 0
jerasure 10 4 decode 1 1024 1
jerasure 10 4 decode 1 1024 2
jerasure 10 4 decode 1 1024 3
jerasure 10 4 decode 1 1024 4
jerasure 6 3 encode 1 1024 0
jerasure 6 3 decode 1 1024 1
jerasure 6 3 decode 1 1024 2
jerasure 6 3 decode 1 1024 3
jerasure 6 4 encode 1 1024 0
jerasure 6 4 decode 1 1024 1
jerasure 6 4 decode 1 1024 2
jerasure 6 4 decode 1 1024 3
jerasure 6 4 decode 1 1024 4
jerasure 10 3 encode 1 1024 0
jerasure 10 3 decode 1 1024 1
jerasure 10 3 decode 1 1024 2
jerasure 10 3 decode 1 1024 3
jerasure 10 4 encode 1 1024 0
jerasure 10 4 decode 1 1024 1
jerasure 10 4 decode 1 1024 2
jerasure 10 4 decode 1 1024 3
jerasure 10 4 decode 1 1024 4
EOF
)
test "$(main | cut --fields=3-9 )" = "$expected" || return 1
}
run_test
else
main
fi
# Local Variables:
# compile-command: "\
# CEPH_ERASURE_CODE_BENCHMARK=../../../src/ceph_erasure_code_benchmark \
# PLUGIN_DIRECTORY=../../../src/.libs \
# ./bench.sh TEST
# "
# End: