# shellcheck shell=bash # shellcheck disable=SC2034,SC2153,SC2154,SC2155 if [ -n "$__experiment_server_globals_sh__" ]; then return; fi __experiment_server_globals_sh__=$(date) # The global configs for the scripts declare -gr SERVER_LOG_FILE="perf.log" declare -gr SERVER_HTTP_LOG_FILE="http_perf.log" declare -gr HEY_OPTS="-disable-compression -disable-keepalive -disable-redirects" # Globals to fill during run_init in run.sh, to use in base and generate_spec declare -A ports=() declare -A repl_periods=() declare -A max_budgets=() declare -A wasm_paths=() declare -A expected_execs=() declare -A deadlines=() declare -A resp_content_types=() declare -A arg_opts_hey=() declare -A arg_opts_lt=() declare -A args=() declare -A concurrencies=() declare -A rpss=() declare -a workloads=() declare -A workload_tids=() declare -A workload_deadlines=() declare -A workload_vars=() # Sandbox Perf Log Globals: declare -ga SANDBOX_METRICS=(total queued uninitialized allocated initialized runnable interrupted preempted running_sys running_user asleep returned complete error) declare -gA SANDBOX_METRICS_FIELDS=( [total]=6 [queued]=7 [uninitialized]=8 [allocated]=9 [initialized]=10 [runnable]=11 [interrupted]=12 [preempted]=13 [running_sys]=14 [running_user]=15 [asleep]=16 [returned]=17 [complete]=18 [error]=19 ) declare -gr SANDBOX_TENANT_NAME_FIELD=2 declare -gr SANDBOX_ROUTE_FIELD=3 declare -gr SANDBOX_CPU_FREQ_FIELD=20 declare -gr SANDBOX_RESPONSE_CODE_FIELD=21 # HTTP Session Perf Log Globals: declare -ga HTTP_METRICS=(http_receive http_sent http_total) declare -gA HTTP_METRICS_FIELDS=( [http_receive]=6 [http_sent]=7 [http_total]=8 ) declare -gr HTTP_TENANT_NAME_FIELD=1 declare -gr HTTP_ROUTE_FIELD=2 declare -gr HTTP_CPU_FREQ_FIELD=9 assert_run_experiments_args() { if (($# != 3)); then panic "invalid number of arguments \"$#\"" return 1 elif [[ -z "$1" ]]; then panic "hostname \"$1\" was empty" return 1 elif [[ ! -d "$2" ]]; then panic "directory \"$2\" does not exist" return 1 elif [[ -z "$3" ]]; then panic "load gen \"$3\" was empty" return 1 fi } assert_process_client_results_args() { if (($# != 1)); then error_msg "invalid number of arguments ($#, expected 1)" return 1 elif ! [[ -d "$1" ]]; then error_msg "directory $1 does not exist" return 1 fi } assert_process_server_results_args() { if (($# != 1)); then panic "invalid number of arguments \"$#\"" return 1 elif [[ ! -d "$1" ]]; then panic "directory \"$1\" does not exist" return 1 fi } load_value() { local result=$1 if [ "$result" = "?" ]; then result=$2 fi echo "$result" } run_init() { for var in "${VARYING[@]}"; do for t_idx in "${!TENANT_IDS[@]}"; do local tenant_id=${TENANT_IDS[$t_idx]} local tenant=$(printf "%s-%03d" "$tenant_id" "$var") local port=$((INIT_PORTS[t_idx]+var)) local repl_period=$(load_value ${MTDS_REPL_PERIODS_us[$t_idx]} $var) local budget=$(load_value ${MTDS_MAX_BUDGETS_us[$t_idx]} $var) # TENANTS+=("$tenant") ports+=([$tenant]=$port) repl_periods+=([$tenant]=$repl_period) max_budgets+=([$tenant]=$budget) local t_routes r_expected_execs r_deadlines r_arg_opts_hey r_arg_opts_lt r_args r_loads IFS=' ' read -r -a t_routes <<< "${ROUTES[$t_idx]}" IFS=' ' read -r -a r_wasm_paths <<< "${WASM_PATHS[$t_idx]}" IFS=' ' read -r -a r_expected_execs <<< "${EXPECTED_EXEC_TIMES_us[$t_idx]}" IFS=' ' read -r -a r_deadlines <<< "${DEADLINES_us[$t_idx]}" IFS=' ' read -r -a r_resp_content_types <<< "${RESP_CONTENT_TYPES[$t_idx]}" IFS=' ' read -r -a r_arg_opts_hey <<< "${ARG_OPTS_HEY[$t_idx]}" IFS=' ' read -r -a r_arg_opts_lt <<< "${ARG_OPTS_LT[$t_idx]}" IFS=' ' read -r -a r_args <<< "${ARGS[$t_idx]}" IFS=' ' read -r -a r_loads <<< "${LOADS[$t_idx]}" for r_idx in "${!t_routes[@]}"; do local route=${t_routes[$r_idx]} local wasm_path=${r_wasm_paths[$r_idx]} local expected=${r_expected_execs[$r_idx]} local deadline=${r_deadlines[$r_idx]} local resp_content_type=${r_resp_content_types[$r_idx]} local arg_opt_hey=${r_arg_opts_hey[$r_idx]} local arg_opt_lt=${r_arg_opts_lt[$r_idx]} local arg=${r_args[$r_idx]} local load=$(load_value ${r_loads[$r_idx]} $var) local workload="$tenant-$route" # Divide as float, cast the result to int (Loadtest is okay floats, HEY is not) local con=$(echo "x = $NWORKERS * $deadline / $expected * $load / 100; x/1" | bc) local rps=$((1000000 * con / deadline)) # local rps=$(echo "x = 1000000 * $con / $deadline; x/1" | bc) wasm_paths+=([$workload]=$wasm_path) expected_execs+=([$workload]=$expected) deadlines+=([$workload]=$deadline) resp_content_types+=([$workload]=$resp_content_type) arg_opts_hey+=([$workload]=$arg_opt_hey) arg_opts_lt+=([$workload]=$arg_opt_lt) args+=([$workload]=$arg) concurrencies+=([$workload]=$con) rpss+=([$workload]=$rps) workloads+=("$workload") workload_tids+=([$workload]=$tenant_id) workload_deadlines+=([$workload]=$deadline) workload_vars+=([$workload]=$var) done done done }