diff --git a/eval-muhq-ma.sh b/eval-muhq-ma.sh index a32ae455d65626fe16cb53a6330a1f596e85d3b4..a9b3111e560f5aecd16df3fc6a1273ebacf6e333 100755 --- a/eval-muhq-ma.sh +++ b/eval-muhq-ma.sh @@ -22,8 +22,6 @@ if [ -d "$OUT" ]; then mv "$OUT" "$OUT"-"$ctime" fi -mkdir -p "${OUT}"/{latency,throughput} - NUMA_ARGS=--measure-cmd="numactl --cpunodebind=netdev:10gbe-card-p1 /usr/bin/time -o {BENCHDIR}/server_stats.{RUN}.txt -v" COMMON_ARGS=(--ssh-port "${SSH_PORT}" --host "${HOST}" --perf-energy) @@ -40,77 +38,92 @@ COMMON_ARGS_LATENCY=(${COMMON_ARGS[@]} --data-dir ${OUT}/latency \ echo "muhq's MA io eval" echo 'Writing results to' "$OUT" echo 'arguments:' "${COMMON_ARGS[@]}" -echo 'throughput-arguments:' "${COMMON_ARGS_THROUGHPUT[@]}" -echo 'latency-arguments:' "${COMMON_ARGS_LATENCY[@]}" - -# Baseline measurements -./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -f vanilla vanilla-200us -- emper - -# No sleep measurements -./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -f no-sleep no-sleep-0us-1ms -- emper - -# Measure parsimonious sem -./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -f parsimonious-sem -- emper - -# Measure registering io_uring fd's improvements -./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -f not-register-iouring -- emper - -# Measurements comparing runtimes -./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -- go go-200us tokio tokio-200us - -# Measurements showing distributed design improvements -./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -f simple-arch simple-arch-try-syscall -- emper - -# Measurements showing linked future improvements -./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -f linked-futures -- emper - -# Measurements showing sleep strategies -./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -f pipe waitfd -- emper - -# Measurements showing completer, stealing, notification benefits -./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -f \ - io-stealing \ - pipe-no-comp io-stealing-pipe-no-comp \ - waitfd-no-comp io-stealing-waitfd-no-comp \ - io-notification-waitfd-no-comp \ - -- emper - -# Measurements showing completer, stealing notification benefits with computation -./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -f \ - vanilla-0us-1ms io-stealing-0us-1ms \ - pipe-0us-1ms pipe-no-comp-0us-1ms \ - io-stealing-pipe-no-comp-0us-1ms \ - waitfd-0us-1ms waitfd-no-comp-0us-1ms \ - io-stealing-waitfd-no-comp-0us-1ms \ - io-notification-waitfd-no-comp-0us-1ms \ - -- emper - -# Measurements waitfree notification variants benefits -./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -f \ - io-notification-waitfree io-notification-waitfree-no-comp \ - io-notification-waitfree-0us-1ms io-notification-waitfree-no-comp-0us-1ms \ - -- emper - -# Measure lockless stealing variants seperatly because they are not reliable -# and thus easier to skip -#./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -f \ - #io-stealing-lockless \ - #io-stealing-pipe-no-comp-lockless \ - #io-stealing-waitfd-no-comp-lockless \ - #io-notification-waitfd-no-comp-lockless \ - #io-stealing-pipe-no-comp-lockless-0us-1ms \ - #io-stealing-waitfd-no-comp-lockless-0us-1ms \ - #io-notification-waitfd-no-comp-lockless-0us-1ms \ - #io-notification-waitfree-no-comp-lockless \ - #io-notification-waitfree-no-comp-lockless-0us-1ms \ - #-- emper - -# Latency evaluation -./eval.py "${COMMON_ARGS_LATENCY[@]}" -f vanilla-200us vanilla-0us-1ms no-sleep-0us-1ms \ - -- emper go-200us tokio-200us - -./eval.py "${COMMON_ARGS_LATENCY[@]}" -f \ - {pipe,waitfd}{,-no-comp}-{200us,0us-1ms} \ - io-stealing-{pipe,waitfd}-no-comp-{200us,0us-1ms} \ - io-notification-{,waitfree-}waitfd-no-comp-{200us,0us-1ms} \ - -- emper + +## Baseline measurements +eval_throughput() { + echo "Measuring throughput" + echo 'throughput-arguments:' "${COMMON_ARGS_THROUGHPUT[@]}" + + mkdir -p "${OUT}"/throughput + + ./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -f vanilla vanilla-200us -- emper + + # No sleep measurements + ./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -f no-sleep no-sleep-0us-1ms -- emper + + # Measure parsimonious sem + ./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -f parsimonious-sem -- emper + + # Measure registering io_uring fd's improvements + ./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -f not-register-iouring -- emper + + # Measurements comparing runtimes + ./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -- go go-200us tokio tokio-200us + + # Measurements showing distributed design improvements + ./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -f simple-arch simple-arch-try-syscall -- emper + + # Measurements showing linked future improvements + ./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -f linked-futures -- emper + + # Measurements showing sleep strategies + ./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -f pipe waitfd -- emper + + # Measurements showing completer, stealing, notification benefits + ./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -f \ + io-stealing \ + pipe-no-comp io-stealing-pipe-no-comp \ + waitfd-no-comp io-stealing-waitfd-no-comp \ + io-notification-waitfd-no-comp \ + -- emper + + # Measurements showing completer, stealing notification benefits with computation + ./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -f \ + vanilla-0us-1ms io-stealing-0us-1ms \ + pipe-0us-1ms pipe-no-comp-0us-1ms \ + io-stealing-pipe-no-comp-0us-1ms \ + waitfd-0us-1ms waitfd-no-comp-0us-1ms \ + io-stealing-waitfd-no-comp-0us-1ms \ + io-notification-waitfd-no-comp-0us-1ms \ + -- emper + + # Measurements waitfree notification variants benefits + ./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -f \ + io-notification-waitfree io-notification-waitfree-no-comp \ + io-notification-waitfree-0us-1ms io-notification-waitfree-no-comp-0us-1ms \ + -- emper + + # Measure lockless stealing variants seperatly because they are not reliable + # and thus easier to skip + #./eval.py "${COMMON_ARGS_THROUGHPUT[@]}" -f \ + #io-stealing-lockless \ + #io-stealing-pipe-no-comp-lockless \ + #io-stealing-waitfd-no-comp-lockless \ + #io-notification-waitfd-no-comp-lockless \ + #io-stealing-pipe-no-comp-lockless-0us-1ms \ + #io-stealing-waitfd-no-comp-lockless-0us-1ms \ + #io-notification-waitfd-no-comp-lockless-0us-1ms \ + #io-notification-waitfree-no-comp-lockless \ + #io-notification-waitfree-no-comp-lockless-0us-1ms \ + #-- emper +} + +eval_latency() { +## Latency evaluation + echo "Measuring latency" + echo 'latency-arguments:' "${COMMON_ARGS_LATENCY[@]}" + + mkdir -p "${OUT}"/latency + + ./eval.py "${COMMON_ARGS_LATENCY[@]}" -f {no-sleep,vanilla}-{200us,0us-1ms} \ + -- emper go-200us tokio-200us + + ./eval.py "${COMMON_ARGS_LATENCY[@]}" -f \ + {pipe,waitfd}{,-no-comp}-{200us,0us-1ms} \ + io-stealing-{pipe,waitfd}-no-comp-{200us,0us-1ms} \ + io-notification-{,waitfree-}waitfd-no-comp-{200us,0us-1ms} \ + -- emper +} + +[[ "${EVAL_THROUGHPUT:=true}" != "false" ]] && eval_throughput +[[ "${EVAL_LATENCY:=true}" != "false" ]] && eval_latency