From: "Oleg Piskunov" <o.piskunov@tarantool.org> To: tarantool-patches@dev.tarantool.org Cc: "Oleg Piskunov" <o.piskunov@tarantool.org> Subject: [Tarantool-patches] [PATCH v2] bench-run: submit perf results into database Date: Wed, 29 Apr 2020 14:23:46 +0300 [thread overview] Message-ID: <1588159426.603065637@f436.i.mail.ru> (raw) [-- Attachment #1: Type: text/plain, Size: 19770 bytes --] Resurrect bench.tarantool.org: - submit perf results into bench.tarantool.org database - refactoring bench running scripts Fix docker files for perf testing: - adding python "requests" module needed for publish script. Closes #4865 Github: https://github.com/tarantool/bench-run/tree/opiskunov/gh-4865-submit-perf-results Issue: https://github.com/tarantool/tarantool/issues/4865 --- benchs/cbench/run.sh | 60 +++++++++++++++++++++++++++++----------- benchs/linkbench/run.sh | 26 ++++++++++++------ benchs/nosqlbench/run.sh | 46 +++++++++++++------------------ benchs/publication/publish.py | 64 +++++++++++++++++++++++++++++++++++++++++++ benchs/sysbench/run.sh | 52 ++++++++++++++--------------------- benchs/tpcc/run.sh | 38 ++++++++++++++----------- benchs/ycsb/run.sh | 42 ++++++++++++++++------------ dockerfiles/ubuntu_benchs | 3 ++ 8 files changed, 216 insertions(+), 115 deletions(-) create mode 100755 benchs/publication/publish.py diff --git a/benchs/cbench/run.sh b/benchs/cbench/run.sh index 4d07972..77b88e7 100755 --- a/benchs/cbench/run.sh +++ b/benchs/cbench/run.sh @@ -1,36 +1,64 @@ #!/usr/bin/env bash -kill `pidof tarantool` -set -e +set -eu set -o pipefail TAR_VER=$(tarantool -v | grep -e "Tarantool" | grep -oP '\s\K\S*') -echo ${TAR_VER} | tee cbench_t_version.txt +numaopts="numactl --membind=1 --cpunodebind=1 --physcpubind=11" +cbench_opts=500 killall tarantool 2>/dev/null || true rm -rf 5* 0* -sync +sync && echo "sync passed" || echo "sync failed with error" $? echo 3 > /proc/sys/vm/drop_caches -numactl --membind=1 --cpunodebind=1 --physcpubind=9 tarantool /opt/cbench/cbench_runner.lua memtx 2>&1 | tee cbench_output_memtx.txt +$numaopts tarantool /opt/cbench/cbench_runner.lua memtx 2>&1 | tee cbench_output_memtx.txt killall tarantool 2>/dev/null || true rm -rf 5* 0* -sync +sync && echo "sync passed" || echo "sync failed with error" $? echo 3 > /proc/sys/vm/drop_caches -numactl --membind=1 --cpunodebind=1 --physcpubind=10 tarantool /opt/cbench/cbench_runner.lua vinyl fsync 500 2>&1 | tee cbench_output_vinyl_fsync.txt +$numaopts tarantool /opt/cbench/cbench_runner.lua vinyl fsync $cbench_opts 2>&1 | tee cbench_output_vinyl_fsync.txt killall tarantool 2>/dev/null || true rm -rf 5* 0* -sync +sync && echo "sync passed" || echo "sync failed with error" $? echo 3 > /proc/sys/vm/drop_caches -numactl --membind=1 --cpunodebind=1 --physcpubind=11 tarantool /opt/cbench/cbench_runner.lua vinyl write 500 2>&1 | tee cbench_output_memtx_write.txt - -grep "^?tab" cbench_output_memtx.txt | sed "s/.*name=//"| sed "s/¶m=/:/"| sed "s/cb\./cb\.memtx\./"| tee -a cbench_result.txt -grep "^?tab" cbench_output_vinyl_fsync.txt | sed "s/.*name=//"| sed "s/¶m=/:/"| sed "s/cb\./cb\.vinyl\.fsync\./"| tee -a cbench_result.txt -grep "^?tab" cbench_output_memtx_write.txt | sed "s/.*name=//"| sed "s/¶m=/:/"| sed "s/cb\./cb\.vinyl\.write\./"| tee -a cbench_result.txt +$numaopts tarantool /opt/cbench/cbench_runner.lua vinyl write $cbench_opts 2>&1 | tee cbench_output_vinyl_write.txt -#mv tarantool-server.log cbench_tarantool_server.log +grep "^?tab=cbench.tree" cbench_output_memtx.txt | \ + sed "s/.*name=//"| sed "s/¶m=/:/"| sed "s/cb\./cb\.memtx\./"| \ + tee -a cbench-memtx-tree_result.txt +grep "^?tab=cbench.hash" cbench_output_memtx.txt | \ + sed "s/.*name=//"| sed "s/¶m=/:/"| sed "s/cb\./cb\.memtx\./"| \ + tee -a cbench-memtx-hash_result.txt +grep "^?tab" cbench_output_vinyl_fsync.txt | \ + sed "s/.*name=//"| sed "s/¶m=/:/"| sed "s/cb\./cb\.vinyl\.fsync\./"| \ + tee -a cbench-vinyl-fsync_result.txt +grep "^?tab" cbench_output_vinyl_write.txt | \ + sed "s/.*name=//"| sed "s/¶m=/:/"| sed "s/cb\./cb\.vinyl\.write\./"| \ + tee -a cbench-vinyl-write_result.txt -echo "RESULTS:" -cat cbench_result.txt +echo ${TAR_VER} | tee cbench-memtx-tree_t_version.txt +echo ${TAR_VER} | tee cbench-memtx-hash_t_version.txt +echo ${TAR_VER} | tee cbench-vinyl-fsync_t_version.txt +echo ${TAR_VER} | tee cbench-vinyl-write_t_version.txt +echo ${TAR_VER} | tee cbench_t_version.txt +echo "Tarantool TAG:" +cat cbench_t_version.txt +echo "Overall results:" +echo "================" +echo "RESULTS (cbench-memtx-tree_result.txt):" +cat cbench-memtx-tree_result.txt +echo " " +echo "RESULTS (cbench-memtx-hash_result.txt):" +cat cbench-memtx-hash_result.txt +echo " " +echo "RESULTS (cbench-vinyl-fsync_result.txt):" +cat cbench-vinyl-fsync_result.txt +echo " " +echo "RESULTS (cbench-vinyl-write_result.txt):" +cat cbench-vinyl-write_result.txt +echo " " +echo "Publish data to bench database" +/opt/bench-run/benchs/publication/publish.py diff --git a/benchs/linkbench/run.sh b/benchs/linkbench/run.sh index 6738436..aac7d3c 100755 --- a/benchs/linkbench/run.sh +++ b/benchs/linkbench/run.sh @@ -1,19 +1,16 @@ #!/usr/bin/env bash -kill `pidof tarantool` - -set -e +set -eu set -o pipefail TAR_VER=$(tarantool -v | grep -e "Tarantool" | grep -oP '\s\K\S*') -echo ${TAR_VER} | tee linkbench_t_version.txt +numaopts="numactl --membind=1 --cpunodebind=1 --physcpubind=6,7,8,9,10,11" +base_dir=$(pwd) cd /opt/linkbench && mvn clean package -Dmaven.test.skip=true cd src/tarantool && make cd - -numaopts="numactl --membind=1 --cpunodebind=1 --physcpubind=6,7,8,9,10,11" - # use always newly created path specialy mounted if needed wpath=/builds/ws rm -rf $wpath @@ -30,8 +27,21 @@ sed "s/^maxid1 = .*/maxid1 = 5000000/g" -i /opt/linkbench/config/FBWorkload.prop sed "s/^requesters = .*/requesters = 1/g" -i $cfgfile sed "s/^requests = .*/requests = 2000000/g" -i $cfgfile $numaopts /opt/linkbench/bin/linkbench -c $cfgfile -l 2>&1 | tee loading.res.txt -sync + +sync && echo "sync passed" || echo "sync failed with error" $? echo 3 > /proc/sys/vm/drop_caches $numaopts /opt/linkbench/bin/linkbench -c $cfgfile -r 2>&1 | tee linkbench_output.txt -grep "REQUEST PHASE COMPLETED" linkbench_output.txt | sed "s/.*second = /linkbench:/" | tee -a linkbench_result.txt +grep "REQUEST PHASE COMPLETED" linkbench_output.txt | sed "s/.*second = /linkbench:/" | tee -a linkbench.ssd_result.txt +echo ${TAR_VER} | tee linkbench.ssd_t_version.txt +cp -f linkbench.ssd_t_version.txt $base_dir +cp -f linkbench.ssd_result.txt $base_dir + +echo "Tarantool TAG:" +cat linkbench.ssd_t_version.txt +echo "Overall results:" +echo "================" +cat linkbench.ssd_result.txt +echo " " +echo "Publish data to bench database" +/opt/bench-run/benchs/publication/publish.py diff --git a/benchs/nosqlbench/run.sh b/benchs/nosqlbench/run.sh index c9491f5..157f372 100755 --- a/benchs/nosqlbench/run.sh +++ b/benchs/nosqlbench/run.sh @@ -1,34 +1,22 @@ #!/usr/bin/env bash +set -eu +set -o pipefail + type=$1 if [ "$type" == "" ]; then type=hash fi TAR_VER=$(tarantool -v | grep -e "Tarantool" | grep -oP '\s\K\S*') -echo ${TAR_VER} | tee nosqlbench_t_version.txt - -kill `pidof tarantool` - -#set -e -# -#set -o pipefail +numaopts="numactl --membind=1 --cpunodebind=1 --physcpubind=6,7,8,9,10,11" killall tarantool 2>/dev/null || true -rm -rf 0*.xlog 0*.snap -sync +sync && echo "sync passed" || echo "sync failed with error" $? echo 3 > /proc/sys/vm/drop_caches -#cd /opt/nosqlbench/ -#cmake . && make -j -#cd - -# -#tarantool -v -# -free -h -numactl --membind=1 --cpunodebind=1 --physcpubind=6,7,8,9,10,11 tarantool `dirname $0`/tnt_${type}.lua 2>&1 & +$numaopts tarantool `dirname $0`/tnt_${type}.lua 2>&1 & sed "s/port 3303/port 3301/" /opt/nosqlbench/src/nosqlbench.conf -i -#sed "s/request_count 4000000/request_count 400000/" /opt/nosqlbench/src/nosqlbench.conf -i sed "s/benchmark 'no_limit'/benchmark 'time_limit'/" /opt/nosqlbench/src/nosqlbench.conf -i sed "s/time_limit 10/time_limit 2000/" /opt/nosqlbench/src/nosqlbench.conf -i sed "s/request_batch_count 1/request_batch_count 10/" /opt/nosqlbench/src/nosqlbench.conf -i @@ -36,14 +24,18 @@ sed "s/rps 12000/rps 20000/" /opt/nosqlbench/src/nosqlbench.conf -i sleep 5 echo "Run NB" # WARNING: don't try to save output from stderr - file will use the whole disk space ! -numactl --membind=1 --cpunodebind=1 --physcpubind=6,7,8,9,10,11 /opt/nosqlbench/src/nb /opt/nosqlbench/src/nosqlbench.conf | \ +$numaopts /opt/nosqlbench/src/nb /opt/nosqlbench/src/nosqlbench.conf | \ grep -v "Warmup" | grep -v "Failed to allocate" >nosqlbench_output.txt || cat nosqlbench_output.txt -#echo "Latest 1000 lines:" -#tail -1000 nosqlbench_output.txt - -echo "Getting results" -grep "TOTAL RPS STATISTICS:" nosqlbench_output.txt -A6 | awk -F "|" 'NR > 4 {print $2,":", $4}' > nosqlbench_result.txt - -cat nosqlbench_result.txt - +grep "TOTAL RPS STATISTICS:" nosqlbench_output.txt -A6 | \ + awk -F "|" 'NR > 4 {print $2,":", $4}' > noSQLbench.${type}_result.txt +echo ${TAR_VER} | tee noSQLbench.${type}_t_version.txt + +echo "Tarantool TAG:" +cat noSQLbench.${type}_t_version.txt +echo "Overall results:" +echo "================" +cat noSQLbench.${type}_result.txt +echo " " +echo "Publish data to bench database" +/opt/bench-run/benchs/publication/publish.py diff --git a/benchs/publication/publish.py b/benchs/publication/publish.py new file mode 100755 index 0000000..42bc53a --- /dev/null +++ b/benchs/publication/publish.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python +import fnmatch +import os +from urllib import urlencode +import requests + + +def parse_bench(filename): + with open(filename) as raw_data: + return raw_data.readlines() + + +def get_version(filename): + with open(filename) as raw_data: + version = raw_data.readlines()[-1] + return version.split()[0] + + +def push_to_microb(server, token, name, value, version, tab): + uri = 'http://%s/push?%s' % (server, urlencode(dict( + key=token, name=name, param=value, + v=version, unit='trps', tab=tab + ))) + + r = requests.get(uri) + if r.status_code == 200: + print('Export complete') + else: + print('Export error http: %d' % r.status_code) + print('Export error text: %d' % r.text) + + +def main(): + if "MICROB_WEB_TOKEN" in os.environ and "MICROB_WEB_HOST" in os.environ: + bench = {} + res = [] + current_data = {} + version = '' + for file in os.listdir('.'): + if fnmatch.fnmatch(file, '*_result.txt'): + values = parse_bench(file) + benchmark = file.split('_')[0] + version = get_version('{}_t_version.txt'.format(benchmark)) + for value in values: + test_name = value.split(':')[0] + test_res = float(value.split(':')[1]) + res.append(test_res) + push_to_microb( + os.environ['MICROB_WEB_HOST'], + os.environ['MICROB_WEB_TOKEN'], + test_name, + test_res, + version, + benchmark, + ) + print ("VERSION - ", version) + else: + print("MICROB params not specified") + + return 0 + + +if __name__ == '__main__': + main() diff --git a/benchs/sysbench/run.sh b/benchs/sysbench/run.sh index 6a69d14..a9cf2f3 100755 --- a/benchs/sysbench/run.sh +++ b/benchs/sysbench/run.sh @@ -1,18 +1,12 @@ #!/usr/bin/env bash -runs=10 -if [ "$1" != "" ]; then - runs=$1 -fi - -kill `pidof tarantool` - -set -e +set -eu set -o pipefail +runs=10 + TAR_VER=$(tarantool -v | grep -e "Tarantool" | grep -oP '\s\K\S*') -echo ${TAR_VER} | tee sysbench_t_version.txt -set -e +numaconf="numactl --membind=1 --cpunodebind=1 --physcpubind=6,7,8,9,10,11" ARRAY_TESTS=( "oltp_read_only" @@ -28,27 +22,17 @@ ARRAY_TESTS=( # "bulk_insert" ) -if [ -n "${TEST}" ]; then ARRAY_TESTS=("${TEST}"); fi - - -if [ ! -n "${WARMUP_TIME}" ]; then WARMUP_TIME=5; fi -if [ ! -n "${TIME}" ]; then TIME=20; fi -if [ ! -n "${DBMS}" ]; then DBMS="tarantool"; fi -if [ ! -n "${THREADS}" ]; then THREADS=200; fi - -if [ -n "${USER}" ]; then USER=--${DBMS}-user=${USER}; fi -if [ -n "${PASSWORD}" ]; then PASSWORD=--${DBMS}-password=${PASSWORD}; fi - -numaconf="--membind=1 --cpunodebind=1 --physcpubind=6,7,8,9,10,11" +WARMUP_TIME=5 +TIME=20 +DBMS="tarantool" +THREADS=200 opts="--db-driver=${DBMS} --threads=${THREADS}" export LD_LIBRARY_PATH=/usr/local/lib -rm -f sysbench_result.txt -set -o pipefail for test in "${ARRAY_TESTS[@]}"; do res=0 - tlog=sysbench_${test}_result.txt + tlog=sysbench_${test}_results.txt rm -f $tlog maxres=0 for run in `eval echo {1..$runs}` ; do @@ -58,10 +42,10 @@ for test in "${ARRAY_TESTS[@]}"; do sysbench $test $opts cleanup >sysbench_output.txt sysbench $test $opts prepare >>sysbench_output.txt - numactl $numaconf sysbench $test $opts \ + $numaconf sysbench $test $opts \ --time=${TIME} --warmup-time=${WARMUP_TIME} run >>sysbench_output.txt - numactl $numaconf sysbench $test $opts cleanup >>sysbench_output.txt + $numaconf sysbench $test $opts cleanup >>sysbench_output.txt cat sysbench_output.txt | grep -e 'transactions:' | grep -oP '\(\K\S*' | tee $tlog tres=`cat $tlog | sed 's#^.*:##g' | sed 's#\..*$##g'` @@ -69,16 +53,22 @@ for test in "${ARRAY_TESTS[@]}"; do if [[ $tres -gt $maxres ]]; then maxres=$tres ; fi done res=$(($res/$runs)) - echo "${test}: $res" >>sysbench_result.txt + echo "${test}: $res" >>Sysbench_result.txt echo "Subtest '$test' results:" echo "===============================" echo "Average result: $res" echo "Maximum result: $maxres" - printf "Diviations (AVG -> MAX): %.2f" `bc <<< "scale = 4; (1 - $res / $maxres) * 100"` ; echo % + printf "Deviations (AVG -> MAX): %.2f" `bc <<< "scale = 4; (1 - $res / $maxres) * 100"` ; echo % done +echo ${TAR_VER} | tee Sysbench_t_version.txt + +echo "Tarantool TAG:" +cat Sysbench_t_version.txt echo "Overall results:" echo "================" -cat sysbench_result.txt - +cat Sysbench_result.txt +echo " " +echo "Publish data to bench database" +/opt/bench-run/benchs/publication/publish.py diff --git a/benchs/tpcc/run.sh b/benchs/tpcc/run.sh index f1f60cc..fca7939 100755 --- a/benchs/tpcc/run.sh +++ b/benchs/tpcc/run.sh @@ -1,22 +1,20 @@ #!/usr/bin/env bash +set -eu +set -o pipefail TAR_VER=$(tarantool -v | grep -e "Tarantool" | grep -oP '\s\K\S*') -echo ${TAR_VER} | tee tpcc_t_version.txt - -set -e +numaopts="numactl --membind=1 --cpunodebind=1 --physcpubind=6,7,8,9,10,11" +base_dir=$(pwd) -if [ ! -n "${TIME}" ]; then TIME=1200; fi -if [ ! -n "${WARMUP_TIME}" ]; then WARMUP_TIME=10; fi - -set -o pipefail +TIME=1200 +WARMUP_TIME=10 killall tarantool tpcc_load 2>/dev/null || true -rm -rf 0*.xlog 0*.snap -sync +sync && echo "sync passed" || echo "sync failed with error" $? echo 3 > /proc/sys/vm/drop_caches sed 's#box.sql#box#g' -i /opt/tpcc/create_table.lua -numactl --membind=1 --cpunodebind=1 --physcpubind=6,7,8,9,10,11 tarantool /opt/tpcc/create_table.lua & +$numaopts tarantool /opt/tpcc/create_table.lua & sleep 5 # Usage: tpcc_load -h server_host -P port -d database_name -u mysql_user @@ -27,13 +25,21 @@ tpcc_opts="-h localhost -P 3301 -d tarantool -u root -p '' -w 15" cd /opt/tpcc . /opt/tpcc/load.sh tarantool 15 -numactl --membind=1 --cpunodebind=1 --physcpubind=6,7,8,9,10,11 \ - /opt/tpcc/tpcc_start $tpcc_opts -r10 -l${TIME} -i${TIME} >tpcc_output.txt 2>/dev/null - -echo -n "tpcc:" | tee tpcc_result.txt -cat tpcc_output.txt | grep -e '<TpmC>' | grep -oP '\K[0-9.]*' | tee -a tpcc_result.txt +$numaopts /opt/tpcc/tpcc_start $tpcc_opts -r10 -l${TIME} -i${TIME} >tpcc_output.txt 2>/dev/null +echo -n "tpcc:" | tee tpc.c_result.txt +cat tpcc_output.txt | grep -e '<TpmC>' | grep -oP '\K[0-9.]*' | tee -a tpc.c_result.txt cat tpcc_output.txt + +echo ${TAR_VER} | tee tpc.c_t_version.txt +cp -f tpc.c_t_version.txt $base_dir +cp -f tpc.c_result.txt $base_dir + +echo "Tarantool TAG:" +cat tpc.c_t_version.txt echo "Overall result:" echo "===============" -cat tpcc_result.txt +cat tpc.c_result.txt +echo " " +echo "Publish data to bench database" +/opt/bench-run/benchs/publication/publish.py diff --git a/benchs/ycsb/run.sh b/benchs/ycsb/run.sh index 5ae1c75..e5219a1 100755 --- a/benchs/ycsb/run.sh +++ b/benchs/ycsb/run.sh @@ -1,23 +1,18 @@ #!/usr/bin/env bash +set -eu +set -o pipefail + mode=$1 -runs=$2 +runs=1 if [ "$mode" == "" ]; then mode=hash fi -if [ "$runs" == "" ]; then - runs=1 -fi - -kill `pidof tarantool` - -set -e -set -o pipefail - TAR_VER=$(tarantool -v | grep -e "Tarantool" | grep -oP '\s\K\S*') -echo ${TAR_VER} | tee ycsb_t_version.txt +numaopts="numactl --membind=1 --cpunodebind=1 --physcpubind=6,7,8,9,10,11" +base_dir=$(pwd) ws=/opt/ycsb cd $ws @@ -33,7 +28,7 @@ sed 's/listen=.*/listen=3301,\n memtx_memory = 2000000000,/' -i $srvlua sed 's/logger_nonblock.*//' -i $srvlua sed 's/logger/log/' -i $srvlua sed 's/read,write,execute/create,read,write,execute/' -i $srvlua -numactl --membind=1 --cpunodebind=1 --physcpubind=6,7,8,9,10,11 tarantool $srvlua 2>&1 & +$numaopts tarantool $srvlua 2>&1 & sleep 5 plogs=$ws/results @@ -45,12 +40,25 @@ for l in a b c d e f ; do res=$plogs/run${l}_${r} echo ---------------- ${l}: $r echo "tarantool.port=3301" >> $ws/workloads/workload${l} - numactl --membind=1 --cpunodebind=1 --physcpubind=6,7,8,9,10,11 bin/ycsb load tarantool -s -P workloads/workload${l} >${res}.load 2>&1 || cat ${res}.load - sync + $numaopts bin/ycsb load tarantool -s -P workloads/workload${l} >${res}.load 2>&1 || cat ${res}.load + sync && echo "sync passed" || echo "sync failed with error" $? echo 3 > /proc/sys/vm/drop_caches - numactl --membind=1 --cpunodebind=1 --physcpubind=6,7,8,9,10,11 bin/ycsb run tarantool -s -P workloads/workload${l} >${res}.log 2>&1 || cat ${res}.log + $numaopts bin/ycsb run tarantool -s -P workloads/workload${l} >${res}.log 2>&1 || cat ${res}.log grep Thro ${res}.log | awk '{ print "Overall result: "$3 }' | tee ${res}.txt - sed "s#Overall result#$l $r#g" ${res}.txt >>${plogs}/results.txt + sed "s#Overall result#$l $r#g" ${res}.txt >>${plogs}/ycsb.${mode}_result.txt done done -cat ${plogs}/results.txt + +echo ${TAR_VER} | tee ycsb.${mode}_t_version.txt +cp -f ${plogs}/ycsb.${mode}_result.txt . +cp -f ycsb.${mode}_t_version.txt $base_dir +cp -f ycsb.${mode}_result.txt $base_dir + +echo "Tarantool TAG:" +cat ycsb.${mode}_t_version.txt +echo "Overall results:" +echo "================" +cat ycsb.${mode}_result.txt +echo " " +echo "Publish data to bench database" +/opt/bench-run/benchs/publication/publish.py diff --git a/dockerfiles/ubuntu_benchs b/dockerfiles/ubuntu_benchs index fd9acb4..947f082 100644 --- a/dockerfiles/ubuntu_benchs +++ b/dockerfiles/ubuntu_benchs @@ -73,3 +73,6 @@ RUN luarocks install \ # benchmarks runners RUN git clone https://github.com/tarantool/bench-run.git /opt/bench-run + +# adding python dependency +RUN pip install requests -- 1.8.3.1 [-- Attachment #2: Type: text/html, Size: 24944 bytes --]
next reply other threads:[~2020-04-29 11:23 UTC|newest] Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-04-29 11:23 Oleg Piskunov [this message] 2020-04-30 10:38 ` Sergey Bronnikov 2020-04-30 10:56 ` Alexander V. Tikhonov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1588159426.603065637@f436.i.mail.ru \ --to=o.piskunov@tarantool.org \ --cc=tarantool-patches@dev.tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH v2] bench-run: submit perf results into database' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox