From 1cf73c83e2ad15466c99c199bfa4a355748a314f Mon Sep 17 00:00:00 2001 From: Bo Chen Date: Fri, 4 Feb 2022 16:14:40 -0800 Subject: [PATCH] scripts: Generate performance metrics with the dev container Signed-off-by: Bo Chen --- scripts/dev_cli.sh | 23 +++++++++++ scripts/run_metrics.sh | 94 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100755 scripts/run_metrics.sh diff --git a/scripts/dev_cli.sh b/scripts/dev_cli.sh index 9a35fc372..5526c9638 100755 --- a/scripts/dev_cli.sh +++ b/scripts/dev_cli.sh @@ -186,6 +186,7 @@ cmd_help() { echo " --integration-windows Run the Windows guest integration tests." echo " --integration-live-migration Run the live-migration integration tests." echo " --libc Select the C library Cloud Hypervisor will be built against. Default is gnu" + echo " --metrics Generate performance metrics" echo " --volumes Hash separated volumes to be exported. Example --volumes /mnt:/mnt#/myvol:/myvol" echo " --hypervisor Underlying hypervisor. Options kvm, mshv" echo " --all Run all tests." @@ -300,6 +301,7 @@ cmd_tests() { integration_vfio=false integration_windows=false integration_live_migration=false + metrics=false libc="gnu" arg_vols="" hypervisor="kvm" @@ -314,6 +316,7 @@ cmd_tests() { "--integration-vfio") { integration_vfio=true; } ;; "--integration-windows") { integration_windows=true; } ;; "--integration-live-migration") { integration_live_migration=true; } ;; + "--metrics") { metrics=true; } ;; "--libc") shift [[ "$1" =~ ^(musl|gnu)$ ]] || \ @@ -478,6 +481,26 @@ cmd_tests() { "$CTR_IMAGE" \ ./scripts/run_integration_tests_live_migration.sh "$@" || fix_dir_perms $? || exit $? fi + + if [ "$metrics" = true ] ; then + say "Generating performance metrics for $target..." + $DOCKER_RUNTIME run \ + --workdir "$CTR_CLH_ROOT_DIR" \ + --rm \ + --privileged \ + --security-opt seccomp=unconfined \ + --ipc=host \ + --net="$CTR_CLH_NET" \ + --mount type=tmpfs,destination=/tmp \ + --volume /dev:/dev \ + --volume "$CLH_ROOT_DIR:$CTR_CLH_ROOT_DIR" $exported_volumes \ + --volume "$CLH_INTEGRATION_WORKLOADS:$CTR_CLH_INTEGRATION_WORKLOADS" \ + --env USER="root" \ + --env CH_LIBC="${libc}" \ + "$CTR_IMAGE" \ + ./scripts/run_metrics.sh "$@" || fix_dir_perms $? || exit $? + fi + fix_dir_perms $? } diff --git a/scripts/run_metrics.sh b/scripts/run_metrics.sh new file mode 100755 index 000000000..a4446cb47 --- /dev/null +++ b/scripts/run_metrics.sh @@ -0,0 +1,94 @@ +#!/bin/bash +set -x + +source $HOME/.cargo/env +source $(dirname "$0")/test-util.sh + +export BUILD_TARGET=${BUILD_TARGET-x86_64-unknown-linux-gnu} + +WORKLOADS_DIR="$HOME/workloads" +mkdir -p "$WORKLOADS_DIR" + +process_common_args "$@" + +# For now these values are default for kvm +features="" + +if [ "$hypervisor" = "mshv" ] ; then + features="--no-default-features --features mshv,common" +fi + +cp scripts/sha1sums-x86_64 $WORKLOADS_DIR + +FOCAL_OS_IMAGE_NAME="focal-server-cloudimg-amd64-custom-20210609-0.qcow2" +FOCAL_OS_IMAGE_URL="https://cloud-hypervisor.azureedge.net/$FOCAL_OS_IMAGE_NAME" +FOCAL_OS_IMAGE="$WORKLOADS_DIR/$FOCAL_OS_IMAGE_NAME" +if [ ! -f "$FOCAL_OS_IMAGE" ]; then + pushd $WORKLOADS_DIR + time wget --quiet $FOCAL_OS_IMAGE_URL || exit 1 + popd +fi + +FOCAL_OS_RAW_IMAGE_NAME="focal-server-cloudimg-amd64-custom-20210609-0.raw" +FOCAL_OS_RAW_IMAGE="$WORKLOADS_DIR/$FOCAL_OS_RAW_IMAGE_NAME" +if [ ! -f "$FOCAL_OS_RAW_IMAGE" ]; then + pushd $WORKLOADS_DIR + time qemu-img convert -p -f qcow2 -O raw $FOCAL_OS_IMAGE_NAME $FOCAL_OS_RAW_IMAGE_NAME || exit 1 + popd +fi + +pushd $WORKLOADS_DIR +grep focal sha1sums-x86_64 | sha1sum --check +if [ $? -ne 0 ]; then + echo "sha1sum validation of images failed, remove invalid images to fix the issue." + exit 1 +fi +popd + +# Build custom kernel based on virtio-pmem and virtio-fs upstream patches +VMLINUX_IMAGE="$WORKLOADS_DIR/vmlinux" + +LINUX_CUSTOM_DIR="$WORKLOADS_DIR/linux-custom" + +if [ ! -f "$VMLINUX_IMAGE" ]; then + SRCDIR=$PWD + pushd $WORKLOADS_DIR + time git clone --depth 1 "https://github.com/cloud-hypervisor/linux.git" -b "ch-5.15.12" $LINUX_CUSTOM_DIR + cp $SRCDIR/resources/linux-config-x86_64 $LINUX_CUSTOM_DIR/.config + popd +fi + +if [ ! -f "$VMLINUX_IMAGE" ]; then + pushd $LINUX_CUSTOM_DIR + time make bzImage -j `nproc` + cp vmlinux $VMLINUX_IMAGE || exit 1 + popd +fi + +if [ -d "$LINUX_CUSTOM_DIR" ]; then + rm -rf $LINUX_CUSTOM_DIR +fi + +BUILD_TARGET="$(uname -m)-unknown-linux-${CH_LIBC}" +CFLAGS="" +TARGET_CC="" +if [[ "${BUILD_TARGET}" == "x86_64-unknown-linux-musl" ]]; then + TARGET_CC="musl-gcc" + CFLAGS="-I /usr/include/x86_64-linux-musl/ -idirafter /usr/include/" +fi + +cargo build --all --release $features --target $BUILD_TARGET +strip target/$BUILD_TARGET/release/cloud-hypervisor +strip target/$BUILD_TARGET/release/vhost_user_net +strip target/$BUILD_TARGET/release/ch-remote +strip target/$BUILD_TARGET/release/performance-metrics + +# setup hugepages +echo 6144 | sudo tee /proc/sys/vm/nr_hugepages +sudo chmod a+rwX /dev/hugepages + +export RUST_BACKTRACE=1 +time target/$BUILD_TARGET/release/performance-metrics +RES=$? + +exit $RES