summaryrefslogtreecommitdiff
path: root/src/ns3/g5k-worker.sh
blob: 480381927f4ed44dcf737406cb0dd3a2414a4f90 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/bin/bash
export NS3_PATH=~/.bin/ns-3/ns-3.29/
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
curNProcesses=0 # Start with no processes
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 # DON'T GO BELOW 1 SECONDS !!!!!!! Simulator will stay stuck
    sensorsPktSize=192 # 1 byte temperature (-128 à +128 °C) and 4Byte sensorsId
    sensorsNumber=5
    nbHop=10 # Cf paper AC/Yunbo
    linksBandwidth=10000 # 10Ge links (to be coherent with energy values of ECOFEN/literature)
    linksLatency=11
    positionSeed=5
    simKey="NOKEY"
    
    run () {
        # If another function want to handle simulation (tipically used on g5k)
        type -t handleSim > /dev/null && { handleSim; return; }
    
        local logFile="${logFolder}/${simKey}_${sensorsSendInterval}SSI_${sensorsPktSize}SPS_${sensorsNumber}SN_${nbHop}NH_${linksBandwidth}LB_${linksLatency}LL_${positionSeed}PS.org"
        [ -f "$logFile" ] && return
        local simCMD="$simulator --sensorsSendInterval=${sensorsSendInterval} --sensorsPktSize=${sensorsPktSize} --sensorsNumber=${sensorsNumber} --nbHop=${nbHop} --linksBandwidth=${linksBandwidth} --linksLatency=${linksLatency} --positionSeed=${positionSeed} 2>&1"
        local 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)}')
        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}')
        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} positionSeed:${positionSeed} sensorsEnergy:${sensorsEnergy} networkEnergy:${networkEnergy}" >> $logFile
    }
    
    logFolder=$g5kLogFolder # Don't forget override default g5kLogFolder
    source  $argsFile # Fetch argument
    run & # Run async 
    ((curNProcesses+=1)) # Increase by 2           
    [ $curNProcesses -ge $nProcesses ] && { curNProcesses=0; wait; }
done
wait # Wait until the end of all simulations

cp -r $g5kLogFolder/* "$logsFinalDst" # Fetch log from tmp into nfs
echo $(hostname) >> $finishedFile # Just say I finished