Newer
Older
#!/usr/bin/env bash
set -e
if [ "$UID" -ne 0 ]; then
echo "Script must be run as root"
exit 1
fi
source ./configs/nic.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
;;
--caladan)
CALADAN=true
USERSTACK=true
shift
;;
-f|--force)
FORCE_REMOVE=true
shift
;;
--aux)
EXP_AUX_SUFFIX="_aux$2"
shift
shift
;;
;;
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
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"
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
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
else
mkdir -p "$DATA_OUT"
fi