asterinas/test/benchmark/common/host_guest_bench_runner.sh

86 lines
2.5 KiB
Bash
Executable File

#!/bin/bash
# SPDX-License-Identifier: MPL-2.0
set -e
BENCHMARK_PATH=$1
ASTERINAS_GUEST_CMD=$2
LINUX_GUEST_CMD=$3
ASTERINAS_OUTPUT=$4
LINUX_OUTPUT=$5
# Message to monitor in the log file to determine whether the VM is ready
# It should align with bench_runner.sh
READY_MESSAGE="The VM is ready for the benchmark."
# Import the common functions
BENCHMARK_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)/../"
source "${BENCHMARK_DIR}/common/prepare_host.sh"
if [[ "$BENCHMARK_PATH" =~ "iperf" ]]; then
# Persist Iperf port
export IPERF_PORT=5201
elif [[ "$BENCHMARK_PATH" =~ "nginx" ]]; then
# Persist Nginx port
export NGINX_PORT=8080
elif [[ "$BENCHMARK_PATH" =~ "redis" ]]; then
# Persist Redis port
export REDIS_PORT=6379
elif [[ "$BENCHMARK_PATH" =~ "tcp_virtio_lat" ]]; then
# Persist lmbench/tcp_lat port
export LMBENCH_TCP_LAT_PORT=31234
elif [[ "$BENCHMARK_PATH" =~ "tcp_virtio_bw" ]]; then
# Persist lmbench/bw_tcp port
export LMBENCH_TCP_BW_PORT=31236
fi
# Function to run the benchmark
# Parameters:
# $1: guest command to run on the VM
# $2: output file to store the benchmark results
# $3: log file to monitor for the ready message
# $4: ready message to monitor in the log file
run_benchmark() {
local guest_cmd=$1
local output_file=$2
local guest_log_file=$3
local ready_message=$4
echo "Running the benchmark on the VM..."
eval "${guest_cmd}" | tee "${guest_log_file}" &
# Monitor the log file for the ready message
echo "Waiting for the ready message: ${ready_message}"
while true; do
if grep -q "${ready_message}" "${guest_log_file}"; then
echo "Ready message detected. Running the benchmark on the host..."
break
fi
sleep 1
done
# Sleep for a short time to ensure the guest is fully ready
sleep 1
# The listening server address in guest VM
export GUEST_SERVER_IP_ADDRESS=10.0.2.15
# Run the host command and save the output to the specified file.
bash "${BENCHMARK_PATH}/host.sh" 2>&1 | tee "${output_file}"
# Clean up the log file
rm -f "${guest_log_file}"
}
# Run the benchmark on the Asterinas VM
run_benchmark "${ASTERINAS_GUEST_CMD}" "${ASTERINAS_OUTPUT}" "/tmp/asterinas.log" "${READY_MESSAGE}"
# Wait for the Asterinas QEMU process to exit
wait
# Run the benchmark on the Linux VM
prepare_fs
run_benchmark "${LINUX_GUEST_CMD}" "${LINUX_OUTPUT}" "/tmp/linux.log" "${READY_MESSAGE}"
# Wait for the Linux QEMU process to exit
wait