diff --git a/scripts/benchmark.sh b/scripts/benchmark.sh new file mode 100644 index 000000000..42f43d3fa --- /dev/null +++ b/scripts/benchmark.sh @@ -0,0 +1,125 @@ +#!/bin/bash + +# Copyright (C) 2019 Storj Labs, Inc. +# See LICENSE for copying information. + +usage="Usage: $(basename "$0") " + +if [ "$1" == "" ]; then + echo "$usage" >&2 + exit 1 +fi +if [ "$2" == "" ]; then + echo "$usage" >&2 + exit 1 +fi +if [ "$3" == "" ]; then + echo "$usage" >&2 + exit 1 +fi + +# SETTINGS +SERVICE=$1 +COMMAND=$2 +FILE=$3 +BUCKET=$4 +OPERATIONS=$5 +FILENAME="$(basename -- $FILE)" +DOWNLOAD_DIR="/tmp/" +DOWNLOAD_FILE="$DOWNLOAD_DIR$FILENAME" +EXEC_COMMAND="" +UPLOAD_COMMAND="" +DOWNLOAD_COMMAND="" +LOG_FILE=$SERVICE"_"$COMMAND".log" +RESULTS_FILE=$SERVICE"_"$COMMAND"_results.log" +FAILURES=0 + +if [ "$SERVICE" == "aws" ]; then + UPLOAD_COMMAND="exec_aws_upload" + DOWNLOAD_COMMAND="exec_aws_download" +elif [ "$SERVICE" == "storj" ]; then + UPLOAD_COMMAND="exec_storj_upload" + DOWNLOAD_COMMAND="exec_storj_download" +fi + +if [ "$COMMAND" == "upload" ]; then + EXEC_COMMAND=$UPLOAD_COMMAND +elif [ "$COMMAND" == "download" ]; then + EXEC_COMMAND=$DOWNLOAD_COMMAND +fi + +function exec_aws_upload() { + /usr/bin/time aws s3 cp $FILE s3://$BUCKET 2>&1 | tail -n 3 +} +function exec_aws_download() { + /usr/bin/time -p aws s3 cp s3://$BUCKET/$FILENAME $DOWNLOAD_FILE 2>&1 | tail -n 3 +} + +function exec_storj_create_bucket() { + /usr/bin/time -p uplink --log.level error --log.output /tmp/storj.log mb sj://$BUCKET 2>&1 + return +} + +function exec_storj_upload() { + /usr/bin/time -p uplink --log.level error --log.output /tmp/storj.log cp $FILE sj://$BUCKET/$FILENAME 2>&1 | tail -n 3 +} +function exec_storj_download() { + /usr/bin/time -p uplink --log.level error --log.output /tmp/storj.log cp sj://$BUCKET/$FILENAME $DOWNLOAD_FILE 2>&1 | tail -n 3 +} + + +echo "========================================" +echo "Environment" +echo "========================================" +echo "UPLOAD CMD:" $UPLOAD_COMMAND +echo "DOWNLOAD CMD:" $DOWNLOAD_COMMAND +echo "EXEC CMD:" $EXEC_COMMAND +echo "BUCKET:" $BUCKET +echo "FILE:" $FILE +echo "OPERATIONS:" $OPERATIONS +echo "LOG FILE:" $LOG_FILE +echo "RESULTS FILE:" $RESULTS_FILE +echo "" +echo "========================================" +echo "Benchmark" +echo "========================================" + +if [ "$COMMAND" == "download" ]; then + echo "Uploading file for download benchmark..." + exec_storj_create_bucket + $UPLOAD_COMMAND +fi + +# Benchmark. +echo "Benchmarking $SERVICE $COMMAND..." +rm -rf "$LOG_FILE" +rm -rf "$RESULTS_FILE" +for (( i=1; i<=$OPERATIONS; i++ )) +do + response="$(${EXEC_COMMAND})" + if [ $? == 0 ]; then + response_time=`echo "$response" | awk '/real/{print $2}'` + echo $response_time >> "$LOG_FILE" + else + echo "Failed to "$COMMAND" file" + echo $response + let "FAILURES++" + fi +done + +latency_50="$(cat $LOG_FILE| sort -n | awk 'BEGIN{i=0} {s[i]=$1; i++;} END{print s[int(NR*0.50-0.5)]}')" +latency_75="$(cat $LOG_FILE| sort -n | awk 'BEGIN{i=0} {s[i]=$1; i++;} END{print s[int(NR*0.75-0.5)]}')" +latency_90="$(cat $LOG_FILE| sort -n | awk 'BEGIN{i=0} {s[i]=$1; i++;} END{print s[int(NR*0.90-0.5)]}')" +latency_95="$(cat $LOG_FILE| sort -n | awk 'BEGIN{i=0} {s[i]=$1; i++;} END{print s[int(NR*0.95-0.5)]}')" +latency_99="$(cat $LOG_FILE| sort -n | awk 'BEGIN{i=0} {s[i]=$1; i++;} END{print s[int(NR*0.99-0.5)]}')" + +cat >$RESULTS_FILE <> $RESULTS_FILE + +cat $RESULTS_FILE