Skip to content
Snippets Groups Projects
run.sh 3.57 KiB
Newer Older
#!/usr/bin/env bash

set -e

if [ "$UID" -ne 0 ]; then
    echo "Script must be run as root"
    exit 1
fi

export EXP_ROOT="$PWD"

source ./configs/base.sh

if [ -e "./configs/$(uname -r).sh" ]; then
    echo "Loading kernel-specific config for $(uname -r)"
    source ./configs/$(uname -r).sh
fi

source ./tunings/base.sh

while [[ $# -gt 0 ]]; do
    case $1 in
        -e)
            EXPERIMENT="$2"
            shift
            shift
            ;;
        --extra-tuning)
            EXTRA_TUNING="$2"
            shift
            shift
            ;;
        -t|--threads)
            THREADS="$2"
            shift
            shift
            ;;
        --fstack)
            FSTACK=true
            USERSTACK=true
            shift
            ;;
Peter Cai's avatar
Peter Cai committed
        --caladan)
            CALADAN=true
            USERSTACK=true
            shift
            ;;
        -f|--force)
            FORCE_REMOVE=true
            shift
            ;;
        --aux)
            EXP_AUX_SUFFIX="_aux$2"
            shift
            shift
            ;;
Peter Cai's avatar
Peter Cai committed
            echo "Unknown option $1"
            exit 1
            ;;
    esac
done

if [ -z "$EXPERIMENT" ]; then
    echo "Must specify an experiment to run"
    exit 1
fi

if [ ! -f "./experiments/$EXPERIMENT.sh" ]; then
     echo "$EXPERIMENT does not exist"
     exit 1
fi

if [ "$USERSTACK" == "true" ] && [ ! -z "$EXTRA_TUNING" ]; then
    echo "Cannot apply extra tuning when using user stacks"
    exit 1
fi

if [ "$USERSTACK" != "true" ]; then
    source ./tunings/normalize_queues.sh
    [ ! -z "$EXTRA_TUNING" ] && source ./tunings/"$EXTRA_TUNING".sh
fi

# Initialization for DPDK
if [ "$USERSTACK" == "true" ]; then
    # mlx4 supports bifurcation, and we only need to work around a kernel driver bug by re-loading the module
    modprobe -r mlx4_ib mlx4_en mlx4_core
    modprobe mlx4_en mlx4_ib 
    echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
    echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
    echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
    mkdir /mnt/huge || true
    mount -t hugetlbfs nodev /mnt/huge || true
fi
Peter Cai's avatar
Peter Cai committed
if [ "$CALADAN" == "true" ]; then
    pkill iokerneld || true
    pkill memcached || true
    if [ "$THREADS" -le 1 ]; then
        echo "Must allocate one thread for IOKernel"
        exit 1
    fi
    CALADAN_CONFIG=/tmp/caladan.config
    sed "s/{threads}/$((THREADS - 1))/g" ./caladan.config > $CALADAN_CONFIG
    $CALADAN_SRC/scripts/setup_machine.sh || true
    sleep 5
    echo "Starting up Caladan iokernel"
    $CALADAN_SRC/iokerneld simple noht &
    CALADAN_PID=$!
    sleep 5
fi

source "./experiments/$EXPERIMENT.sh"

Peter Cai's avatar
Peter Cai committed
pre_start $@
EXPERIMENT_NAME="$EXPERIMENT.$(uname -r)"
if [ ! -z "$EXTRA_TUNING" ]; then
    EXPERIMENT_NAME="$EXPERIMENT_NAME.$EXTRA_TUNING"
fi
if [ "$FSTACK" == "true" ]; then
    EXPERIMENT_NAME="$EXPERIMENT_NAME.fstack"
fi
Peter Cai's avatar
Peter Cai committed
if [ "$CALADAN" == "true" ]; then
    EXPERIMENT_NAME="$EXPERIMENT_NAME.caladan"
fi
if [ ! -z "$EXPERIMENT_NAME_EXT" ]; then
    EXPERIMENT_NAME="$EXPERIMENT_NAME.$EXPERIMENT_NAME_EXT"
fi

DATA_OUT="$EXP_ROOT/data/$EXPERIMENT_NAME"

if [ -d "$DATA_OUT" ] && [ -z "$EXP_AUX_SUFFIX" ]; then
    if [ "$FORCE_REMOVE" == "true" ]; then
        rm -rf "$DATA_OUT"
    else
        echo "Experiment directory $DATA_OUT already exists. Remove it manually or use --force. To run auxillary experiments for multiple sets of data, use --aux <num>"
        exit 1
    fi
fi
Peter Cai's avatar
Peter Cai committed

if [ "$CALADAN" == "true" ]; then
    kill -KILL "$CALADAN_PID"
fi