mirror of
https://gitlab.com/manzerbredes/paper-lowrate-iot.git
synced 2025-04-19 04:09:43 +00:00
Nix integration
This commit is contained in:
parent
89a5ee979d
commit
f6d01996eb
18 changed files with 616 additions and 24 deletions
|
@ -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...
|
||||
|
|
BIN
2019-Mascots.pdf
BIN
2019-Mascots.pdf
Binary file not shown.
|
@ -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
309
ns3-simulations/g5k-root.sh
Executable 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
68
ns3-simulations/g5k-worker.sh
Executable 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
|
5
ns3-simulations/nix/default.nix
Normal file
5
ns3-simulations/nix/default.nix
Normal 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; };
|
||||
}
|
36
ns3-simulations/nix/ns3/default.nix
Normal file
36
ns3-simulations/nix/ns3/default.nix
Normal 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
1
ns3-simulations/nix/result
Symbolic link
|
@ -0,0 +1 @@
|
|||
/nix/store/c7vpaw8k0qvv1fzw5fz1vp5s13xyki2y-ns3
|
1
ns3-simulations/nix/result-2
Symbolic link
1
ns3-simulations/nix/result-2
Symbolic link
|
@ -0,0 +1 @@
|
|||
/nix/store/2srcpv0g78mz3xk2ycgq6da3sjfggzbb-simulator
|
18
ns3-simulations/nix/simulator/default.nix
Normal file
18
ns3-simulations/nix/simulator/default.nix
Normal 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
|
||||
'';
|
||||
|
||||
}
|
|
@ -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)
|
|
@ -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.
Loading…
Add table
Add a link
Reference in a new issue