diff options
19 files changed, 588 insertions, 78 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..01564af --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.tex diff --git a/2019-Mascots.org b/2019-Mascots.org index 93ec088..1debcd3 100644 --- a/2019-Mascots.org +++ b/2019-Mascots.org @@ -37,11 +37,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... diff --git a/2019-Mascots.pdf b/2019-Mascots.pdf Binary files differdeleted file mode 100644 index 3631889..0000000 --- a/2019-Mascots.pdf +++ /dev/null diff --git a/2019-Mascots.tex b/2019-Mascots.tex deleted file mode 100644 index dcd1c63..0000000 --- a/2019-Mascots.tex +++ /dev/null @@ -1,72 +0,0 @@ -% Intended LaTeX compiler: pdflatex -\documentclass[conference]{IEEEtran} - \usepackage{hyperref} -\IEEEoverridecommandlockouts -\author{\IEEEauthorblockN{1\textsuperscript{st} Anne-Cécile Orgerie} -\IEEEauthorblockA{\textit{Univ Rennes, Inria, CNRS, IRISA, Rennes, France} \\ -Rennes, France \\ -anne-cecile.orgerie@irisa.fr} -\and -\IEEEauthorblockN{2\textsuperscript{nd} Loic Guegan} -\IEEEauthorblockA{\textit{Univ Rennes, Inria, CNRS, IRISA, Rennes, France} \\ -Rennes, France \\ -loic.guegan@irisa.fr} -} -\usetheme{default} -\date{\today} -\title{Estimating the end-to-end energy consumption of IoT devices along with their impact on Cloud and telecommunication infrastructures} -\hypersetup{ - pdfauthor={Anne-Cecile Orgerie}, - pdftitle={Estimating the end-to-end energy consumption of IoT devices along with their impact on Cloud and telecommunication infrastructures}, - pdfkeywords={}, - pdfsubject={}, - pdfcreator={Emacs 26.2 (Org mode 9.2.3)}, - pdflang={English}} -\begin{document} - -\maketitle -\begin{abstract} -Information and Communication Technology takes a growing part in the worldwide energy consumption. One of the root causes of this increase lies in the multiplication of connected devices. Each object of the Internet-of-Things often does not consume much energy by itself. Yet, their number and the infrastructures they require to properly work have leverage. In this paper, we combine simulations and real measurements to study the energy impact of IoT devices. In particular, we analyze the energy consumption of Cloud and telecommunication infrastructures induced by the utilization of connected devices, and we propose an end-to-end energy consumption model for these devices. -\end{abstract} - -\begin{IEEEkeywords} -component, formatting, style, styling, insert -\end{IEEEkeywords} - - -\section{Introduction} -\label{sec:orgd500e48} -\section{Related Work} -\label{sec:org80dbf26} -\section{Use-Case} -\label{sec:orgdfde6a1} -\subsection{Application Characteristic} -\label{sec:orgd63b619} -\subsection{Cloud Infrastructure} -\label{sec:orgfbdac91} -\section{System Model} -\label{sec:org8918b3b} -\subsection{IoT Part} -\label{sec:org1eda40a} -\subsection{Network Part} -\label{sec:org8486e6a} -\subsection{Cloud Part} -\label{sec:org97c19d3} -\section{Evaluation} -\label{sec:org03dc633} -\subsection{IoT/Network Consumption} -\label{sec:org884ec94} -\subsection{Cloud Consmption} -\label{sec:orga52af2d} -\subsection{Virtual Machine Size Impact} -\label{sec:org9305a61} -\subsection{Application Accuracy} -\label{sec:org9464075} -Refresh frequency etc\ldots{} -\subsection{End-To-End Consumption} -\label{sec:orgc64fdd5} -\section{Discussion} -\label{sec:org51ac1f7} -\section{Conclusion} -\label{sec:orgd9544f5} -\end{document} diff --git a/ns3-simulations/g5k-root.sh b/ns3-simulations/g5k-root.sh new file mode 100755 index 0000000..0ec56b2 --- /dev/null +++ b/ns3-simulations/g5k-root.sh @@ -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 diff --git a/ns3-simulations/g5k-worker.sh b/ns3-simulations/g5k-worker.sh new file mode 100755 index 0000000..00a1aff --- /dev/null +++ b/ns3-simulations/g5k-worker.sh @@ -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 diff --git a/ns3-simulations/nix/default.nix b/ns3-simulations/nix/default.nix new file mode 100644 index 0000000..04134fb --- /dev/null +++ b/ns3-simulations/nix/default.nix @@ -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; }; +} diff --git a/ns3-simulations/nix/ns3/default.nix b/ns3-simulations/nix/ns3/default.nix new file mode 100644 index 0000000..ed58501 --- /dev/null +++ b/ns3-simulations/nix/ns3/default.nix @@ -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 + ''; +} diff --git a/ns3-simulations/nix/result b/ns3-simulations/nix/result new file mode 120000 index 0000000..a569d5e --- /dev/null +++ b/ns3-simulations/nix/result @@ -0,0 +1 @@ +/nix/store/c7vpaw8k0qvv1fzw5fz1vp5s13xyki2y-ns3
\ No newline at end of file diff --git a/ns3-simulations/nix/result-2 b/ns3-simulations/nix/result-2 new file mode 120000 index 0000000..715b58d --- /dev/null +++ b/ns3-simulations/nix/result-2 @@ -0,0 +1 @@ +/nix/store/2srcpv0g78mz3xk2ycgq6da3sjfggzbb-simulator
\ No newline at end of file diff --git a/ns3-simulations/nix/simulator/default.nix b/ns3-simulations/nix/simulator/default.nix new file mode 100644 index 0000000..0a55322 --- /dev/null +++ b/ns3-simulations/nix/simulator/default.nix @@ -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 + ''; + +} diff --git a/ns3-simulations/simulator/Makefile b/ns3-simulations/nix/simulator/src/Makefile index a9cee83..ffe03a4 100644 --- a/ns3-simulations/simulator/Makefile +++ b/ns3-simulations/nix/simulator/src/Makefile @@ -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) diff --git a/ns3-simulations/simulator/main.cc b/ns3-simulations/nix/simulator/src/main.cc index b7f043c..b7f043c 100644 --- a/ns3-simulations/simulator/main.cc +++ b/ns3-simulations/nix/simulator/src/main.cc diff --git a/ns3-simulations/simulator/modules/callbacks.cc b/ns3-simulations/nix/simulator/src/modules/callbacks.cc index 4ae0c97..4ae0c97 100644 --- a/ns3-simulations/simulator/modules/callbacks.cc +++ b/ns3-simulations/nix/simulator/src/modules/callbacks.cc diff --git a/ns3-simulations/simulator/modules/energy.cc b/ns3-simulations/nix/simulator/src/modules/energy.cc index c8cca6a..c8cca6a 100644 --- a/ns3-simulations/simulator/modules/energy.cc +++ b/ns3-simulations/nix/simulator/src/modules/energy.cc diff --git a/ns3-simulations/simulator/modules/modules.hpp b/ns3-simulations/nix/simulator/src/modules/modules.hpp index b537e92..b537e92 100644 --- a/ns3-simulations/simulator/modules/modules.hpp +++ b/ns3-simulations/nix/simulator/src/modules/modules.hpp diff --git a/ns3-simulations/simulator/modules/platform.cc b/ns3-simulations/nix/simulator/src/modules/platform.cc index 52f91b0..52f91b0 100644 --- a/ns3-simulations/simulator/modules/platform.cc +++ b/ns3-simulations/nix/simulator/src/modules/platform.cc diff --git a/ns3-simulations/simulate.org b/ns3-simulations/simulate.org index 43aa253..c02aeca 100644 --- a/ns3-simulations/simulate.org +++ b/ns3-simulations/simulate.org @@ -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 diff --git a/ns3-simulations/simulator/simulator b/ns3-simulations/simulator/simulator Binary files differdeleted file mode 100755 index ed894ca..0000000 --- a/ns3-simulations/simulator/simulator +++ /dev/null |
