Nix integration

This commit is contained in:
Loic Guegan 2019-05-04 10:32:19 +02:00
parent 89a5ee979d
commit f6d01996eb
18 changed files with 616 additions and 24 deletions

View file

@ -39,11 +39,22 @@ component, formatting, style, styling, insert
** Cloud Infrastructure
* System Model
** IoT Part
The IoT part is composed of an Access Point (AP), connected to several sensors using WIFI. In the
system, the IoT part is considered as the part where the system data are created. In fact, the
data life cycle start when the sensors records their respectives local temperature at a frequency
$f$ and the local timestamp. Then, these data are transmitted through the network along with an
arbitrary sensor id of 128 bits. Finally, the AP is in charge to transmit the data to the cloud
using the network part.
** Network Part
The network part is considered as the medium that link the IoT part to the cloud. It is composed
of several network switches and router and it is considered to be a wired network.
** Cloud Part
* Evaluation
** IoT/Network Consumption
** Cloud Consmption
** Cloud Energy Consumption
** Virtual Machine Size Impact
** Application Accuracy
Refresh frequency etc...

Binary file not shown.

View file

@ -36,38 +36,49 @@ component, formatting, style, styling, insert
\section{Introduction}
\label{sec:org9f2a447}
\label{sec:org9428352}
\section{Related Work}
\label{sec:org3f89763}
\label{sec:orga22ca2a}
\section{Use-Case}
\label{sec:org465840a}
\label{sec:org3241664}
\subsection{Application Characteristic}
\label{sec:orgec764c1}
\label{sec:org8ebb00c}
\subsection{Cloud Infrastructure}
\label{sec:orgd297b7a}
\label{sec:org17d08e8}
\section{System Model}
\label{sec:orgb795527}
\label{sec:org2051e46}
\subsection{IoT Part}
\label{sec:org2cfffb6}
\label{sec:org9fc7024}
The IoT part is composed of an Access Point (AP), connected to several sensors using WIFI. In the
system, the IoT part is considered as the part where the system data are created. In fact, the
data life cycle start when the sensors records their respectives local temperature at a frequency
\(f\) and the local timestamp. Then, these data are transmitted through the network along with an
arbitrary sensor id of 128 bits. Finally, the AP is in charge to transmit the data to the cloud
using the network part.
\subsection{Network Part}
\label{sec:orgc144d77}
\label{sec:orgb1e4614}
The network part is considered as the medium that link the IoT part to the cloud. It is composed
of several network switches and router and it is mostly considered as wired network.
\subsection{Cloud Part}
\label{sec:org39e083c}
\label{sec:org4dad506}
\section{Evaluation}
\label{sec:org0d3d97d}
\label{sec:org373c2b1}
\subsection{IoT/Network Consumption}
\label{sec:orgcb0df05}
\subsection{Cloud Consmption}
\label{sec:org4ed126a}
\label{sec:org993439d}
\subsection{Cloud Energy Consumption}
\label{sec:org7ae8276}
\subsection{Virtual Machine Size Impact}
\label{sec:org9aec0d5}
\label{sec:orgde03152}
\subsection{Application Accuracy}
\label{sec:org88409a4}
\label{sec:org79ddac3}
Refresh frequency etc\ldots{}
\subsection{End-To-End Consumption}
\label{sec:org1492f49}
\label{sec:org275997a}
\section{Discussion}
\label{sec:org6627b27}
\label{sec:org25eaadf}
\section{Conclusion}
\label{sec:org0643947}
\label{sec:orgff11457}
\end{document}

309
ns3-simulations/g5k-root.sh Executable file
View file

@ -0,0 +1,309 @@
#!/bin/bash
##### Arguments #####
nHost=15
nProcesses=8 # Max number of parrallel simulations
nHours=3 # Reservation duration
simArgsLoc=~/args/ # Don't change this path witouth changing it in workder scripts
finishedFile="$simArgsLoc/finished-microBenchmarks.txt"
logsFinalDst=~/logs/
#####################
# Check
[ "$1" == "subscribe" ] && subscribe=1 ||subscribe=0
[ "$1" == "deploy" ] && deploy=1 || deploy=0
[ "$1" == "-p" ] && progress=1 || progress=0
handleSim () {
outF="$simArgsLoc/$(uuidgen).sh" # Args file based on host name (avoid conflict)
# Add Shebang
echo '#!/bin/bash' > $outF
echo "finishedFile=\"$finishedFile\"" >> $outF
echo "nProcesses=$nProcesses" >> $outF
echo "logsFinalDst=\"$logsFinalDst\"" >> $outF
# Save arguments
echo "sensorsSendInterval=${sensorsSendInterval}" >> $outF
echo "sensorsPktSize=${sensorsPktSize}" >> $outF
echo "nbHop=${nbHop}" >> $outF
echo "simKey=\"${simKey}\"" >> $outF
echo "sensorsNumber=${sensorsNumber}" >> $outF
echo "linksLatency=${linksLatency}" >> $outF
echo "sensorsNumber=${sensorsNumber}" >> $outF
echo "linksBandwidth=${linksBandwidth}" >> $outF
}
# Start subscribe/deploy
if [ $subscribe -eq 1 ]
then
echo "Starting oarsub..."
oarsub -l host=$nHost,walltime=$nHours 'sleep "10d"' # Start reservation
echo "Please join your node manually when your reservation is ready by using oarsub -C <job-id>"
exit 0
elif [ $deploy -eq 1 ]
then
echo "Starting deployment..."
##### Usefull Variables #####
wai=$(dirname "$(readlink -f $0)") # Where Am I ?
hostList=($(cat $OAR_NODE_FILE | uniq))
#############################
# Initialize logsFinalDst
mkdir -p $logsFinalDst
rm -rf $logsFinalDst/* # Clean log dst just in case (it is dangerous but avoid conflict)
mkdir -p $simArgsLoc
rm -rf $simArgsLoc/* # Clean old args
# Add your simulation code block here
simulator="simulator/simulator"
parseEnergyScript="./parseEnergy.awk"
parseDelayScript="./parseDelay.awk"
logFolder="logs/"
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${NS3_PATH}/build/lib
# Default Parameters
sensorsSendInterval=10
sensorsPktSize=5 # 1 byte temperature (-128 à +128 °C) and 4Byte sensorsId
sensorsNumber=10
nbHop=10 # Cf paper AC/Yunbo
linksBandwidth=10
linksLatency=2
simKey="NOKEY"
run () {
# If another function want to handle simulation (tipically used on g5k)
type -t handleSim > /dev/null && { handleSim; return; }
logFile="${logFolder}/${simKey}_${sensorsSendInterval}SSI_${sensorsPktSize}SPS_${sensorsNumber}SN_${nbHop}NH_${linksBandwidth}LB_${linksLatency}LL.org"
[ -f "$logFile" ] && return
simCMD="$simulator --sensorsSendInterval=${sensorsSendInterval} --sensorsPktSize=${sensorsPktSize} --sensorsNumber=${sensorsNumber} --nbHop=${nbHop} --linksBandwidth=${linksBandwidth} --linksLatency=${linksLatency} 2>&1"
log=$(bash -c "$simCMD")
# Compute some metrics
energyLog=$(echo "$log" | $parseEnergyScript)
avgDelay=$(echo "$log" | $parseDelayScript)
totalEnergy=$(echo "$energyLog"| awk 'BEGIN{power=0;FS=","}NR!=1{power+=$2}END{print(power)}')
nbPacketCloud=$(echo "$log"|grep -c "CloudSwitch receive")
nbNodes=$(echo "$log"|awk '/Simulation used/{print($3)}')
ns3Version=$(echo "$log"|awk '/NS-3 Version/{print($3)}')
# Save logs
echo -e "#+TITLE: $(date) ns-3 (version ${ns3Version}) simulation\n" > $logFile
echo "* Environment Variables" >> $logFile
env >> $logFile
echo "* Full Command" >> $logFile
echo "$simCMD" >> $logFile
echo "* Output" >> $logFile
echo "$log" >> $logFile
echo "* Energy CSV (negative nodeId = WIFI, 0 = AP (Wireless+Wired), positive nodeId = ECOFEN" >> $logFile
echo "$energyLog" >> $logFile
echo "* Metrics" >> $logFile
echo "-METRICSLINE- sensorsSendInterval:${sensorsSendInterval} sensorsPktSize:${sensorsPktSize} sensorsNumber:${sensorsNumber} nbHop:${nbHop} linksBandwidth:${linksBandwidth} linksLatency:${linksLatency} totalEnergy:$totalEnergy nbPacketCloud:$nbPacketCloud nbNodes:$nbNodes avgDelay:${avgDelay} ns3Version:${ns3Version} simKey:${simKey}" >> $logFile
}
simKey="NBHOP"
for sensorsNumber in $(seq 1 15)
do
for nbHop in $(seq 1 10)
do
run
done
done
simulator="simulator/simulator"
parseEnergyScript="./parseEnergy.awk"
parseDelayScript="./parseDelay.awk"
logFolder="logs/"
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${NS3_PATH}/build/lib
# Default Parameters
sensorsSendInterval=10
sensorsPktSize=5 # 1 byte temperature (-128 à +128 °C) and 4Byte sensorsId
sensorsNumber=10
nbHop=10 # Cf paper AC/Yunbo
linksBandwidth=10
linksLatency=2
simKey="NOKEY"
run () {
# If another function want to handle simulation (tipically used on g5k)
type -t handleSim > /dev/null && { handleSim; return; }
logFile="${logFolder}/${simKey}_${sensorsSendInterval}SSI_${sensorsPktSize}SPS_${sensorsNumber}SN_${nbHop}NH_${linksBandwidth}LB_${linksLatency}LL.org"
[ -f "$logFile" ] && return
simCMD="$simulator --sensorsSendInterval=${sensorsSendInterval} --sensorsPktSize=${sensorsPktSize} --sensorsNumber=${sensorsNumber} --nbHop=${nbHop} --linksBandwidth=${linksBandwidth} --linksLatency=${linksLatency} 2>&1"
log=$(bash -c "$simCMD")
# Compute some metrics
energyLog=$(echo "$log" | $parseEnergyScript)
avgDelay=$(echo "$log" | $parseDelayScript)
totalEnergy=$(echo "$energyLog"| awk 'BEGIN{power=0;FS=","}NR!=1{power+=$2}END{print(power)}')
nbPacketCloud=$(echo "$log"|grep -c "CloudSwitch receive")
nbNodes=$(echo "$log"|awk '/Simulation used/{print($3)}')
ns3Version=$(echo "$log"|awk '/NS-3 Version/{print($3)}')
# Save logs
echo -e "#+TITLE: $(date) ns-3 (version ${ns3Version}) simulation\n" > $logFile
echo "* Environment Variables" >> $logFile
env >> $logFile
echo "* Full Command" >> $logFile
echo "$simCMD" >> $logFile
echo "* Output" >> $logFile
echo "$log" >> $logFile
echo "* Energy CSV (negative nodeId = WIFI, 0 = AP (Wireless+Wired), positive nodeId = ECOFEN" >> $logFile
echo "$energyLog" >> $logFile
echo "* Metrics" >> $logFile
echo "-METRICSLINE- sensorsSendInterval:${sensorsSendInterval} sensorsPktSize:${sensorsPktSize} sensorsNumber:${sensorsNumber} nbHop:${nbHop} linksBandwidth:${linksBandwidth} linksLatency:${linksLatency} totalEnergy:$totalEnergy nbPacketCloud:$nbPacketCloud nbNodes:$nbNodes avgDelay:${avgDelay} ns3Version:${ns3Version} simKey:${simKey}" >> $logFile
}
simKey="BW"
for sensorsNumber in $(seq 1 15)
do
for linksBandwidth in $(seq 10 20 100)
do
run
done
done
simulator="simulator/simulator"
parseEnergyScript="./parseEnergy.awk"
parseDelayScript="./parseDelay.awk"
logFolder="logs/"
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${NS3_PATH}/build/lib
# Default Parameters
sensorsSendInterval=10
sensorsPktSize=5 # 1 byte temperature (-128 à +128 °C) and 4Byte sensorsId
sensorsNumber=10
nbHop=10 # Cf paper AC/Yunbo
linksBandwidth=10
linksLatency=2
simKey="NOKEY"
run () {
# If another function want to handle simulation (tipically used on g5k)
type -t handleSim > /dev/null && { handleSim; return; }
logFile="${logFolder}/${simKey}_${sensorsSendInterval}SSI_${sensorsPktSize}SPS_${sensorsNumber}SN_${nbHop}NH_${linksBandwidth}LB_${linksLatency}LL.org"
[ -f "$logFile" ] && return
simCMD="$simulator --sensorsSendInterval=${sensorsSendInterval} --sensorsPktSize=${sensorsPktSize} --sensorsNumber=${sensorsNumber} --nbHop=${nbHop} --linksBandwidth=${linksBandwidth} --linksLatency=${linksLatency} 2>&1"
log=$(bash -c "$simCMD")
# Compute some metrics
energyLog=$(echo "$log" | $parseEnergyScript)
avgDelay=$(echo "$log" | $parseDelayScript)
totalEnergy=$(echo "$energyLog"| awk 'BEGIN{power=0;FS=","}NR!=1{power+=$2}END{print(power)}')
nbPacketCloud=$(echo "$log"|grep -c "CloudSwitch receive")
nbNodes=$(echo "$log"|awk '/Simulation used/{print($3)}')
ns3Version=$(echo "$log"|awk '/NS-3 Version/{print($3)}')
# Save logs
echo -e "#+TITLE: $(date) ns-3 (version ${ns3Version}) simulation\n" > $logFile
echo "* Environment Variables" >> $logFile
env >> $logFile
echo "* Full Command" >> $logFile
echo "$simCMD" >> $logFile
echo "* Output" >> $logFile
echo "$log" >> $logFile
echo "* Energy CSV (negative nodeId = WIFI, 0 = AP (Wireless+Wired), positive nodeId = ECOFEN" >> $logFile
echo "$energyLog" >> $logFile
echo "* Metrics" >> $logFile
echo "-METRICSLINE- sensorsSendInterval:${sensorsSendInterval} sensorsPktSize:${sensorsPktSize} sensorsNumber:${sensorsNumber} nbHop:${nbHop} linksBandwidth:${linksBandwidth} linksLatency:${linksLatency} totalEnergy:$totalEnergy nbPacketCloud:$nbPacketCloud nbNodes:$nbNodes avgDelay:${avgDelay} ns3Version:${ns3Version} simKey:${simKey}" >> $logFile
}
simKey="LATENCY"
for sensorsNumber in $(seq 1 15)
do
for linksLatency in $(seq 1 1 10)
do
run
done
done
simulator="simulator/simulator"
parseEnergyScript="./parseEnergy.awk"
parseDelayScript="./parseDelay.awk"
logFolder="logs/"
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${NS3_PATH}/build/lib
# Default Parameters
sensorsSendInterval=10
sensorsPktSize=5 # 1 byte temperature (-128 à +128 °C) and 4Byte sensorsId
sensorsNumber=10
nbHop=10 # Cf paper AC/Yunbo
linksBandwidth=10
linksLatency=2
simKey="NOKEY"
run () {
# If another function want to handle simulation (tipically used on g5k)
type -t handleSim > /dev/null && { handleSim; return; }
logFile="${logFolder}/${simKey}_${sensorsSendInterval}SSI_${sensorsPktSize}SPS_${sensorsNumber}SN_${nbHop}NH_${linksBandwidth}LB_${linksLatency}LL.org"
[ -f "$logFile" ] && return
simCMD="$simulator --sensorsSendInterval=${sensorsSendInterval} --sensorsPktSize=${sensorsPktSize} --sensorsNumber=${sensorsNumber} --nbHop=${nbHop} --linksBandwidth=${linksBandwidth} --linksLatency=${linksLatency} 2>&1"
log=$(bash -c "$simCMD")
# Compute some metrics
energyLog=$(echo "$log" | $parseEnergyScript)
avgDelay=$(echo "$log" | $parseDelayScript)
totalEnergy=$(echo "$energyLog"| awk 'BEGIN{power=0;FS=","}NR!=1{power+=$2}END{print(power)}')
nbPacketCloud=$(echo "$log"|grep -c "CloudSwitch receive")
nbNodes=$(echo "$log"|awk '/Simulation used/{print($3)}')
ns3Version=$(echo "$log"|awk '/NS-3 Version/{print($3)}')
# Save logs
echo -e "#+TITLE: $(date) ns-3 (version ${ns3Version}) simulation\n" > $logFile
echo "* Environment Variables" >> $logFile
env >> $logFile
echo "* Full Command" >> $logFile
echo "$simCMD" >> $logFile
echo "* Output" >> $logFile
echo "$log" >> $logFile
echo "* Energy CSV (negative nodeId = WIFI, 0 = AP (Wireless+Wired), positive nodeId = ECOFEN" >> $logFile
echo "$energyLog" >> $logFile
echo "* Metrics" >> $logFile
echo "-METRICSLINE- sensorsSendInterval:${sensorsSendInterval} sensorsPktSize:${sensorsPktSize} sensorsNumber:${sensorsNumber} nbHop:${nbHop} linksBandwidth:${linksBandwidth} linksLatency:${linksLatency} totalEnergy:$totalEnergy nbPacketCloud:$nbPacketCloud nbNodes:$nbNodes avgDelay:${avgDelay} ns3Version:${ns3Version} simKey:${simKey}" >> $logFile
}
simKey="NBSENSORS"
for sensorsNumber in $(seq 1 5)
do
run
done
# Distribute argument according to subsribed nodes
cd $simArgsLoc
curHostId=0
for file in $(find ./ -type f)
do
[ $curHostId -eq $nHost ] && curHostId=0
mv -- ${file} ${hostList[$curHostId]}-$(basename ${file})
curHostId=$(( curHostId + 1 ))
done
cd -
# Run simulations
echo "Host who finished their work:" > $finishedFile
for host in ${hostList[@]}
do
#oarsh lguegan@$host bash g5k-worker.sh &
echo "$host"
done
exit 0
elif [ $progress -eq 1 ]
then
alreadyFinished=$(cat $finishedFile| tail -n +2| wc -l)
percent=$(echo $alreadyFinished $nHost| awk '{print $1/$2*100}')
echo "Progression: " $alreadyFinished/$nHost "(${percent}%)"
else
echo "Invalid arguments, make sure you know what you are doing !"
exit 1
fi

68
ns3-simulations/g5k-worker.sh Executable file
View file

@ -0,0 +1,68 @@
#!/bin/bash
g5kLogFolder="/tmp/logs/"
mkdir -p $g5kLogFolder # Create log folder just in case
rm -rf $g5kLogFolder/* # Clean previous logs just in case
hostname=$(hostname)
# Run simulations with sourced arguments :D
simArgsLoc=~/args/ # Don't change this path without changing it in root scripts
argsId=0
argsFile="$simArgsLoc/${hostname}-args-${argsId}.sh" # Arguments generated by Root Node
for argsFile in $(find $simArgsLoc -type f -name "$hostname*")
do
simulator="simulator/simulator"
parseEnergyScript="./parseEnergy.awk"
parseDelayScript="./parseDelay.awk"
logFolder="logs/"
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${NS3_PATH}/build/lib
# Default Parameters
sensorsSendInterval=10
sensorsPktSize=5 # 1 byte temperature (-128 à +128 °C) and 4Byte sensorsId
sensorsNumber=10
nbHop=10 # Cf paper AC/Yunbo
linksBandwidth=10
linksLatency=2
simKey="NOKEY"
run () {
# If another function want to handle simulation (tipically used on g5k)
type -t handleSim > /dev/null && { handleSim; return; }
logFile="${logFolder}/${simKey}_${sensorsSendInterval}SSI_${sensorsPktSize}SPS_${sensorsNumber}SN_${nbHop}NH_${linksBandwidth}LB_${linksLatency}LL.org"
[ -f "$logFile" ] && return
simCMD="$simulator --sensorsSendInterval=${sensorsSendInterval} --sensorsPktSize=${sensorsPktSize} --sensorsNumber=${sensorsNumber} --nbHop=${nbHop} --linksBandwidth=${linksBandwidth} --linksLatency=${linksLatency} 2>&1"
log=$(bash -c "$simCMD")
# Compute some metrics
energyLog=$(echo "$log" | $parseEnergyScript)
avgDelay=$(echo "$log" | $parseDelayScript)
totalEnergy=$(echo "$energyLog"| awk 'BEGIN{power=0;FS=","}NR!=1{power+=$2}END{print(power)}')
nbPacketCloud=$(echo "$log"|grep -c "CloudSwitch receive")
nbNodes=$(echo "$log"|awk '/Simulation used/{print($3)}')
ns3Version=$(echo "$log"|awk '/NS-3 Version/{print($3)}')
# Save logs
echo -e "#+TITLE: $(date) ns-3 (version ${ns3Version}) simulation\n" > $logFile
echo "* Environment Variables" >> $logFile
env >> $logFile
echo "* Full Command" >> $logFile
echo "$simCMD" >> $logFile
echo "* Output" >> $logFile
echo "$log" >> $logFile
echo "* Energy CSV (negative nodeId = WIFI, 0 = AP (Wireless+Wired), positive nodeId = ECOFEN" >> $logFile
echo "$energyLog" >> $logFile
echo "* Metrics" >> $logFile
echo "-METRICSLINE- sensorsSendInterval:${sensorsSendInterval} sensorsPktSize:${sensorsPktSize} sensorsNumber:${sensorsNumber} nbHop:${nbHop} linksBandwidth:${linksBandwidth} linksLatency:${linksLatency} totalEnergy:$totalEnergy nbPacketCloud:$nbPacketCloud nbNodes:$nbNodes avgDelay:${avgDelay} ns3Version:${ns3Version} simKey:${simKey}" >> $logFile
}
logFolder=$g5kLogFolder # Don't forget override default g5kLogFolder
source $argsFile # Fetch argument
run
done
cp -r $g5kLogFolder/* "$logsFinalDst" # Fetch log from tmp into nfs
echo $(hostname) >> $finishedFile # Just say I finished

View file

@ -0,0 +1,5 @@
with (import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/19.03.tar.gz") {});
rec {
ns3 = callPackage ./ns3 { inherit stdenv; inherit fetchurl; inherit python; inherit gsl; };
simulator = callPackage ./simulator { inherit stdenv; inherit ns3; };
}

View file

@ -0,0 +1,36 @@
{ stdenv, fetchurl, python, gsl }:
stdenv.mkDerivation rec {
##### Configure NIX #####
name="ns3";
sourceRoot="ns-allinone-3.29/ns-3.29/"; # Since we have 2 source tarball (ns-3 & ECOFEN) nix need to know which one to use
##### Fetch ns-3 And ECOFEN #####
src = [
(fetchurl {
url = https://www.nsnam.org/releases/ns-allinone-3.29.tar.bz2;
sha256 = "0m9dpmby116qk1m4x645i1p92syn30yzn9dgxxji5i25g30abpsd";
})
(fetchurl {
url = http://people.irisa.fr/Anne-Cecile.Orgerie/ECOFEN/ecofen-v2.tar.bz2;
sha256 = "1dnmm20ihas6hwwb8qbx8sr3h66nrg8h55x6f2aqpf3xima29dyh";
})
];
##### Configure Dependencies #####
buildInputs= [ python gsl ];
##### Configure Phases #####
postUnpack=''mv ecofen-module-v2 ${sourceRoot}/contrib/ecofen'';
configurePhase=''
export CXXFLAGS="-Wall -g -O0" # Don't treat warning as error when compiling ns-3
python2 waf configure
'';
buildPhase=''python2 waf'';
installPhase=''
mkdir -p $out/include
cp -r ./build/lib $out/
cp -r ./build/ns3 $out/include
'';
}

1
ns3-simulations/nix/result Symbolic link
View file

@ -0,0 +1 @@
/nix/store/c7vpaw8k0qvv1fzw5fz1vp5s13xyki2y-ns3

View file

@ -0,0 +1 @@
/nix/store/2srcpv0g78mz3xk2ycgq6da3sjfggzbb-simulator

View file

@ -0,0 +1,18 @@
{ stdenv, ns3 }:
stdenv.mkDerivation rec {
##### Configure NIX #####
name="simulator";
src=./src;
##### Export ns3 location #####
NS3_PATH=ns3;
##### Configure Phases #####
buildPhase=''make'';
installPhase=''
mkdir -p $out/bin
install -D -t $out/bin simulator
'';
}

View file

@ -2,9 +2,10 @@
EXEC=simulator
##### NS3 g++ Arguments
NS3_ARGS= -D NS3_LOG_ENABLE -L ${NS3_PATH}/build/lib -I ${NS3_PATH}/build/
NS3_ARGS+=$(addprefix -l, $(subst lib,,$(subst .so,,$(notdir $(wildcard ${NS3_PATH}/build/lib/*.so)))))
NS3_VERSION=$(shell cat ${NS3_PATH}/VERSION)
NS3_ARGS= -D NS3_LOG_ENABLE -L ${NS3_PATH}/lib -I ${NS3_PATH}/include
NS3_ARGS+=$(addprefix -l, $(subst lib,,$(subst .so,,$(notdir $(wildcard ${NS3_PATH}/lib/libns3*.so)))))
NS3_VERSION="3.29"
##### Source Files
SRC=main.cc modules/platform.cc modules/energy.cc modules/callbacks.cc
@ -14,9 +15,9 @@ all: $(EXEC)
$(EXEC): $(SRC)
@echo -e "\e[32mDon't forget to define NS3_PATH env variable !\e[0m"
g++ -D NS3_VERSION=${NS3_VERSION} $(NS3_ARGS) $(SRC) -o $@
g++ -g -D NS3_VERSION=${NS3_VERSION} $(NS3_ARGS) $(SRC) -o $@
@echo -e "\e[32mRun the following command before running $(EXEC):\e[0m"
@echo -e "\e[32mexport LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${NS3_PATH}/build/lib\e[0m"
@echo -e "\e[32mexport LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${NIX}/lib\e[0m"
clean:
- rm $(EXEC)

View file

@ -74,6 +74,7 @@
#+RESULTS: runNbHop
** Single Run
#+NAME: singleRun
@ -94,6 +95,9 @@
simKey="NOKEY"
run () {
# If another function want to handle simulation (tipically used on g5k)
type -t handleSim > /dev/null && { handleSim; return; }
logFile="${logFolder}/${simKey}_${sensorsSendInterval}SSI_${sensorsPktSize}SPS_${sensorsNumber}SN_${nbHop}NH_${linksBandwidth}LB_${linksLatency}LL.org"
[ -f "$logFile" ] && return
simCMD="$simulator --sensorsSendInterval=${sensorsSendInterval} --sensorsPktSize=${sensorsPktSize} --sensorsNumber=${sensorsNumber} --nbHop=${nbHop} --linksBandwidth=${linksBandwidth} --linksLatency=${linksLatency} 2>&1"
@ -124,6 +128,133 @@
#+END_SRC
** Grid 5000
*** Master Node Script
This code generate and distribute simulation argument to the slave worker nodes and
run start their simulations processes:
#+BEGIN_SRC sh :tangle ./g5k-root.sh :shebang "#!/bin/bash" :noweb yes
##### Arguments #####
nHost=15
nProcesses=8 # Max number of parrallel simulations
nHours=3 # Reservation duration
simArgsLoc=~/args/ # Don't change this path witouth changing it in workder scripts
finishedFile="$simArgsLoc/finished-microBenchmarks.txt"
logsFinalDst=~/logs/
#####################
# Check
[ "$1" == "subscribe" ] && subscribe=1 ||subscribe=0
[ "$1" == "deploy" ] && deploy=1 || deploy=0
[ "$1" == "-p" ] && progress=1 || progress=0
handleSim () {
outF="$simArgsLoc/$(uuidgen).sh" # Args file based on host name (avoid conflict)
# Add Shebang
echo '#!/bin/bash' > $outF
echo "finishedFile=\"$finishedFile\"" >> $outF
echo "nProcesses=$nProcesses" >> $outF
echo "logsFinalDst=\"$logsFinalDst\"" >> $outF
# Save arguments
echo "sensorsSendInterval=${sensorsSendInterval}" >> $outF
echo "sensorsPktSize=${sensorsPktSize}" >> $outF
echo "nbHop=${nbHop}" >> $outF
echo "simKey=\"${simKey}\"" >> $outF
echo "sensorsNumber=${sensorsNumber}" >> $outF
echo "linksLatency=${linksLatency}" >> $outF
echo "sensorsNumber=${sensorsNumber}" >> $outF
echo "linksBandwidth=${linksBandwidth}" >> $outF
}
# Start subscribe/deploy
if [ $subscribe -eq 1 ]
then
echo "Starting oarsub..."
oarsub -l host=$nHost,walltime=$nHours 'sleep "10d"' # Start reservation
echo "Please join your node manually when your reservation is ready by using oarsub -C <job-id>"
exit 0
elif [ $deploy -eq 1 ]
then
echo "Starting deployment..."
##### Usefull Variables #####
wai=$(dirname "$(readlink -f $0)") # Where Am I ?
hostList=($(cat $OAR_NODE_FILE | uniq))
#############################
# Initialize logsFinalDst
mkdir -p $logsFinalDst
rm -rf $logsFinalDst/* # Clean log dst just in case (it is dangerous but avoid conflict)
mkdir -p $simArgsLoc
rm -rf $simArgsLoc/* # Clean old args
# Add your simulation code block here
<<runNbHop>>
<<runBW>>
<<runLat>>
<<nbSens>>
<<runNbSensors>>
# Distribute argument according to subsribed nodes
cd $simArgsLoc
curHostId=0
for file in $(find ./ -type f)
do
[ $curHostId -eq $nHost ] && curHostId=0
mv -- ${file} ${hostList[$curHostId]}-$(basename ${file})
curHostId=$(( curHostId + 1 ))
done
cd -
# Run simulations
echo "Host who finished their work:" > $finishedFile
for host in ${hostList[@]}
do
#oarsh lguegan@$host bash g5k-worker.sh &
echo "$host"
done
exit 0
elif [ $progress -eq 1 ]
then
alreadyFinished=$(cat $finishedFile| tail -n +2| wc -l)
percent=$(echo $alreadyFinished $nHost| awk '{print $1/$2*100}')
echo "Progression: " $alreadyFinished/$nHost "(${percent}%)"
else
echo "Invalid arguments, make sure you know what you are doing !"
exit 1
fi
#+END_SRC
*** Worker Node Script
Almost like the [[microBenchmarksSingle][single run script]] but with additionnal code to handle g5k simulation platform (arguments,logs etc..).
#+BEGIN_SRC sh :tangle ./g5k-worker.sh :shebang "#!/bin/bash" :noweb yes
g5kLogFolder="/tmp/logs/"
mkdir -p $g5kLogFolder # Create log folder just in case
rm -rf $g5kLogFolder/* # Clean previous logs just in case
hostname=$(hostname)
# Run simulations with sourced arguments :D
simArgsLoc=~/args/ # Don't change this path without changing it in root scripts
argsId=0
argsFile="$simArgsLoc/${hostname}-args-${argsId}.sh" # Arguments generated by Root Node
for argsFile in $(find $simArgsLoc -type f -name "$hostname*")
do
<<singleRun>>
logFolder=$g5kLogFolder # Don't forget override default g5kLogFolder
source $argsFile # Fetch argument
run
done
cp -r $g5kLogFolder/* "$logsFinalDst" # Fetch log from tmp into nfs
echo $(hostname) >> $finishedFile # Just say I finished
#+END_SRC
* Logs Analysis
To Generate all the plots, please execute the following line:
#+NAME: runAnalysis

Binary file not shown.