238 lines
5.4 KiB
Bash
Executable File
238 lines
5.4 KiB
Bash
Executable File
#!/bin/bash
|
|
#*
|
|
#*
|
|
#* Copyright 2014 gRPC authors.
|
|
#*
|
|
#* Licensed under the Apache License, Version 2.0 (the "License");
|
|
#* you may not use this file except in compliance with the License.
|
|
#* You may obtain a copy of the License at
|
|
#*
|
|
#* http://www.apache.org/licenses/LICENSE-2.0
|
|
#*
|
|
#* Unless required by applicable law or agreed to in writing, software
|
|
#* distributed under the License is distributed on an "AS IS" BASIS,
|
|
#* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
#* See the License for the specific language governing permissions and
|
|
#* limitations under the License.
|
|
#*
|
|
|
|
set -e
|
|
|
|
rpcs=(1)
|
|
conns=(1)
|
|
warmup=10
|
|
dur=10
|
|
reqs=(1)
|
|
resps=(1)
|
|
rpc_types=(unary)
|
|
|
|
out_dir=$PWD/bin
|
|
# idx[0] = idx value for rpcs
|
|
# idx[1] = idx value for conns
|
|
# idx[2] = idx value for reqs
|
|
# idx[3] = idx value for resps
|
|
# idx[4] = idx value for rpc_types
|
|
idx=(0 0 0 0 0)
|
|
idx_max=(1 1 1 1 1)
|
|
|
|
|
|
|
|
# 1. Init Occlum Workspace
|
|
rm -rf occlum_server && mkdir occlum_server
|
|
rm -rf occlum_client && mkdir occlum_client
|
|
cd occlum_client
|
|
occlum init
|
|
new_json="$(jq '.resource_limits.user_space_size = "1MB" |
|
|
.resource_limits.user_space_max_size = "2048MB" |
|
|
.resource_limits.max_num_of_threads = 96 ' Occlum.json)" && \
|
|
echo "${new_json}" > Occlum.json
|
|
|
|
# 2. Copy program into Occlum Workspace and build
|
|
cp ${out_dir}/client image/bin
|
|
mkdir -p image/etc
|
|
cp /etc/hosts image/etc
|
|
occlum build
|
|
|
|
cd ../occlum_server
|
|
occlum init
|
|
new_json="$(jq '.resource_limits.user_space_size = "1MB" |
|
|
.resource_limits.user_space_max_size = "2048MB" |
|
|
.resource_limits.max_num_of_threads = 96 ' Occlum.json)" && \
|
|
echo "${new_json}" > Occlum.json
|
|
|
|
# 2. Copy program into Occlum Workspace and build
|
|
cp ${out_dir}/server image/bin
|
|
mkdir -p image/etc
|
|
cp /etc/hosts image/etc
|
|
occlum build
|
|
|
|
|
|
inc()
|
|
{
|
|
for i in $(seq $((${#idx[@]}-1)) -1 0); do
|
|
idx[${i}]=$((${idx[${i}]}+1))
|
|
if [ ${idx[${i}]} == ${idx_max[${i}]} ]; then
|
|
idx[${i}]=0
|
|
else
|
|
break
|
|
fi
|
|
done
|
|
local fin
|
|
fin=1
|
|
# Check to see if we have looped back to the beginning.
|
|
for v in ${idx[@]}; do
|
|
if [ ${v} != 0 ]; then
|
|
fin=0
|
|
break
|
|
fi
|
|
done
|
|
if [ ${fin} == 1 ]; then
|
|
clean_and_die 0
|
|
fi
|
|
}
|
|
|
|
clean_and_die() {
|
|
exit $1
|
|
}
|
|
|
|
|
|
run(){
|
|
local nr
|
|
nr=${rpcs[${idx[0]}]}
|
|
local nc
|
|
nc=${conns[${idx[1]}]}
|
|
req_sz=${reqs[${idx[2]}]}
|
|
resp_sz=${resps[${idx[3]}]}
|
|
r_type=${rpc_types[${idx[4]}]}
|
|
# Following runs one benchmark
|
|
base_port=50051
|
|
delta=0
|
|
test_name="r_"${nr}"_c_"${nc}"_req_"${req_sz}"_resp_"${resp_sz}"_"${r_type}"_"$(date +%s)
|
|
echo "================================================================================"
|
|
echo ${test_name}
|
|
while :
|
|
do
|
|
port=$((${base_port}+${delta}))
|
|
|
|
# Launch the server in background
|
|
occlum run /bin/server --port=${port} --test_name="Server_"${test_name}&
|
|
sleep 1
|
|
server_pid=`ps -a | grep occlum-run | grep -v grep | sed 's/^\s*//' | sed 's/[[:space:]].*//'`
|
|
# Launch the client
|
|
cd ../occlum_client
|
|
occlum run /bin/client --port=${port} --d=${dur} --w=${warmup} --r=${nr} --c=${nc} --req=${req_sz} --resp=${resp_sz} --rpc_type=${r_type} --test_name="client_"${test_name}
|
|
client_status=$(echo $?)
|
|
echo "client_status=$client_status"
|
|
|
|
#occlum app cannot capture the interrupt, kill the server directly.
|
|
#kill -INT ${server_pid}
|
|
kill -9 ${server_pid}
|
|
#wait ${server_pid}
|
|
|
|
if [ ${client_status} == 0 ]; then
|
|
break
|
|
fi
|
|
|
|
delta=$((${delta}+1))
|
|
if [ ${delta} == 10 ]; then
|
|
echo "Continuous 10 failed runs. Exiting now."
|
|
fi
|
|
done
|
|
|
|
}
|
|
|
|
set_param(){
|
|
local argname=$1
|
|
shift
|
|
local idx=$1
|
|
shift
|
|
if [ $# -eq 0 ]; then
|
|
echo "${argname} not specified"
|
|
exit 1
|
|
fi
|
|
PARAM=($(echo $1 | sed 's/,/ /g'))
|
|
if [ ${idx} -lt 0 ]; then
|
|
return
|
|
fi
|
|
idx_max[${idx}]=${#PARAM[@]}
|
|
}
|
|
|
|
while [ $# -gt 0 ]; do
|
|
case "$1" in
|
|
-r)
|
|
shift
|
|
set_param "number of rpcs" 0 $1
|
|
rpcs=(${PARAM[@]})
|
|
shift
|
|
;;
|
|
-c)
|
|
shift
|
|
set_param "number of connections" 1 $1
|
|
conns=(${PARAM[@]})
|
|
shift
|
|
;;
|
|
-w)
|
|
shift
|
|
set_param "warm-up period" -1 $1
|
|
warmup=${PARAM}
|
|
shift
|
|
;;
|
|
-d)
|
|
shift
|
|
set_param "duration" -1 $1
|
|
dur=${PARAM}
|
|
shift
|
|
;;
|
|
-req)
|
|
shift
|
|
set_param "request size" 2 $1
|
|
reqs=(${PARAM[@]})
|
|
shift
|
|
;;
|
|
-resp)
|
|
shift
|
|
set_param "response size" 3 $1
|
|
resps=(${PARAM[@]})
|
|
shift
|
|
;;
|
|
-rpc_type)
|
|
shift
|
|
set_param "rpc type" 4 $1
|
|
rpc_types=(${PARAM[@]})
|
|
shift
|
|
;;
|
|
-h|--help)
|
|
echo "Following are valid options:"
|
|
echo
|
|
echo "-h, --help show brief help"
|
|
echo "-w warm-up duration in seconds, default value is 10"
|
|
echo "-d benchmark duration in seconds, default value is 60"
|
|
echo ""
|
|
echo "Each of the following can have multiple comma separated values."
|
|
echo ""
|
|
echo "-r number of RPCs, default value is 1"
|
|
echo "-c number of Connections, default value is 1"
|
|
echo "-req req size in bytes, default value is 1"
|
|
echo "-resp resp size in bytes, default value is 1"
|
|
echo "-rpc_type valid values are unary|streaming, default is unary"
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "Incorrect option $1"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Build server and client
|
|
if [ $? != 0 ]; then
|
|
clean_and_die 1
|
|
fi
|
|
|
|
#occlum start
|
|
while :
|
|
do
|
|
run
|
|
inc
|
|
done
|