summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoic Guegan <manzerberdes@gmx.com>2019-05-04 10:32:19 +0200
committerLoic Guegan <manzerberdes@gmx.com>2019-05-04 10:32:19 +0200
commitf6d01996eb72fc71681efd4aacd8d8cb903be753 (patch)
tree0a83ce1a2d0648aaab84680a7e5b75acee585542
parent89a5ee979d18e3897bd96f3341f97720a4655f7a (diff)
Nix integration
-rw-r--r--2019-Mascots.org13
-rw-r--r--2019-Mascots.pdfbin52266 -> 61359 bytes
-rw-r--r--2019-Mascots.tex47
-rwxr-xr-xns3-simulations/g5k-root.sh309
-rwxr-xr-xns3-simulations/g5k-worker.sh68
-rw-r--r--ns3-simulations/nix/default.nix5
-rw-r--r--ns3-simulations/nix/ns3/default.nix36
l---------ns3-simulations/nix/result1
l---------ns3-simulations/nix/result-21
-rw-r--r--ns3-simulations/nix/simulator/default.nix18
-rw-r--r--ns3-simulations/nix/simulator/src/Makefile (renamed from ns3-simulations/simulator/Makefile)11
-rw-r--r--ns3-simulations/nix/simulator/src/main.cc (renamed from ns3-simulations/simulator/main.cc)0
-rw-r--r--ns3-simulations/nix/simulator/src/modules/callbacks.cc (renamed from ns3-simulations/simulator/modules/callbacks.cc)0
-rw-r--r--ns3-simulations/nix/simulator/src/modules/energy.cc (renamed from ns3-simulations/simulator/modules/energy.cc)0
-rw-r--r--ns3-simulations/nix/simulator/src/modules/modules.hpp (renamed from ns3-simulations/simulator/modules/modules.hpp)0
-rw-r--r--ns3-simulations/nix/simulator/src/modules/platform.cc (renamed from ns3-simulations/simulator/modules/platform.cc)0
-rw-r--r--ns3-simulations/simulate.org131
-rwxr-xr-xns3-simulations/simulator/simulatorbin330504 -> 0 bytes
18 files changed, 616 insertions, 24 deletions
diff --git a/2019-Mascots.org b/2019-Mascots.org
index 534c47d..cb27d17 100644
--- a/2019-Mascots.org
+++ b/2019-Mascots.org
@@ -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...
diff --git a/2019-Mascots.pdf b/2019-Mascots.pdf
index fbde41d..2508d2b 100644
--- a/2019-Mascots.pdf
+++ b/2019-Mascots.pdf
Binary files differ
diff --git a/2019-Mascots.tex b/2019-Mascots.tex
index cd9243b..80d8f8b 100644
--- a/2019-Mascots.tex
+++ b/2019-Mascots.tex
@@ -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}
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
deleted file mode 100755
index ed894ca..0000000
--- a/ns3-simulations/simulator/simulator
+++ /dev/null
Binary files differ