Cleaning repository

This commit is contained in:
Loïc Guégan 2025-04-01 17:56:32 +02:00
commit 2f1837a75e
26 changed files with 628 additions and 0 deletions

2
sandbox/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
ina260-zmq-publisher
pure-read/read

19
sandbox/config Normal file
View file

@ -0,0 +1,19 @@
# Global Configuration:
inadev="2:0x40 2:0x41 2:0x42 2:0x43"
bbhost=debian@192.168.6.2
delaypurezmq=10
delayiperfpure=10
# Pure Read Experiments:
nread=500000
readrest=60
# ZMQ Experiments:
zmqrest=60
zmqduration=300
hostip=192.168.7.1
zmqport=5556
zmqlogdelay=0
zmqloginterval=60
zmqmsgsize=20242880
zmqmaxqueue=1

19
sandbox/config_beaglebone Normal file
View file

@ -0,0 +1,19 @@
# Global Configuration:
inadev="2:0x40 2:0x41 2:0x42 2:0x43"
bbhost=debian@192.168.6.2
delaypurezmq=10
delayiperfpure=10
# Pure Read Experiments:
nread=500000
readrest=60
# ZMQ Experiments:
zmqrest=60
zmqduration=300
hostip=192.168.7.1
zmqport=5556
zmqlogdelay=0
zmqloginterval=60
zmqmsgsize=20242880
zmqmaxqueue=1

19
sandbox/config_rpi Normal file
View file

@ -0,0 +1,19 @@
# Global Configuration:
inadev="1:0x41"
bbhost=pi@10.128.0.93
delaypurezmq=0
delayiperfpure=5
# Pure Read Experiments:
nread=500000
readrest=5
# ZMQ Experiments:
zmqrest=5
zmqduration=60
hostip=10.128.0.133
zmqport=5556
zmqlogdelay=0
zmqloginterval=10
zmqmsgsize=20242880
zmqmaxqueue=1

View file

@ -0,0 +1,10 @@
all: read
read: read.c
gcc $^ -o $@
clean:
- rm read
.PHONY: clean

88
sandbox/pure-read/read.c Normal file
View file

@ -0,0 +1,88 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
#define BUFFER_SIZE 255
#define IN_MEM (inmem!=0)
typedef struct power_data {
float power; // Power value
long ts; // Associated timestamp
long nsecs; // Associated nanosecs
} power_data;
int main(int argc, char *argv[])
{
if(argc != 4){
printf("Usage: %s <device-id> <nread> <inmem>\n\
\rFor <device-id>, see folder name in /sys/kernel/ina260/",argv[0]);
exit(1);
}
char *deviceid=argv[1];
int nread=atoi(argv[2]);
int inmem=atoi(argv[3]);
if(nread<=0){
printf("<nread> must be greater than 0\n");
exit(3);
}
// File to read
char path[255];
sprintf(path, "/sys/kernel/ina260/%s/power", deviceid);
// Open file
int fd;
char buff[BUFFER_SIZE];
fd = open(path, O_RDONLY);
if(fd<0){
perror(path);
exit(2);
}
// Check if its in memory reading
power_data *data;
if(IN_MEM){
data=malloc(sizeof(power_data)*nread);
if(data == NULL){
perror("Cannot allocate enough memory for in memory reads");
exit(4);
}
}
// Perform reads
float power=-1;
struct timespec power_ts;
clock_gettime(CLOCK_REALTIME, &power_ts);
printf("startat:%ld\n", power_ts.tv_sec);
for(int i=0;i<nread;i++){
read(fd, buff, BUFFER_SIZE);
// Get power measurement timestamp:
clock_gettime(CLOCK_REALTIME, &power_ts);
power=atof(buff);
if(IN_MEM){
data[i].power=power;
data[i].ts=power_ts.tv_sec;
data[i].nsecs=power_ts.tv_nsec;
}
else{
printf("%s %11ld %10ld> Power is %fW\n",deviceid, power_ts.tv_sec,power_ts.tv_nsec,power);
}
lseek(fd,0,SEEK_SET);
}
close(fd);
if(IN_MEM){
// We only print now (most I/O will happend at the end and this must be visible on the results)
for(int i=0;i<nread;i++){
printf("%s %11ld %10ld> Power is %fW\n",deviceid, data[i].ts, data[i].nsecs, data[i].power);
}
free(data);
}
printf("endat:%ld\n", time(NULL));
return 0;
}

138
sandbox/run_beaglebone.sh Executable file
View file

@ -0,0 +1,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

74
sandbox/run_host.sh Executable file
View file

@ -0,0 +1,74 @@
#!/usr/bin/env bash
set -e
wai=$(dirname $(readlink -f "$0")) # Current script directory
zmq=${wai}/ina260-zmq-publisher
source ${wai}/config # Load experiment configuration
bbexec="ssh -q ${bbhost}"
nosync="no" # change this to yes ONLY FOR TESTS
# Ensure zmq publisher is available
[ ! -d "${zmq}" ] && git clone https://gitlab.com/manzerbredes/ina260-zmq-publisher.git "${zmq}"
# Configuring zmq project
echo "Configuring ina260-zmq-publisher"
sed "s/^SUBSCRIBER_ADDR=.*/SUBSCRIBER_ADDR=${hostip}/g" -i ${zmq}/config.mk
sed "s/^ZMQ_PORT=.*/ZMQ_PORT=${zmqport}/g" -i ${zmq}/config.mk
sed "s/^LOG_DELAY=.*/LOG_DELAY=${zmqlogdelay}/g" -i ${zmq}/config.mk
sed "s/^LOG_INTERVAL=.*/LOG_INTERVAL=${zmqloginterval}/g" -i ${zmq}/config.mk
sed "s/^ZMQ_MSG_SIZE=.*/ZMQ_MSG_SIZE=${zmqmsgsize}/g" -i ${zmq}/config.mk
sed "s/^MAX_QUEUE=.*/MAX_QUEUE=${zmqmaxqueue}/g" -i ${zmq}/config.mk
# Setting up beaglebone
[ ${nosync} != "yes" ] && rsync -avh --exclude=".git*" --exclude="ina260-zmq-publisher/data" ina260-zmq-publisher pure-read run_beaglebone.sh config ${bbhost}:sandbox/
# Cleaning previous results
[ -x "${zmq}/data" ] && rm -rf "${zmq}/data"
##### Run experiments
# Start zmq subscriber on the host
echo "Starting subscriber"
cd $zmq
make -B
make subscribe &
zmqpid=$!
cd - > /dev/null
# Start iperf
iperf -s -fm -o netstats.txt &
iperfpid=$!
# Start experiments
$bbexec "cd sandbox && ./run_beaglebone.sh"
# Collect pure-read results
echo "Fetching pure-read results"
rsync -avh ${bbhost}:sandbox/pure_read.csv ${wai}/../analysis/results/
# Collect zmq results
echo "Formatting zmq results"
. ${wai}/config
zmqcsv="${wai}/../analysis/results/zmq.csv"
echo "bus,addr,deviceid,usen,duration,loginterval,logdelay,rest,msgsize,timestamp,nsecs,power" > "$zmqcsv"
for exp in ${zmq}/data/*
do
usen=$(basename $exp|sed "s/usen//g")
for dev in $exp/*
do
deviceid=$(basename $dev)
bus=$(echo $deviceid|cut -d\- -f1)
addr=0x$(echo $deviceid|cut -d\- -f2|awk '{print $0+0}')
infos="${bus},${addr},${bus}-${addr},${usen},${zmqduration},${zmqloginterval},${zmqlogdelay},${zmqrest},${zmqmsgsize}"
cat $dev/* | awk '!/timestamp/{print("'$infos',"$0)}' >> "$zmqcsv"
done
done
# Collecting iperf results
echo "Formatting iperf results"
bw=$(cat netstats.txt |awk -F '[ -]+' '/sec/{print $8}') # Mbps
iperfcsv="${wai}/../analysis/results/iperf.csv"
echo "bw" > "$iperfcsv"
echo "${bw}" >> "$iperfcsv"
# Stopping zmq subscriber and iperf
echo "Stopping subscriber..."
kill $zmqpid
echo "Stopping iperf..."
kill $iperfpid
echo "Finished congratulations!"