Commit fb2e7b7f authored by nikaeinn's avatar nikaeinn

update/add oai performance measurement script supporting OTG, D-ITG, and PING...

update/add oai performance measurement script supporting OTG, D-ITG, and PING (see cmake_targets/tools/perf_oai.bash -h)

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@7527 818b1a75-f10b-46b9-bf7c-635c3b92a50f
parent 8154c8fb
################################################################################
# OpenAirInterface
# Copyright(c) 1999 - 2015 Eurecom
#
# OpenAirInterface is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) anylater version.
#
#
# OpenAirInterface is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with OpenAirInterface.The full GNU General Public License is
# included in this distribution in the file called "COPYING". If not,
# see <http://www.gnu.org/licenses/>.
#
# Contact Information
# OpenAirInterface Admin: openair_admin@eurecom.fr
# OpenAirInterface Tech : openair_tech@eurecom.fr
# OpenAirInterface Dev : openair4g-devel@eurecom.fr
#
# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
#
################################################################################
# file build_oai.bash
# brief apply a traffic generator, send traffic and measure the performance of OAI
# OTG is mainly used for OASIM and D-ITG (or iperf) for LTE-SOFTMODEM
# author Navid Nikaein
# company Eurecom
# email: navid.nikaein@eurecom.fr
# date 2015
#!/bin/bash
################################
# include helper functions
################################
THIS_SCRIPT_PATH=$(dirname $(readlink -f $0))
. $THIS_SCRIPT_PATH/build_helper
#######################################
# Default PARAMETERS
######################################
#general
declare PERF_APP="OTG-OAISIM" # ITG, ITG_DECODE, PING, OTG,
declare TEST_MODE=0
declare KEEP_LOG_FILESNUM_PKTS=0
declare OWD="rttm"
declare DURATION=60000 # ms
declare NUM_PKTS=10000
declare KBYTES=1000 # KBYTES
declare START=0
declare DST="127.0.0.1"
declare DPORT="8999"
declare TP="UDP"
declare IDT_DIST="CONSTANT"
declare PS_DIST="CONSTANT"
#IDT
declare RATE=1000 # pkt / s
declare MIN_RATE=100
declare MAX_RATE=1000
# set paths to the required binaries and check if the required binaries are available
ENB_CONFIG=$OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf
OAISIM_EXEC=$OPENAIR_DIR/targets/bin/oaisim_nos1
BYPASSE_ITTI=0
OTGPLOT="$OPENAIR2_DIR/UTIL/OTG/OTGplot"
PS2PDF="ps2pdf"
print_help_perf(){
echo_success "Name : perf_oai generate traffic and evaluate the performance "
echo_success "Usage: perf_oai -l ITG "
echo_success "-l | --perf-app : Set Performance evaluation app: ITGS, ITGD,PING, OTG-OAISIM, OTG-CBA, (default OTG-OAISIM)"
echo_success "-m | --owd : enable D-ITG one-way-delay meter (default disabled)"
echo_success "-e | --duration : set the duration of the experiment (default 60000ms)"
echo_success "-i | --idt-dist : set the distribution of the inter-departure time: CONSTANT, UNIFORM,EXPONENTIAL (default CONSTANT)"
echo_success "-s | --ps-dist : set the distribution of the inter-departure time (default CONSTANT, available options: UNIFORM,EXPONENTIAL)"
echo_success "-d | --dst : set the destination address (default 127.0.0.1)"
echo_success "-p | --dst-port : set the destination address (default NONE)"
echo_success "-t | --test : enable test mode to validate the functionality (default disabled)"
echo_success "-k | --keep-log-file : keep the log files (default disabled)"
echo_success "-c | --enb-config : set the eNB config path (default $ENB_CONFIG)"
echo_success "-x | --oaisim-exec : set oaisim exec path (default $OASIM_EXEC with nos1 and ITTI enabled)"
echo_success "-b | --bypass-itti : bypass ITTI interafce (default use itti)"
}
################################
# run ITGSEND
################################
itg_send(){
$SUDO apt-get install -y test_install_package d-itg
LOG_FILE="itg_log_template.txt"
touch results/${LOG_FILE}
if [ $TEST_MODE = 0 ] ; then
declare -a PS=(32 64 128 256 512 1024 1408)
declare -a IDT=(1 5 10 50 100 1000)
else
declare -a PS=(32 64)
declare -a IDT=(1)
fi
declare PS_LEN=${#PS[@]}
declare IDT_LEN=${#IDT[@]}
#echo_info "PS_LEN is $PS_LEN, IDT_LEN is $IDT_LEN"
declare i=0
declare j=0
declare e=0
# send traffic
for idt in ${IDT[@]}; do
# echo_info "IDT is set to $idt i is $i"
if [ $i -lt $IDT_LEN ]; then
let i++;
fi
if [ $IDT_DIST = "CONSTANT" ]; then
IDT_OPT="-C $idt "
fi
if [ $IDT_DIST = "UNIFORM" ]; then
IDT_OPT="-U $idt ${IDT[i]} "
fi
if [ $IDT_DIST = "EXPONENTIAL" ]; then
IDT_OPT="-E $idt "
fi
for ps in ${PS[@]}; do
# echo_info "PS is $ps j is $j"
if [ $j -lt $PS_LEN ]; then
let j++;
fi
if [ $PS_DIST = "CONSTANT" ]; then
PS_OPT="-c $ps "
fi
if [ $PS_DIST = "UNIFORM" ]; then
PS_OPT="-u $ps ${PS[j]} "
fi
if [ $PS_DIST = "EXPONENTIAL" ]; then
PS_OPT="-e $ps "
fi
start=$(date +%s)
RECV_FILE="recv_log_${IDT_DIST}_idt${idt}_${PS_DIST}_ps${ps}_${OWD}_${TP}"
echo_info "Start test_$i.$j:: ITGSend -a $DST $IDT_OPT $PS_OPT -m $OWD -d $START -T $TP -t $DURATION -x $RECV_FILE -l "
echo "Start test_$i.$j:: ITGSend -a $DST $IDT_OPT $PS_OPT -m $OWD -d $START -T $TP -t $DURATION -x $RECV_FILE -l " >> results/${oai_exp_date}
#sleep 1
ITGSend -a $DST $IDT_OPT $PS_OPT -m $OWD -d $START -T $TP -t $DURATION -x $RECV_FILE -l
itg_status=$?
end=$(date +%s)
diff=$(( $end - $start ))
if [ $itg_status = 0 ] ; then
echo_success "[$end] test_$i.$j passed"
echo "[$end] test_$i.$j passed" >> ./results/$LOG_FILE
STATUS="PASSED"
else
let e++;
echo_error "[$end] test_$i.$j failed :: D-ITG return exit code $itg_status"
echo "[$end]test_$i.$j failed :: ITG return exit code $itg_status" >> ./results/$LOG_FILE
STATUS="FAILED"
fi
echo_info "End test_$i.$j:: runtime: $diff"
echo "End test_$i.$j:: runtime: $diff" >> results/${oai_exp_date}
done
done
}
itg_decode(){
declare i=0
declare j=0
if [ $TEST_MODE = 0 ] ; then
declare -a PS=(32 64 128 256 512 1024 1408)
declare -a IDT=(1 5 10 50 100 1000)
else
declare -a PS=(32 64)
declare -a IDT=(1)
fi
for idt in ${IDT[@]}; do
for ps in ${PS[@]}; do
RECV_FILE="recv_log_${IDT_DIST}_idt${idt}_${PS_DIST}_ps${ps}_${OWD}_${TP}"
OUTPUT_FILE="results_${IDT_DIST}_idt${idt}_${PS_DIST}_ps${ps}_${OWD}_${TP}.txt"
OCTAVE_FILE="results_${IDT_DIST}_idt${idt}_${PS_DIST}_ps${ps}_${OWD}_${TP}.."
echo_info "decode test_$i.$j: ITGDec $RECV_FILE -v -t -l $OUTPUT_FILE -o $OCTAVE_FILE"
ITGDec $RECV_FILE -v -t -l $OUTPUT_FILE
done
done
}
ping_stats(){
status="failed"
failedhosts=""
# add ip / hostname separated by white space
if [ $TEST_MODE = 0 ]; then
declare COUNT=100
declare -a HOSTS=($DST)
declare -a PS=(64 768 2048 4096 8192)
declare -a IDT=(1 .8 .4 .2)
else
declare COUNT=10
declare -a HOSTS=(localhost)
declare -a PS=(64 2048)
declare -a IDT=(.5)
fi
declare i=0
declare j=0
declare k=0
start_exp=$(date +%s)
for host in ${HOSTS[@]}; do
let i++;
let j=0;
OUTPUT_FILE="rtt_host${host}.csv"
touch results/${OUTPUT_FILE}
for idt in ${IDT[@]}; do
let j++;
let k=0;
for ps in ${PS[@]}; do
let k++;
# | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')
start=$(date +%s)
LOG_FILE="recv_log_host${host}_idt${idt}_ps${ps}.txt"
touch results/${LOG_FILE}
echo_info "Start test_$i.$j.$k:: ping -c $COUNT -q -U $host -s $ps -i $idt"
echo "Start test_$i.$j.$k:: ping -c $COUNT -q -U $host -s $ps -i $idt" >> results/${oai_exp_date}
$(ping -c $COUNT -q -U $host -s $ps -i $idt 1>&2 >> ./results/$LOG_FILE )
end=$(date +%s)
diff=$(( $end - $start ))
count=$(cat ./results/$LOG_FILE | awk -F, '/received/{print $2*1}')
latency=$(cat ./results/$LOG_FILE | tail -1 |cut -f2- -d=)
MIN=$(cut -f1 -d/ <<< $latency)
AVG=$(cut -f2 -d/ <<< $latency)
MAX=$(cut -f3 -d/ <<< $latency)
MDEV=$(cut -f4 -d/ <<< $latency | cut -f1 -d" ")
UNIT=$(cut -f2 -d" " <<< $latency)
echo_success "Latency:: count $count min $MIN avg $AVG max $MAX mdev $MDEV ($UNIT)"
echo "$idt;$ps;$COUNT;$count;$MIN;$AVG;$MAX;$MDEV;" >> ./results/$OUTPUT_FILE
if [ $count -eq 0 ]; then
failedhosts="$failedhosts $host"
status="failed"
else
status="passed"
fi
echo_info "End test_$i.$j.$k:: runtime: $diff :: status $status "
echo "End test_$i.$j.$k:: runtime: $diff :; status $status" >> results/${oai_exp_date}
done
done
done
end_exp=$(date +%s)
diff_exp=$(( $end_exp - $start_exp ))
let total_tests=i*j*k;
echo_info "total tests: $total_tests for a duration $diff_exp (s)"
}
oaisim_otg_stats(){
# install the required packages
$SUDO apt-get install -y test_install_package octave >> results/perf_log.txt 2>&1
$SUDO pkill oaisim
$SUDO pkill oaisim_nos1
$SUDO rmmod nasmesh > /dev/null 2>&1
echo_success "Bringup UE interface..."
$SUDO insmod $OPENAIR_DIR/targets/bin/nasmesh.ko
sync
if [ ! -f $OAISIM_EXEC ]; then
echo_info "3.1 compiling OAISIM ($OPENAIR_TARGETS/cmake_targets/build_oai --oaisim -c)"
($OPENAIR_TARGETS/cmake_targets/build_oai --oaisim -c >> results/perf_log.txt 2>&1 )
build_stats=$?
if [ $build_stats != 0 ] ; then
echo_error "$OAISIM_EXEC cannot be built, check results/perf_log.txt file"
exit $?
fi
else
echo_info "ensure that OAISIM is not built with the S1 interface"
fi
if [ ! -f $OTGPLOT ]; then
echo_error "$OTGPLOT not found"
exit $?
fi
# Set the default Parameters
ABSTRACTION=1
#FRAME_TYPE=0 # FDD=0, TDD =1, 2,3,4,5,6
AGGR_RESULT=1
STATUS="PASSED"
EXTRA_STATS=0
declare NUM_UES=7
if [ $TEST_MODE = 0 ]; then
declare -a TEMPLATES=(120 121 122 123 124 125 126 127 128 129 130)
declare -a FRAME_TYPE=(0 3)
declare -a METRICS=(latency jitter goodput)
declare -a RB=(25 50 100)
else
declare -a TEMPLATES=(125)
declare -a FRAME_TYPE=(3)
declare -a METRICS=(latency)
declare -a RB=(25)
fi
if [ $ABSTRACTION = 1 ]; then
OPT="-a "
fi
if [ $BYPASSE_ITTI = 0 ]; then
OPT="$OPT -O $ENB_CONFIG "
fi
declare num_cols=0
let num_cols=NUM_UES+1
if [ $AGGR_RESULT = 1 ]; then
COLUMN="[$num_cols:$num_cols]"
else
COLUMN="[1:$num_cols]"
fi
declare i=0
declare j=0
declare k=0
declare e=0
start_exp=$(date +%s)
for template in ${TEMPLATES[@]}; do
let i++;
let j=0;
for frame in ${FRAME_TYPE[@]}; do
let j++;
let k=0;
if [ $frame = 0 ]; then
OPT="$OPT -F "
else
OPT="$OPT -C $frame "
fi
for rb in ${RB[@]}; do
let k++;
start=$(date +%s)
LOG_FILE="oaisim_log_template${template}_frame${frame}_rb${rb}.txt"
touch results/${LOG_FILE}
echo_info "[$start] Start test_$i.$j.$k:: $OAISIM_EXEC $OPT -R $RB -c $template"
echo "Start test_$i.$j.$k:: $OAISIM_EXEC $OPT -R $RB -c $template" >> results/${oai_exp_date}
#sleep 1
$OAISIM_EXEC $OPT -R $RB -c $template 1>&2 >> ./results/$LOG_FILE
# store exit status
oai_status=$?
end=$(date +%s)
diff=$(( $end - $start ))
#check the oaisim exit status
if [ $oai_status = 0 ] ; then
echo_success "[$end] test_$i.$j.$k passed"
echo "[$end] test_$i.$j.$k passed" >> ./results/$LOG_FILE
STATUS="PASSED"
else
let e++;
echo_error "[$end] test_$i.$j.$k failed :: OAISIM return exit code $oai_status (remove bin/oaisim)"
echo "[$end]test_$i.$j.$k failed :: OAISIM return exit code $oai_status" >> ./results/$LOG_FILE
STATUS="FAILED"
fi
# create the curves
for metric in ${METRICS[@]}; do
if [ $metric = "goodput" ]; then
unit="(kB/s)"
else
unit="(ms)"
fi
if [ -f /tmp/otg_${metric}.dat ]; then
export TITLE="Application $metric $unit"
cp /tmp/otg_${metric}.dat ./results/otg-${metric}-template${template}-frame${frame}-rb${rb}.dat
echo_info "$OTGPLOT ./results/otg-${metric}-template${template}-frame${frame}-rb${rb}.dat $COLUMN"
echo "$OTGPLOT ./results/otg-${metric}-template${template}-frame${frame}-rb${rb}.dat $COLUMN" >> results/${oai_exp_date}
$($OTGPLOT ./results/otg-${metric}-template${template}-frame${frame}-rb${rb}.dat $COLUMN 1>&2 >> ./results/$LOG_FILE )
$($PS2PDF -dOptimize=true -dEmbedAllFonts=true ./otg-${metric}-template${template}-frame${frame}-rb${rb}.eps )
# remove the first line of the file
echo "$(tail -n+2 ./results/otg-${metric}-template${template}-frame${frame}-rb${rb}.dat)" > ./results/otg-${metric}-template${template}-frame${frame}-rb${rb}.dat
else
echo_error "file /tmp/otg_${metric}.dat does not exists"
fi
done
if [ $KEEP_LOG_FILESNUM_PKTS = 0 ]; then
rm -f ./results/$LOG_FILE
fi
mv *.eps ./results/
mv *.pdf ./results/
mv /tmp/otg.log ./results/otg-template${template}-frame${frame}-rb${rb}.log
echo_info "End test_$i.$j.$k:: runtime: $diff :: status $STATUS"
echo "End test_$i.$j.$k:: runtime: $diff :: status $STATUS" >> results/${oai_exp_date}
done
done
done
end_exp=$(date +%s)
diff_exp=$(( $end_exp - $start_exp ))
let total_tests=i*j*k;
echo_info "total tests: $total_tests for a duration $diff_exp (s) error ($e)"
echo "total tests: $total_tests for a duration $diff_exp (s) error ($e)" >> results/${oai_exp_date}
}
cba_otg_stats(){
test_install_package octave
ABSTRACTION=1
FRAME_TYPE=0 # FDD=0, TDD =1
AGGR_RESULT=1
#OAISIM="$OPENAIR_TARGETS/bin/oaisim"
OAISIM="bin/oaisim.cba" # to compile: make cleanall; make Rel10=1 CBA=1 in targets/SIMU/USER
OTGPLOT="$OPENAIR2_DIR/UTIL/OTG/OTGplot"
PS2PDF="ps2pdf"
STATUS="PASSED"
EXTRA_STATS=0
declare NUM_UES=7
if [ $TEST_MODE = 0 ]; then
declare -a TEMPLATES=(120 121 122 123 124 125 126 127 128 129 130)
declare -a CBA=(0 1 2 3 4)
declare -a BACKOFF=(0 15 30 60 120)
declare -a METRICS=(latency jitter goodput)
declare -a RB=(25)
else
declare -a TEMPLATES=(125)
declare -a CBA=(1)
declare -a BACKOFF=(0 15 30 60 120)
declare -a METRICS=(latency)
declare -a RB=(25)
fi
if [ ! -f $OAISIM_EXEC ]; then
echo_error "$OAISIM_EXEC not found"
exit $?
fi
if [ ! -f $OTGPLOT ]; then
echo_error "$OTGPLOT not found"
exit $?
fi
if [ $ABSTRACTION = 1 ]; then
OPT="-a "
fi
if [ $FRAME_TYPE = 0 ]; then
OPT="$OPT -F "
fi
declare num_cols=0
let num_cols=NUM_UES+1
if [ $AGGR_RESULT = 1 ]; then
COLUMN="[$num_cols:$num_cols]"
else
COLUMN="[1:$num_cols]"
fi
declare collision=0
declare enb_cba_access=0
declare ue_cba_access=0
declare missed=0
declare unused=0
declare i=0
declare j=0
declare k=0
declare e=0
start_exp=$(date +%s)
STATS1="cba_stats1.txt"
touch results/${STATS1}
for template in ${TEMPLATES[@]}; do
let i++;
let j=0;
for group in ${CBA[@]}; do
let j++;
let k=0;
for backoff in ${BACKOFF[@]}; do
let k++;
start=$(date +%s)
LOG_FILE="oaisim_log_template${template}_group${group}_backoff${backoff}.txt"
touch results/${LOG_FILE}
echo_info "[$start] Start test_$i.$j.$k:: $OAISIM_EXEC $OPT -w $group -R $RB --cba-backoff $backoff -c $template"
echo "Start test_$i.$j.$k:: $OAISIM_EXEC $OPT -w $group -R $RB --cba-backoff $backoff -c $template" >> results/${oai_exp_date}
#sleep 1
$OAISIM_EXEC $OPT -w $group -R $RB --cba-backoff $backoff -c $template 1>&2 >> ./results/$LOG_FILE
# store exit status
oai_status=$?
end=$(date +%s)
diff=$(( $end - $start ))
#check the oaisim exit status
if [ $oai_status = 0 ] ; then
echo_success "[$end] test_$i.$j.$k passed"
echo "[$end] test_$i.$j.$k passed" >> ./results/$LOG_FILE
STATUS="PASSED"
else
let e++;
echo_error "[$end] test_$i.$j.$k failed :: OAISIM return exit code $oai_status"
echo "[$end]test_$i.$j.$k failed :: OAISIM return exit code $oai_status" >> ./results/$LOG_FILE
STATUS="FAILED"
fi
if [ $group -gt 0 ]; then
let ue_cba_access=$(cat ./results/$LOG_FILE | grep -c "CBA transmission oppurtunity" )
let enb_cba_access=$(cat ./results/$LOG_FILE | grep -c "schedule CBA access" )
let missed=$(cat ./results/$LOG_FILE | grep -c "wait for backoff to expire" )
let unused=enb_cba_access-ue_cba_access;
let collision=$(cat ./results/$LOG_FILE | grep -c "first CBA collision detected" )
#frame, subframe, ue, group
#collision_stats=$(cat ./results/$LOG_FILE | grep "collision" | cut -d " " -f3,5,12,15 )
if [ $EXTRA_STATS = 1 ]; then
STATS2="cba_template_${template}_stats2.txt"
touch results/${STATS2}
while read -r line
do
SFN=$(cut -f1 -d " " <<< $line)
SSFN=$(cut -f2 -d " " <<< $line)
UEID=$(cut -f3 -d " " <<< $line)
GPID=$(cut -f4 -d " " <<< $line)
#echo_success "$SFN;$SSFN;$UEID;$GPID;"
echo "$SFN;$SSFN;$UEID;$GPID;" >> ./results/$STATS2
done < <(cat ./results/$LOG_FILE | grep "CBA collision set SR for UE" | cut -d " " -f3,5,13,16 )
fi
echo_success "CBA stats:: template $template;group $group; backoff $backoff; enb cba allocation $enb_cba_access; ue cba access $ue_cba_access; collision $collision; missed $missed; unused $unused;"
echo "$template;$group;$backoff;$enb_cba_access;$ue_cba_access;$collision;$missed;$unused;" >> ./results/$STATS1
fi
# create the curves
for metric in ${METRICS[@]}; do
if [ $metric = "goodput" ]; then
unit="(kB/s)"
else
unit="(ms)"
fi
if [ -f /tmp/otg_${metric}.dat ]; then
export TITLE="Application $metric $unit"
cp /tmp/otg_${metric}.dat ./results/otg-${metric}-template${template}-group${group}-backoff${backoff}.dat
echo_info "$OTGPLOT ./results/otg-${metric}-template${template}-group${group}-backoff${backoff}.dat $COLUMN"
echo "$OTGPLOT ./results/otg-${metric}-template${template}-group${group}-backoff${backoff}.dat $COLUMN" >> results/${oai_exp_date}
$($OTGPLOT ./results/otg-${metric}-template${template}-group${group}-backoff${backoff}.dat $COLUMN 1>&2 >> ./results/$LOG_FILE )
$($PS2PDF -dOptimize=true -dEmbedAllFonts=true ./otg-${metric}-template${template}-group${group}-backoff${backoff}.eps )
# remove the first line of the file
echo "$(tail -n+2 ./results/otg-${metric}-template${template}-group${group}-backoff${backoff}.dat)" > ./results/otg-${metric}-template${template}-group${group}-backoff${backoff}.dat
else
echo_error "file /tmp/otg_${metric}.dat does not exists"
fi
done
if [ $KEEP_LOG_FILESNUM_PKTS = 0 ]; then
rm -f ./results/$LOG_FILE
fi
mv *.eps ./results/
mv *.pdf ./results/
mv /tmp/otg.log ./results/otg-template${template}-group${group}-backoff${backoff}.log
echo_info "End test_$i.$j.$k:: runtime: $diff :: status $STATUS"
echo "End test_$i.$j.$k:: runtime: $diff :: status $STATUS" >> results/${oai_exp_date}
# backoff not required when CBA is not used
if [ $group -eq 0 ]; then
break;
fi
done
done
done