summaryrefslogtreecommitdiff
path: root/ns3-simulations/g5k-root.sh
diff options
context:
space:
mode:
Diffstat (limited to 'ns3-simulations/g5k-root.sh')
-rwxr-xr-xns3-simulations/g5k-root.sh309
1 files changed, 309 insertions, 0 deletions
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