2019-05-04 10:32:19 +02:00
|
|
|
#!/bin/bash
|
|
|
|
##### Arguments #####
|
2019-05-16 14:32:18 +02:00
|
|
|
nHost=20 # At least 20 host x)
|
|
|
|
nProcesses=3 # Max number of parrallel simulations (don't go too high, your process will be killed (arround 8))
|
|
|
|
nHours=4 # Reservation duration
|
2019-05-04 10:32:19 +02:00
|
|
|
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 () {
|
2019-05-06 12:05:15 +02:00
|
|
|
[ -z "${argId}" ] && argId=1 || argId=$(( argId + 1 ))
|
|
|
|
outF="$simArgsLoc/${argId}.sh" # Args file based on host name (avoid conflict)
|
2019-05-04 10:32:19 +02:00
|
|
|
|
|
|
|
# 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
|
2019-05-16 14:32:18 +02:00
|
|
|
echo "positionSeed=${positionSeed}" >> $outF
|
2019-05-04 10:32:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 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
|
2019-05-16 14:32:18 +02:00
|
|
|
sensorsSendInterval=10 # DON'T GO BELOW 1 SECONDS !!!!!!! Simulator will stay stuck
|
2019-05-04 10:32:19 +02:00
|
|
|
sensorsPktSize=5 # 1 byte temperature (-128 à +128 °C) and 4Byte sensorsId
|
|
|
|
sensorsNumber=10
|
|
|
|
nbHop=10 # Cf paper AC/Yunbo
|
|
|
|
linksBandwidth=10
|
|
|
|
linksLatency=2
|
2019-05-16 14:32:18 +02:00
|
|
|
positionSeed=5
|
2019-05-04 10:32:19 +02:00
|
|
|
simKey="NOKEY"
|
|
|
|
|
|
|
|
run () {
|
|
|
|
# If another function want to handle simulation (tipically used on g5k)
|
|
|
|
type -t handleSim > /dev/null && { handleSim; return; }
|
|
|
|
|
2019-05-16 14:32:18 +02:00
|
|
|
local logFile="${logFolder}/${simKey}_${sensorsSendInterval}SSI_${sensorsPktSize}SPS_${sensorsNumber}SN_${nbHop}NH_${linksBandwidth}LB_${linksLatency}LL_${positionSeed}PS.org"
|
2019-05-04 10:32:19 +02:00
|
|
|
[ -f "$logFile" ] && return
|
2019-05-16 14:32:18 +02:00
|
|
|
local simCMD="$simulator --sensorsSendInterval=${sensorsSendInterval} --sensorsPktSize=${sensorsPktSize} --sensorsNumber=${sensorsNumber} --nbHop=${nbHop} --linksBandwidth=${linksBandwidth} --linksLatency=${linksLatency} --positionSeed=${positionSeed} 2>&1"
|
|
|
|
local log=$(bash -c "$simCMD")
|
2019-05-04 10:32:19 +02:00
|
|
|
|
|
|
|
# Compute some metrics
|
|
|
|
energyLog=$(echo "$log" | $parseEnergyScript)
|
|
|
|
avgDelay=$(echo "$log" | $parseDelayScript)
|
2019-05-16 14:32:18 +02:00
|
|
|
totalEnergy=$(echo "$energyLog" | awk 'BEGIN{power=0;FS=","}NR!=1{power+=$2}END{print(power)}')
|
|
|
|
sensorsEnergy=$(echo "$energyLog" |awk -F',' 'BEGIN{sumW=0}$1<0{sumW+=$2}END{print sumW}')
|
|
|
|
networkEnergy=$(echo "$energyLog" |awk -F',' 'BEGIN{sumN=0}$1>=0{sumN+=$2}END{print sumN}')
|
2019-05-04 10:32:19 +02:00
|
|
|
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
|
2019-05-16 14:32:18 +02:00
|
|
|
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} positionSeed:${positionSeed} sensorsEnergy:${sensorsEnergy} networkEnergy:${networkEnergy}" >> $logFile
|
2019-05-04 10:32:19 +02:00
|
|
|
}
|
|
|
|
|
2019-05-16 14:32:18 +02:00
|
|
|
simKey="NBSENSORS"
|
|
|
|
for sensorsNumber in $(seq 1 10)
|
2019-05-04 10:32:19 +02:00
|
|
|
do
|
2019-05-16 14:32:18 +02:00
|
|
|
run
|
|
|
|
done
|
2019-05-04 10:32:19 +02:00
|
|
|
simulator="simulator/simulator"
|
|
|
|
parseEnergyScript="./parseEnergy.awk"
|
|
|
|
parseDelayScript="./parseDelay.awk"
|
|
|
|
logFolder="logs/"
|
|
|
|
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${NS3_PATH}/build/lib
|
|
|
|
|
|
|
|
# Default Parameters
|
2019-05-16 14:32:18 +02:00
|
|
|
sensorsSendInterval=10 # DON'T GO BELOW 1 SECONDS !!!!!!! Simulator will stay stuck
|
2019-05-04 10:32:19 +02:00
|
|
|
sensorsPktSize=5 # 1 byte temperature (-128 à +128 °C) and 4Byte sensorsId
|
|
|
|
sensorsNumber=10
|
|
|
|
nbHop=10 # Cf paper AC/Yunbo
|
|
|
|
linksBandwidth=10
|
|
|
|
linksLatency=2
|
2019-05-16 14:32:18 +02:00
|
|
|
positionSeed=5
|
2019-05-04 10:32:19 +02:00
|
|
|
simKey="NOKEY"
|
|
|
|
|
|
|
|
run () {
|
|
|
|
# If another function want to handle simulation (tipically used on g5k)
|
|
|
|
type -t handleSim > /dev/null && { handleSim; return; }
|
|
|
|
|
2019-05-16 14:32:18 +02:00
|
|
|
local logFile="${logFolder}/${simKey}_${sensorsSendInterval}SSI_${sensorsPktSize}SPS_${sensorsNumber}SN_${nbHop}NH_${linksBandwidth}LB_${linksLatency}LL_${positionSeed}PS.org"
|
2019-05-04 10:32:19 +02:00
|
|
|
[ -f "$logFile" ] && return
|
2019-05-16 14:32:18 +02:00
|
|
|
local simCMD="$simulator --sensorsSendInterval=${sensorsSendInterval} --sensorsPktSize=${sensorsPktSize} --sensorsNumber=${sensorsNumber} --nbHop=${nbHop} --linksBandwidth=${linksBandwidth} --linksLatency=${linksLatency} --positionSeed=${positionSeed} 2>&1"
|
|
|
|
local log=$(bash -c "$simCMD")
|
2019-05-04 10:32:19 +02:00
|
|
|
|
|
|
|
# Compute some metrics
|
|
|
|
energyLog=$(echo "$log" | $parseEnergyScript)
|
|
|
|
avgDelay=$(echo "$log" | $parseDelayScript)
|
2019-05-16 14:32:18 +02:00
|
|
|
totalEnergy=$(echo "$energyLog" | awk 'BEGIN{power=0;FS=","}NR!=1{power+=$2}END{print(power)}')
|
|
|
|
sensorsEnergy=$(echo "$energyLog" |awk -F',' 'BEGIN{sumW=0}$1<0{sumW+=$2}END{print sumW}')
|
|
|
|
networkEnergy=$(echo "$energyLog" |awk -F',' 'BEGIN{sumN=0}$1>=0{sumN+=$2}END{print sumN}')
|
2019-05-04 10:32:19 +02:00
|
|
|
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
|
2019-05-16 14:32:18 +02:00
|
|
|
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} positionSeed:${positionSeed} sensorsEnergy:${sensorsEnergy} networkEnergy:${networkEnergy}" >> $logFile
|
2019-05-04 10:32:19 +02:00
|
|
|
}
|
|
|
|
|
2019-05-16 14:32:18 +02:00
|
|
|
simKey="SENDINTERVAL"
|
|
|
|
for sensorsNumber in $(seq 5 5 20)
|
2019-05-04 10:32:19 +02:00
|
|
|
do
|
2019-05-16 14:32:18 +02:00
|
|
|
for sensorsSendInterval in $(seq 10 10 100)
|
2019-05-04 10:32:19 +02:00
|
|
|
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
|
2019-05-16 14:32:18 +02:00
|
|
|
sensorsSendInterval=10 # DON'T GO BELOW 1 SECONDS !!!!!!! Simulator will stay stuck
|
2019-05-04 10:32:19 +02:00
|
|
|
sensorsPktSize=5 # 1 byte temperature (-128 à +128 °C) and 4Byte sensorsId
|
|
|
|
sensorsNumber=10
|
|
|
|
nbHop=10 # Cf paper AC/Yunbo
|
|
|
|
linksBandwidth=10
|
|
|
|
linksLatency=2
|
2019-05-16 14:32:18 +02:00
|
|
|
positionSeed=5
|
2019-05-04 10:32:19 +02:00
|
|
|
simKey="NOKEY"
|
|
|
|
|
|
|
|
run () {
|
|
|
|
# If another function want to handle simulation (tipically used on g5k)
|
|
|
|
type -t handleSim > /dev/null && { handleSim; return; }
|
|
|
|
|
2019-05-16 14:32:18 +02:00
|
|
|
local logFile="${logFolder}/${simKey}_${sensorsSendInterval}SSI_${sensorsPktSize}SPS_${sensorsNumber}SN_${nbHop}NH_${linksBandwidth}LB_${linksLatency}LL_${positionSeed}PS.org"
|
2019-05-04 10:32:19 +02:00
|
|
|
[ -f "$logFile" ] && return
|
2019-05-16 14:32:18 +02:00
|
|
|
local simCMD="$simulator --sensorsSendInterval=${sensorsSendInterval} --sensorsPktSize=${sensorsPktSize} --sensorsNumber=${sensorsNumber} --nbHop=${nbHop} --linksBandwidth=${linksBandwidth} --linksLatency=${linksLatency} --positionSeed=${positionSeed} 2>&1"
|
|
|
|
local log=$(bash -c "$simCMD")
|
2019-05-04 10:32:19 +02:00
|
|
|
|
|
|
|
# Compute some metrics
|
|
|
|
energyLog=$(echo "$log" | $parseEnergyScript)
|
|
|
|
avgDelay=$(echo "$log" | $parseDelayScript)
|
2019-05-16 14:32:18 +02:00
|
|
|
totalEnergy=$(echo "$energyLog" | awk 'BEGIN{power=0;FS=","}NR!=1{power+=$2}END{print(power)}')
|
|
|
|
sensorsEnergy=$(echo "$energyLog" |awk -F',' 'BEGIN{sumW=0}$1<0{sumW+=$2}END{print sumW}')
|
|
|
|
networkEnergy=$(echo "$energyLog" |awk -F',' 'BEGIN{sumN=0}$1>=0{sumN+=$2}END{print sumN}')
|
2019-05-04 10:32:19 +02:00
|
|
|
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
|
2019-05-16 14:32:18 +02:00
|
|
|
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} positionSeed:${positionSeed} sensorsEnergy:${sensorsEnergy} networkEnergy:${networkEnergy}" >> $logFile
|
2019-05-04 10:32:19 +02:00
|
|
|
}
|
|
|
|
|
2019-05-16 14:32:18 +02:00
|
|
|
simKey="SENSORSPOS"
|
|
|
|
for sensorsNumber in $(seq 5 5 20)
|
2019-05-04 10:32:19 +02:00
|
|
|
do
|
2019-05-16 14:32:18 +02:00
|
|
|
for positionSeed in $(seq 1 10)
|
2019-05-04 10:32:19 +02:00
|
|
|
do
|
|
|
|
run
|
|
|
|
done
|
|
|
|
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
|
2019-05-16 14:32:18 +02:00
|
|
|
echo "Start simulations on node $host"
|
|
|
|
oarsh lguegan@$host bash g5k-worker.sh &
|
2019-05-04 10:32:19 +02:00
|
|
|
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
|