aboutsummaryrefslogtreecommitdiff
path: root/sandbox/run_beaglebone.sh
blob: c610c6e4744f358b1e6399bceffb43cb21456ae3 (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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#!/usr/bin/env bash

set -e

wai=$(dirname $(readlink -f "$0")) # Current script directory
source ${wai}/config

info () {
    echo -e "\033[0;32m$@\033[0m"
}

abort () {
    echo -e "\033[0;31m$@\033[0m"
    exit 1
}

iperf-run () {
    info "---------- Running iperf test ----------"
    iperf -c ${hostip}
}

pure-read () {
    local clean="${1:-1}"
    local inmem="${2:-0}"
    info "---------- Running pure read experiments (inmem=${inmem},clean=${clean}) ----------"
    info "Ensuring that ina260 devices are connected..."
    for dev in $inadev
    do
        bus=$(echo $dev|cut -d: -f1)
        addr=$(echo $dev|cut -d: -f2)
        [ -z $(ls /sys/kernel/ina260/ |grep "${bus}-.*${addr#0x}") ] && echo ina260 $addr | sudo tee "/sys/bus/i2c/devices/i2c-${bus}/new_device"
        [ -z $(ls /sys/kernel/ina260/ |grep "${bus}-.*${addr#0x}") ] && abort "Cannot connect $dev"
    done
    info "Compiling..."
    make -C ${wai}/pure-read -B
    [ $clean -eq 1 ] && rm -f ${wai}/pure_read_bus*.out
    local ndev=$(echo $inadev|wc -w)
    for usen in $(seq 1 $ndev)
    do
        info "Run $nread read over $usen devices"
        local n=0
        unset pids # Erase previous pids
        for dev in $inadev
        do
            local bus=$(echo $dev|cut -d: -f1)
            local addr=$(echo $dev|cut -d: -f2)
            local devicepath=$(realpath /sys/kernel/ina260/${bus}-*${addr#0x})
            local deviceid=$(basename ${devicepath})
            local logfile=${wai}/pure_read_bus${bus}_addr${addr}_usen${usen}_nread${nread}_inmem${inmem}.out
            echo "${bus}:${addr}:${usen}:${nread}:${deviceid}" > ${logfile}
            /usr/bin/time -f "statsline:%P:%M" ${wai}/pure-read/read $deviceid $nread $inmem &>> ${logfile} &
            pids[${i}]=$!
            n=$(( n + 1 ))
            [ $n -eq $usen ] && break
        done
        # Wait for all pids
        for pid in ${pids[*]}; do
            wait $pid
        done
        sync # Ensure that I/O are applied on sdcard
        info "Beaglebone is resting for ${readrest}s"
        sleep ${readrest}
    done
    # Generate the results
    info "Collecting logs..."
    local csv="${wai}/pure_read.csv"
    [ $clean -eq 1 ] && echo "bus,addr,usen,nread,deviceid,startat,endat,inmem,cpu_usage,resident,timestamp,nsecs,power" > "$csv"
    for logfile in ${wai}/pure_read_bus*inmem${inmem}.out
    do
        local bus=$(head -n1 "$logfile"|cut -d: -f1)
        local addr=$(head -n1 "$logfile"|cut -d: -f2)
        local usen=$(head -n1 "$logfile"|cut -d: -f3)
        local nread=$(head -n1 "$logfile"|cut -d: -f4)
        local deviceid="${bus}-${addr}"
        local startat=$(cat "$logfile"|grep startat|cut -d: -f2)
        local endat=$(cat "$logfile"|grep endat|cut -d: -f2)
        local cpu_usage=$(cat "$logfile"|grep statsline|cut -d: -f2|awk '{print(($0+0)/100)}')
        local resident=$(cat "$logfile"|grep statsline|cut -d: -f3|awk '{print(($0+0)*1000)}')
        local infos="${bus},${addr},${usen},${nread},${deviceid},${startat},${endat},${inmem},${cpu_usage},${resident}"
        awk '/Power is/ { print("'${infos}',"$2+0","$3+0","$6+0)}' "$logfile" >> "$csv"
    done
}

zmq () {
    echo "---------- Running zmq experiments ----------"
    info "Disconnecting all ina260..."
    for dev in $(ls /sys/kernel/ina260/)
    do
        dev=$(basename $dev)
        bus=$(echo $dev|cut -d\- -f1)
        addr=$(echo $dev|cut -d\- -f2)
        echo 0x${addr} | sudo tee /sys/bus/i2c/devices/i2c-${bus}/delete_device
    done
    # Setup publisher
    cd ${wai}/ina260-zmq-publisher
    rm -f publisher_*.log
    info "Compiling..."
    make -B
    # Run experiments (add one new ina260 at each loop)
    local n=1
    for dev in $inadev
    do
        info "Run zmq over $n devices for ${zmqduration}s"
        bus=$(echo $dev|cut -d: -f1)
        addr=$(echo $dev|cut -d: -f2)
        [ -z $(ls /sys/kernel/ina260/ |grep "${bus}-.*${addr#0x}") ] && echo ina260 $addr | sudo tee "/sys/bus/i2c/devices/i2c-${bus}/new_device"
        [ -z $(ls /sys/kernel/ina260/ |grep "${bus}-.*${addr#0x}") ] && abort "Cannot connect $dev"
        # Run experiment
        sed "s/^KEY=.*/KEY=usen$n/g" -i config.mk
        make publish &
        sleep ${zmqduration}
        kill -s SIGINT $(cat pid)
        # Wait for all publisher processes to end:
        for pid in $(cat pid)
        do
            while ps -p $pid > /dev/null; do continue; done
        done
        # Done
        n=$(( n + 1 ))
        info "Beaglebone is resting for ${zmqrest}s"
        sleep $zmqrest
    done
    cd ${wai} # Go back to last directory
}

##### Run experiments
# Network benchmark
iperf-run
info "Sleep ${delayiperfpure}s before starting pure-read experiments..."
sleep ${delayiperfpure}
# Pure read
pure-read 1 1    # Do in memory first!
pure-read 0 0    # This way, we are sure in file has no impact
# Sleep
info "Sleep ${delaypurezmq}s before starting zmq experiments..."
sleep ${delaypurezmq}
# ZMQ
zmq