mirror of
https://gitlab.com/manzerbredes/paper-lowrate-iot.git
synced 2025-04-19 04:09:43 +00:00
Add analysis script
This commit is contained in:
parent
1ab4a6a97a
commit
7c9410246f
23 changed files with 171289 additions and 4 deletions
|
@ -14,11 +14,11 @@ IFS=$'\n'
|
|||
for cmd in $(cat $logFile|grep "Simulation parameters")
|
||||
do
|
||||
nodeName=$(getValue $cmd serverNodeName)
|
||||
from=$(getValue $cmd startSim)
|
||||
to=$(getValue $cmd endSim)
|
||||
from=$(getValue $cmd simStart)
|
||||
to=$(getValue $cmd simEnd)
|
||||
vmSize=$(getValue $cmd vmSize)
|
||||
nbSensors=$(getValue $cmd nbSensors)
|
||||
simKey=$(getValue $cmd simKey)
|
||||
./recordEnergy.sh nova $nodeName $from $to nova $nodeName $from $to "${simKey}_${vmSize}VMSIZE_${nbSensors}NBSENSORS_${from}${to}.csv"
|
||||
./recordEnergy.sh nova $nodeName $from $to "${simKey}_${vmSize}VMSIZE_${nbSensors}NBSENSORS_${from}${to}.csv"
|
||||
done
|
||||
|
||||
|
|
24
g5k/energyFromLogs.sh~
Executable file
24
g5k/energyFromLogs.sh~
Executable file
|
@ -0,0 +1,24 @@
|
|||
#!/bin/bash
|
||||
|
||||
|
||||
logFile="$(dirname $(readlink -f $0))"/simLogs.txt
|
||||
|
||||
|
||||
getValue () {
|
||||
line=$(echo "$1" | grep "Simulation para"|sed "s/Simulation parameters: //g")
|
||||
key=$2
|
||||
echo "$line"|awk 'BEGIN{RS=" ";FS=":"}"'$key'"==$1{gsub("\n","",$0);print $2}'
|
||||
}
|
||||
|
||||
IFS=$'\n'
|
||||
for cmd in $(cat $logFile|grep "Simulation parameters")
|
||||
do
|
||||
nodeName=$(getValue $cmd serverNodeName)
|
||||
from=$(getValue $cmd startSim)
|
||||
to=$(getValue $cmd endSim)
|
||||
vmSize=$(getValue $cmd vmSize)
|
||||
nbSensors=$(getValue $cmd nbSensors)
|
||||
simKey=$(getValue $cmd simKey)
|
||||
./recordEnergy.sh nova $nodeName $from $to "${simKey}_${vmSize}VMSIZE_${nbSensors}NBSENSORS_${from}${to}.csv"
|
||||
done
|
||||
|
1
g5k/logs/.#analysis.org
Symbolic link
1
g5k/logs/.#analysis.org
Symbolic link
|
@ -0,0 +1 @@
|
|||
loic@lguegan.5093:1558079377
|
BIN
g5k/logs/.RData
Normal file
BIN
g5k/logs/.RData
Normal file
Binary file not shown.
25
g5k/logs/.Rhistory
Normal file
25
g5k/logs/.Rhistory
Normal file
|
@ -0,0 +1,25 @@
|
|||
library("tidyverse")
|
||||
read_csv("nbSensors_2048VMSIZE_100NBSENSORS_15580778521558078188.csv")
|
||||
energy=read_csv("nbSensors_2048VMSIZE_100NBSENSORS_15580778521558078188.csv")
|
||||
ggplot(energy, aes(x=ts,y=energy))+geom_line()
|
||||
ggplot(energy, aes(x=ts,y=energy))+geom_point()
|
||||
ggplot(energy, aes(x=ts,y=energy))+geom_line() + expand_limits(x=,y=)
|
||||
ggplot(energy, aes(x=ts,y=energy))+geom_line() + expand_limits(x=0,y=0)
|
||||
ggplot(energy, aes(x=ts,y=energy))+geom_line() + expand_limits(y=0)
|
||||
ggplot(energy, aes(x=ts,y=energy))+geom_line() + expand_limits(y=0) + scale_x_datetime()
|
||||
energy$ts
|
||||
as.POSIXct(energy$ts)
|
||||
as.POSIXct(energy$ts,origin="1970-01-01")
|
||||
energy %>% mutate(ts=as.POSIXct(energy$ts,origin="1970-01-01"))
|
||||
energy %>% mutate(ts=as.POSIXct(ts,origin="1970-01-01"))
|
||||
energy=energy %>% mutate(ts=as.POSIXct(ts,origin="1970-01-01"))
|
||||
ggplot(energy, aes(x=ts,y=energy))+geom_line() + expand_limits(y=0) + scale_x_datetime()
|
||||
energy=read_csv("nbSensors_2048VMSIZE_100NBSENSORS_15580778521558078188.csv")
|
||||
energy
|
||||
energy=energy%>%mutate(ts=ts-min(ts))
|
||||
energy
|
||||
ggplot(energy, aes(x=ts,y=energy))+geom_line() + expand_limits(y=0)
|
||||
ggplot(energy, aes(x=ts,y=energy))+geom_line() + expand_limits(y=0)+geom_jitter
|
||||
ggplot(energy, aes(x=ts,y=energy))+geom_line() + expand_limits(y=0)+geom_jitter()
|
||||
ggplot(energy, aes(x=ts,y=energy)) + expand_limits(y=0)+geom_jitter()
|
||||
ggplot(energy, aes(x=ts,y=energy)) + expand_limits(y=0)+geom_jitter(position = position_jitter(width = 0.4))
|
164
g5k/logs/analysis.org
Normal file
164
g5k/logs/analysis.org
Normal file
|
@ -0,0 +1,164 @@
|
|||
|
||||
|
||||
|
||||
|
||||
* Logs Analysis
|
||||
** R Scripts
|
||||
*** Generate all plots script
|
||||
#+BEGIN_SRC R
|
||||
#<<RUtils>>
|
||||
|
||||
|
||||
energy=loadEnergy
|
||||
#+END_SRC
|
||||
|
||||
|
||||
*** R Utils
|
||||
RUtils is intended to load logs (data.csv) and providing
|
||||
simple plot function for them.
|
||||
|
||||
#+NAME: RUtils
|
||||
#+BEGIN_SRC R :eval never
|
||||
library("tidyverse")
|
||||
|
||||
# Fell free to update the following
|
||||
labels=c(nbNodes="Number of nodes",sensorsNumber="Number of sensors",totalEnergy="Total Energy (J)",
|
||||
nbHop="Number of hop (AP to Cloud)", linksBandwidth="Links Bandwidth (Mbps)", avgDelay="Average Application Delay (s)",
|
||||
linksLatency="Links Latency (ms)", sensorsSendInterval="Sensors Send Interval (s)", positionSeed="Position Seed",
|
||||
sensorsEnergy="Sensors Wifi Energy Consumption (J)", networkEnergy="Network Energy Consumption (J)")
|
||||
|
||||
# Load Data
|
||||
data=read_csv("logs/data.csv")
|
||||
|
||||
loadData=function(path){
|
||||
data=read_csv(path)
|
||||
data%>%mutate(time=ts-min(ts))
|
||||
}
|
||||
|
||||
# Get label according to varName
|
||||
getLabel=function(varName){
|
||||
if(is.na(labels[varName])){
|
||||
return(varName)
|
||||
}
|
||||
return(labels[varName])
|
||||
}
|
||||
#+END_SRC
|
||||
|
||||
** Plots -> PDF
|
||||
Merge all plots in plots/ folder into a pdf file.
|
||||
#+NAME: plotToPDF
|
||||
#+BEGIN_SRC bash :results output :noweb yes
|
||||
orgFile="plots/plots.org"
|
||||
<<singleRun>> # To get all default arguments
|
||||
|
||||
# Write helper function
|
||||
function write {
|
||||
echo "$1" >> $orgFile
|
||||
}
|
||||
|
||||
echo "#+TITLE: Analysis" > $orgFile
|
||||
write "#+LATEX_HEADER: \usepackage{fullpage}"
|
||||
write "#+OPTIONS: toc:nil"
|
||||
# Default arguments
|
||||
write '\begin{center}'
|
||||
write '\begin{tabular}{lr}'
|
||||
write 'Parameters & Values\\'
|
||||
write '\hline'
|
||||
write "sensorsPktSize & ${sensorsPktSize} bytes\\\\"
|
||||
write "sensorsSendInterval & ${sensorsSendInterval}s\\\\"
|
||||
write "sensorsNumber & ${sensorsNumber}\\\\"
|
||||
write "nbHop & ${nbHop}\\\\"
|
||||
write "linksBandwidth & ${linksBandwidth}Mbps\\\\"
|
||||
write "linksLatency & ${linksLatency}ms\\\\"
|
||||
write '\end{tabular}'
|
||||
write '\newline'
|
||||
write '\end{center}'
|
||||
|
||||
for plot in $(find plots/ -type f -name "*.png")
|
||||
do
|
||||
write "\includegraphics[width=0.5\linewidth]{$(basename ${plot})}"
|
||||
done
|
||||
|
||||
# Export to pdf
|
||||
emacs $orgFile --batch -f org-latex-export-to-pdf --kill
|
||||
#+END_SRC
|
||||
|
||||
#+RESULTS:
|
||||
|
||||
|
||||
|
||||
** CSVs -> CSV
|
||||
|
||||
#+NAME: mergeCSV
|
||||
#+BEGIN_SRC sh :results output
|
||||
#!/bin/bash
|
||||
|
||||
whichLog="first-try"
|
||||
|
||||
|
||||
logFile="$(dirname $(readlink -f $0))"/$whichLog/simLogs.txt
|
||||
dataFile=$(dirname "$logFile")/data.csv
|
||||
|
||||
|
||||
getValue () {
|
||||
line=$(echo "$1" | grep "Simulation para"|sed "s/Simulation parameters: //g")
|
||||
key=$2
|
||||
echo "$line"|awk 'BEGIN{RS=" ";FS=":"}"'$key'"==$1{gsub("\n","",$0);print $2}'
|
||||
}
|
||||
|
||||
##### Add extract info to energy #####
|
||||
IFS=$'\n'
|
||||
for cmd in $(cat $logFile|grep "Simulation parameters")
|
||||
do
|
||||
nodeName=$(getValue $cmd serverNodeName)
|
||||
from=$(getValue $cmd simStart)
|
||||
to=$(getValue $cmd simEnd)
|
||||
vmSize=$(getValue $cmd vmSize)
|
||||
nbSensors=$(getValue $cmd nbSensors)
|
||||
simKey=$(getValue $cmd simKey)
|
||||
csvFile="$whichLog/${simKey}_${vmSize}VMSIZE_${nbSensors}NBSENSORS_${from}${to}.csv"
|
||||
tmpFile=${csvFile}_tmp
|
||||
echo ts,energy,simKey,vmSize,nbSensors > $tmpFile
|
||||
tail -n+2 ${csvFile} | awk '{print $0",'$simKey','$vmSize','$nbSensors'"}' >> $tmpFile
|
||||
done
|
||||
|
||||
|
||||
##### File dataFile #####
|
||||
echo ts,energy,simKey,vmSize,nbSensors > $dataFile
|
||||
for tmpFile in $(find ${whichLog}/*_tmp -type f)
|
||||
do
|
||||
tail -n+2 $tmpFile >> $dataFile
|
||||
rm $tmpFile # Pay attention to this line :D
|
||||
done
|
||||
#+END_SRC
|
||||
|
||||
#+RESULTS:
|
||||
|
||||
** Custom Plots
|
||||
|
||||
#+NAME: ssiNet
|
||||
#+BEGIN_SRC R :noweb yes :results graphics :file plots/sensorsSendInterval-net.png
|
||||
<<RUtils>>
|
||||
|
||||
data%>%filter(simKey=="SENDINTERVAL",sensorsNumber==20) %>% ggplot(aes(x=sensorsSendInterval,y=networkEnergy))+xlab(getLabel("sensorsSendInterval"))+ylab(getLabel("networkEnergy"))+
|
||||
geom_line()+labs(title="For 20 sensors")
|
||||
ggsave("plots/sensorsSendInterval-net.png",dpi=80)
|
||||
#+END_SRC
|
||||
|
||||
#+RESULTS:
|
||||
[[file:plots/sensorsSendInterval-net.png]]
|
||||
|
||||
|
||||
#+NAME: ssiWifi
|
||||
#+BEGIN_SRC R :noweb yes :results graphics :file plots/sensorsSendInterval-wifi.png
|
||||
<<RUtils>>
|
||||
data%>%filter(simKey=="SENDINTERVAL",sensorsNumber==20) %>% ggplot(aes(x=sensorsSendInterval,y=sensorsEnergy))+xlab(getLabel("sensorsSendInterval"))+ylab(getLabel("sensorsEnergy"))+
|
||||
geom_line() + geom_line()+labs(title="For 20 sensors")
|
||||
ggsave("plots/sensorsSendInterval-wifi.png",dpi=80)
|
||||
#+END_SRC
|
||||
|
||||
#+RESULTS: ssiWifi
|
||||
[[file:plots/sensorsSendInterval-wifi.png]]
|
||||
|
||||
#+RESULTS:
|
||||
[[file:plots/sensorsSendInterval.png]]
|
85351
g5k/logs/first-try/data.csv
Normal file
85351
g5k/logs/first-try/data.csv
Normal file
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
30
g5k/logs/first-try/simLogs.txt
Normal file
30
g5k/logs/first-try/simLogs.txt
Normal file
|
@ -0,0 +1,30 @@
|
|||
---------- Simulation (key=vmSize) start at 1558075866 (Fri May 17 08:51:06 CEST 2019)
|
||||
Simulation parameters: serverNode:nova-20.lyon.grid5000.fr serverIp:10.140.0.1 serverMac:00:16:3E:8C:00:01 clientNode:nova-21.lyon.grid5000.fr clientNode:nova-21.lyon.grid5000.fr clientMac:00:16:3E:8C:00:02 delay:60 nbSensors:20 nbSensorsFactor:3 requestPerSensors:30 sensorsRequestPerSec: simKey:vmSize simStart:1558075866 simEnd:1558076173 duration:307 serverNodeName:nova-20 vmSize:1024
|
||||
./recordEnergy.sh nova nova-20 1558075866 1558076173 energy_vmSize_20NS_1024vmSize_1558075866_1558076173.csv
|
||||
---------- Simulation (key=vmSize) end at 1558076173 (Fri May 17 08:56:13 CEST 2019)
|
||||
|
||||
---------- Simulation (key=vmSize) start at 1558076362 (Fri May 17 08:59:22 CEST 2019)
|
||||
Simulation parameters: serverNode:nova-20.lyon.grid5000.fr serverIp:10.140.0.1 serverMac:00:16:3E:8C:00:01 clientNode:nova-21.lyon.grid5000.fr clientNode:nova-21.lyon.grid5000.fr clientMac:00:16:3E:8C:00:02 delay:60 nbSensors:20 nbSensorsFactor:3 requestPerSensors:30 sensorsRequestPerSec: simKey:vmSize simStart:1558076362 simEnd:1558076670 duration:308 serverNodeName:nova-20 vmSize:2048
|
||||
./recordEnergy.sh nova nova-20 1558076362 1558076670 energy_vmSize_20NS_2048vmSize_1558076362_1558076670.csv
|
||||
---------- Simulation (key=vmSize) end at 1558076670 (Fri May 17 09:04:30 CEST 2019)
|
||||
|
||||
---------- Simulation (key=vmSize) start at 1558076859 (Fri May 17 09:07:39 CEST 2019)
|
||||
Simulation parameters: serverNode:nova-20.lyon.grid5000.fr serverIp:10.140.0.1 serverMac:00:16:3E:8C:00:01 clientNode:nova-21.lyon.grid5000.fr clientNode:nova-21.lyon.grid5000.fr clientMac:00:16:3E:8C:00:02 delay:60 nbSensors:20 nbSensorsFactor:3 requestPerSensors:30 sensorsRequestPerSec: simKey:vmSize simStart:1558076859 simEnd:1558077167 duration:308 serverNodeName:nova-20 vmSize:4096
|
||||
./recordEnergy.sh nova nova-20 1558076859 1558077167 energy_vmSize_20NS_4096vmSize_1558076859_1558077167.csv
|
||||
---------- Simulation (key=vmSize) end at 1558077167 (Fri May 17 09:12:47 CEST 2019)
|
||||
|
||||
---------- Simulation (key=nbSensors) start at 1558077356 (Fri May 17 09:15:56 CEST 2019)
|
||||
Simulation parameters: serverNode:nova-20.lyon.grid5000.fr serverIp:10.140.0.1 serverMac:00:16:3E:8C:00:01 clientNode:nova-21.lyon.grid5000.fr clientNode:nova-21.lyon.grid5000.fr clientMac:00:16:3E:8C:00:02 delay:60 nbSensors:20 nbSensorsFactor:3 requestPerSensors:30 sensorsRequestPerSec: simKey:nbSensors simStart:1558077356 simEnd:1558077664 duration:308 serverNodeName:nova-20 vmSize:2048
|
||||
./recordEnergy.sh nova nova-20 1558077356 1558077664 energy_nbSensors_20NS_2048vmSize_1558077356_1558077664.csv
|
||||
---------- Simulation (key=nbSensors) end at 1558077664 (Fri May 17 09:21:04 CEST 2019)
|
||||
|
||||
---------- Simulation (key=nbSensors) start at 1558077852 (Fri May 17 09:24:12 CEST 2019)
|
||||
Simulation parameters: serverNode:nova-20.lyon.grid5000.fr serverIp:10.140.0.1 serverMac:00:16:3E:8C:00:01 clientNode:nova-21.lyon.grid5000.fr clientNode:nova-21.lyon.grid5000.fr clientMac:00:16:3E:8C:00:02 delay:60 nbSensors:100 nbSensorsFactor:3 requestPerSensors:30 sensorsRequestPerSec: simKey:nbSensors simStart:1558077852 simEnd:1558078188 duration:336 serverNodeName:nova-20 vmSize:2048
|
||||
./recordEnergy.sh nova nova-20 1558077852 1558078188 energy_nbSensors_100NS_2048vmSize_1558077852_1558078188.csv
|
||||
---------- Simulation (key=nbSensors) end at 1558078188 (Fri May 17 09:29:48 CEST 2019)
|
||||
|
||||
---------- Simulation (key=nbSensors) start at 1558078377 (Fri May 17 09:32:57 CEST 2019)
|
||||
Simulation parameters: serverNode:nova-20.lyon.grid5000.fr serverIp:10.140.0.1 serverMac:00:16:3E:8C:00:01 clientNode:nova-21.lyon.grid5000.fr clientNode:nova-21.lyon.grid5000.fr clientMac:00:16:3E:8C:00:02 delay:60 nbSensors:300 nbSensorsFactor:3 requestPerSensors:30 sensorsRequestPerSec: simKey:nbSensors simStart:1558078377 simEnd:1558078782 duration:405 serverNodeName:nova-20 vmSize:2048
|
||||
./recordEnergy.sh nova nova-20 1558078377 1558078782 energy_nbSensors_300NS_2048vmSize_1558078377_1558078782.csv
|
||||
---------- Simulation (key=nbSensors) end at 1558078782 (Fri May 17 09:39:42 CEST 2019)
|
||||
|
19
g5k/logs/first-try/vmSize_1024VMSIZE_20NBSENSORS_.csv
Normal file
19
g5k/logs/first-try/vmSize_1024VMSIZE_20NBSENSORS_.csv
Normal file
|
@ -0,0 +1,19 @@
|
|||
ts,energy
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
2
g5k/recordEnergy.sh
Normal file → Executable file
2
g5k/recordEnergy.sh
Normal file → Executable file
|
@ -9,7 +9,7 @@ nodeName="$2"
|
|||
outputFile="$5"
|
||||
wattmeter=$(curl -s https://api.grid5000.fr/stable/sites/lyon/clusters/${clusterName}/nodes/${nodeName}.json | jq -r '.sensors.power.via.pdu[0].uid')
|
||||
port=$(curl -s https://api.grid5000.fr/stable/sites/lyon/pdus/${wattmeter}.json | jq -r '.ports|to_entries|map(select(.value=="'${nodeName}'"))[0].key')
|
||||
energyEntry=$(( 5 + port) # Define the entry in the CSV that correspond to the correct energy value
|
||||
energyEntry=$(( 5 + port )) # Define the entry in the CSV that correspond to the correct energy value
|
||||
|
||||
if [ -z $wattmeter ] || [ -z $port ]
|
||||
then
|
||||
|
|
48
g5k_bak/clients.py
Executable file
48
g5k_bak/clients.py
Executable file
|
@ -0,0 +1,48 @@
|
|||
#!/usr/bin/python
|
||||
from __future__ import division
|
||||
import os,sys,random, time,datetime
|
||||
from subprocess import Popen
|
||||
|
||||
# Check script argument
|
||||
if len(sys.argv) != 6:
|
||||
print("Usage: "+sys.argv[0]+" <mysqlServerIp> <nbSensors> <nbSensorsFactor> <requestPerSensor> <sendInterval>")
|
||||
exit(1)
|
||||
|
||||
# Init script parameters
|
||||
serverIp=sys.argv[1]
|
||||
nbSensors=int(sys.argv[2])
|
||||
nbSensorsFactor=int(sys.argv[3])
|
||||
effectiveNbSensors=nbSensors*nbSensorsFactor
|
||||
requestPerSensor=int(sys.argv[4])
|
||||
sendInterval=int(sys.argv[5])
|
||||
avgSiteTemp=list()
|
||||
for i in range(0,effectiveNbSensors):
|
||||
avgSiteTemp.append(random.randint(-10,30))
|
||||
|
||||
|
||||
def insert(sensorId, value):
|
||||
""" Send value of sensorId into the database """
|
||||
stamp=int(time.mktime(datetime.datetime.today().timetuple()))
|
||||
insertCMD = "mysql -u user --password=mysql --host="+serverIp+" experiment -e"
|
||||
insertCMD=insertCMD.split()
|
||||
insertCMD.append("INSERT INTO temperature (id,stamp,val) VALUES("+str(sensorId)+","+str(stamp)+","+str(value)+");")
|
||||
Popen(insertCMD) # Run command asynchronously
|
||||
|
||||
def send():
|
||||
""" Send temperature of each sensors into the database """
|
||||
for i in range(0,effectiveNbSensors):
|
||||
insert(i,random.gauss(avgSiteTemp[i], 3))
|
||||
|
||||
|
||||
# Print infos
|
||||
print("Launching clients with:")
|
||||
print(" - Mysql Server IP {:>20}".format(serverIp))
|
||||
print(" - Number of sensors {:>18}".format(effectiveNbSensors))
|
||||
print(" - Number of request per sensor {:>7}".format(effectiveNbSensors))
|
||||
|
||||
# Send data
|
||||
for i in range(0, requestPerSensor):
|
||||
send()
|
||||
time.sleep(sendInterval) # We assume send() take no time
|
||||
|
||||
|
24
g5k_bak/energyFromLogs.sh
Executable file
24
g5k_bak/energyFromLogs.sh
Executable file
|
@ -0,0 +1,24 @@
|
|||
#!/bin/bash
|
||||
|
||||
|
||||
logFile="$(dirname $(readlink -f $0))"/simLogs.txt
|
||||
|
||||
|
||||
getValue () {
|
||||
line=$(echo "$1" | grep "Simulation para"|sed "s/Simulation parameters: //g")
|
||||
key=$2
|
||||
echo "$line"|awk 'BEGIN{RS=" ";FS=":"}"'$key'"==$1{gsub("\n","",$0);print $2}'
|
||||
}
|
||||
|
||||
IFS=$'\n'
|
||||
for cmd in $(cat $logFile|grep "Simulation parameters")
|
||||
do
|
||||
nodeName=$(getValue $cmd serverNodeName)
|
||||
from=$(getValue $cmd startSim)
|
||||
to=$(getValue $cmd endSim)
|
||||
vmSize=$(getValue $cmd vmSize)
|
||||
nbSensors=$(getValue $cmd nbSensors)
|
||||
simKey=$(getValue $cmd simKey)
|
||||
./recordEnergy.sh nova $nodeName $from $to nova $nodeName $from $to "${simKey}_${vmSize}VMSIZE_${nbSensors}NBSENSORS_${from}${to}.csv"
|
||||
done
|
||||
|
154
g5k_bak/init-nodes.sh
Executable file
154
g5k_bak/init-nodes.sh
Executable file
|
@ -0,0 +1,154 @@
|
|||
#!/bin/bash
|
||||
|
||||
##### Parameters #####
|
||||
if [ -z ${nbSensors+x} ] # If nbSensors exists, so all parameters are already define
|
||||
then
|
||||
delay=60 # Delay before starting simulation (let CPU energy going down on the server)
|
||||
nbSensors=30 # Number of sensors that will send request to de server
|
||||
nbSensorsFactor=3 # nbSensors*nbSensorFactor
|
||||
simulationTime=300 # Approximative
|
||||
sensorsSendInterval=10 # Delay between sensors requests
|
||||
vmSize=2048 # Number of alocated ram
|
||||
simKey="NONE"
|
||||
fi
|
||||
nHours=3 # Reservation dutation
|
||||
requestPerSensor=$(( simulationTime / sensorsSendInterval )) # Theorical simulation time is $requestPerSensor*$sensorsSendInterval
|
||||
######################
|
||||
|
||||
|
||||
logFile="./simLogs.txt"
|
||||
log () {
|
||||
echo -e "\033[0;34m$@\033[0m"
|
||||
}
|
||||
|
||||
sshWait () {
|
||||
log "Waiting for for an ssh connection to a vm ($1)"
|
||||
error=255
|
||||
until [ $error -eq 0 ]
|
||||
do
|
||||
ssh -q root@$1 echo "Connected to $(hostname)"
|
||||
error=$?
|
||||
sleep 4
|
||||
done
|
||||
}
|
||||
|
||||
if [ "$1" = "subscribe" ] && [ $# -eq 1 ]
|
||||
then
|
||||
log "Subscribing..."
|
||||
oarsub -l slash_22=1+{"virtual!='NO' AND cluster='nova'"}/nodes=2,walltime=$nHours 'sleep "10d"' # On node send request to the other
|
||||
elif [ "$1" = "deploy" ] && [ $# -eq 1 ]
|
||||
then
|
||||
# Get machine mac address
|
||||
serverSubnet=$(g5k-subnets -im|sed "1q;d")
|
||||
clientSubnet=$(g5k-subnets -im|sed "2q;d")
|
||||
serverMac=$(echo "$serverSubnet"|sed "s/^.*\t//g")
|
||||
clientMac=$(echo "$clientSubnet"|sed "s/^.*\t//g")
|
||||
serverIp=$(echo "$serverSubnet"|sed "s/\t.*$//g")
|
||||
clientIp=$(echo "$clientSubnet"|sed "s/\t.*$//g")
|
||||
serverNode=""
|
||||
clientNode=""
|
||||
|
||||
# Run vms
|
||||
log "Run vms..."
|
||||
isServer=1
|
||||
finished=0
|
||||
for node in $(cat $OAR_NODE_FILE|uniq)
|
||||
do
|
||||
# Init vm images
|
||||
log "Create $node vm image"
|
||||
oarsh $node cp -n /grid5000/virt-images/debian9-x64-base.qcow2 /tmp/
|
||||
oarsh $node qemu-img create -f qcow2 -o backing_file=/tmp/debian9-x64-base.qcow2 /tmp/img.qcow2
|
||||
sleep 1 # Wait for fun
|
||||
|
||||
# Build cloud init iso (to have ssh access witouth password
|
||||
log "Create $node cloud-init image"
|
||||
oarsh $node cp /grid5000/virt-images/cloud-init-example.sh /tmp/
|
||||
oarsh $node "cd /tmp && export cloud_init_key=\$(cat ~/.ssh/id_rsa.pub) && ./cloud-init-example.sh"
|
||||
oarsh $node "cd /tmp && genisoimage -output cloud-init-data.iso -volid cidata -joliet -rock cloud-init-data/user-data cloud-init-data/meta-data"
|
||||
# Refresh loop state
|
||||
[ $isServer -eq 1 ] && { curMac=$serverMac; isServer=0; serverNode=$node; } || { curMac=$clientMac; finished=1; clientNode=$node; }
|
||||
|
||||
# Launch vm
|
||||
log "Launch vm $node"
|
||||
oarsh $node kvm -m ${vmSize}M -hda /tmp/img.qcow2 -netdev bridge,id=br0 -device virtio-net-pci,netdev=br0,id=nic1,mac=$curMac -cdrom /tmp/cloud-init-data.iso -display none -daemonize &
|
||||
|
||||
# Stop looping if we finish
|
||||
[ $finished -eq 1 ] && break
|
||||
done
|
||||
|
||||
log "Installing mysql on $serverIp"
|
||||
serverNodeName=$(echo $serverNode|grep -o ^.*[-][0-9]*) # For logging
|
||||
onNode="ssh -q root@$serverIp" # For convenience
|
||||
|
||||
##### Server #####
|
||||
sshWait $serverIp
|
||||
# One apt-get update seems to be not enought to get mysql-server
|
||||
$onNode "apt-get update && apt-get update"
|
||||
$onNode apt-get -y install mysql-server
|
||||
# Enable mysql connection from outside
|
||||
$onNode sed -i "s/bind-address/#bind-address/g" /etc/mysql/mariadb.conf.d/50-server.cnf
|
||||
$onNode systemctl restart mysql
|
||||
rsync -avh setup-mysql.sql root@$serverIp:/tmp/
|
||||
# Then execute it
|
||||
$onNode "mysql < /tmp/setup-mysql.sql"
|
||||
|
||||
##### Client #####
|
||||
$sshWait $clientIp
|
||||
onNode="ssh -q root@$clientIp"
|
||||
$onNode "apt-get update && apt-get update"
|
||||
$onNode apt-get -y install mysql-server
|
||||
rsync -avh clients.py root@$clientIp:/tmp/
|
||||
|
||||
##### Start Simulation #####
|
||||
log "Simulation will start in ${delay}s"
|
||||
sleep $delay
|
||||
simStart=$(date "+%s")
|
||||
echo "---------- Simulation (key=${simKey}) start at $simStart ($(date -d @${simStart}))" >> $logFile
|
||||
$onNode python /tmp/clients.py $serverIp $nbSensors $nbSensorsFactor $requestPerSensor $sensorsSendInterval
|
||||
simEnd=$(date "+%s")
|
||||
echo "Simulation parameters: serverNode:$serverNode serverIp:$serverIp serverMac:$serverMac clientNode:$clientNode clientNode:$clientNode clientMac:$clientMac delay:$delay nbSensors:$nbSensors nbSensorsFactor:$nbSensorsFactor requestPerSensors:$requestPerSensor sensorsRequestPerSec:$sensorsRequestPerSec simKey:${simKey} simStart:${simStart} simEnd:${simEnd} duration:$(( simEnd - simStart )) serverNodeName:${serverNodeName} vmSize:${vmSize}" >> $logFile
|
||||
echo "./recordEnergy.sh nova $serverNodeName $simStart $simEnd energy_${simKey}_${nbSensors}NS_${vmSize}vmSize_${simStart}_${simEnd}.csv" >> $logFile
|
||||
echo -e "---------- Simulation (key=${simKey}) end at ${simEnd} ($(date -d @${simEnd}))\n" >> $logFile
|
||||
log "Simulation end ! Please see $logFile for more infos"
|
||||
##### End Simulation #####
|
||||
|
||||
##### Print some infos #####
|
||||
log "Network Settings:"
|
||||
log " - Server $serverNode, $serverIp, $serverMac"
|
||||
log " - Client $clientNode, $clientIp, $clientMac"
|
||||
log "Simulation Settings:"
|
||||
log " - Simulation delay ${delay}s"
|
||||
log " - Number of sensors $(( nbSensors * nbSensorsFactor))"
|
||||
log " - Number of request per sensors $requestPerSensor"
|
||||
log " - Number of request per seconds on eachsensors $sensorsRequestPerSec"
|
||||
|
||||
elif [ "$1" = "kill" ] && [ $# -eq 1 ]
|
||||
then
|
||||
##### Kill all kvm on the subscribed nodes #####
|
||||
isServer=1
|
||||
finished=0
|
||||
for node in $(cat $OAR_NODE_FILE|uniq)
|
||||
do
|
||||
[ $isServer -eq 1 ] && { curMac=$serverMac; isServer=0; serverNode=$node; } || { curMac=$clientMac; finished=1; clientNode=$node; }
|
||||
log "Killing vm on node $node"
|
||||
oarsh $node pkill -9 qemu &
|
||||
[ $finished -eq 1 ] && break
|
||||
done
|
||||
elif [ "$1" = "inspect" ] && [ $# -eq 2 ]
|
||||
then
|
||||
##### Show content of the database #####
|
||||
mysql --host="$2" -u user --password="mysql" experiment -e "SELECT * FROM temperature;"
|
||||
elif [ "$1" = "flush" ] && [ $# -eq 2 ]
|
||||
then
|
||||
##### Flush content of the temperature table #####
|
||||
log "Cleaning database table..."
|
||||
mysql --host="$2" -u user --password="mysql" experiment -e "TRUNCATE TABLE temperature;"
|
||||
else
|
||||
echo "Usage:"
|
||||
echo " - $0 subscribe"
|
||||
echo " - $0 deploy"
|
||||
echo " - $0 kill"
|
||||
echo " - $0 inspect <serverIP>"
|
||||
echo " - $0 flush <serverIP>"
|
||||
fi
|
||||
|
42
g5k_bak/recordEnergy.sh
Normal file
42
g5k_bak/recordEnergy.sh
Normal file
|
@ -0,0 +1,42 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Parse argument
|
||||
[ $# != 5 ] && { echo "Usage: $0 <cluster-name> <node-name> <from> <to> <output-file>"; exit 1; }
|
||||
|
||||
# Init arguments
|
||||
clusterName="$1"
|
||||
nodeName="$2"
|
||||
outputFile="$5"
|
||||
wattmeter=$(curl -s https://api.grid5000.fr/stable/sites/lyon/clusters/${clusterName}/nodes/${nodeName}.json | jq -r '.sensors.power.via.pdu[0].uid')
|
||||
port=$(curl -s https://api.grid5000.fr/stable/sites/lyon/pdus/${wattmeter}.json | jq -r '.ports|to_entries|map(select(.value=="'${nodeName}'"))[0].key')
|
||||
energyEntry=$(( 5 + port) # Define the entry in the CSV that correspond to the correct energy value
|
||||
|
||||
if [ -z $wattmeter ] || [ -z $port ]
|
||||
then
|
||||
echo -ne "\nCannot find energy informations (wattmeter/port) for node $nodeName\n"
|
||||
echo -ne "\nCheck the node name (do not use hostname! only node name ex: nova-7)\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Node ${nodeName} is connected on wattmeter ${wattmeter} on port ${port}"
|
||||
|
||||
# Fetching energy and save in csv format
|
||||
from=$(date -d "@$3" "+%s")
|
||||
to=$(date -d "@$4" "+%s")
|
||||
echo "ts,energy" > $outputFile # Write CSV header
|
||||
for time in $(seq $from 3600 $to)
|
||||
do
|
||||
# We need gz extension if it is not the current hour
|
||||
[ $(date -d "@$time" "+%Y-%m-%dT%H") != $(date "+%Y-%m-%dT%H") ] && ext='.gz' || ext=''
|
||||
powerFilename=$(date -d "@$time" "+power.csv.%Y-%m-%dT%H${ext}")
|
||||
url="http://wattmetre.lyon.grid5000.fr/data/${wattmeter}-log/${powerFilename}"
|
||||
echo "- Fetching logs from ${url}"
|
||||
|
||||
# Fetch logs data
|
||||
[ ! -z $ext ] && csvContent=$(curl -s "${url}" | zcat) || csvContent=$(curl -s "${url}")
|
||||
|
||||
# Parse data and extract the right values in csv format
|
||||
toSave=$(echo "$csvContent" | awk -F, 'int($3)>='$from'&& int($3)<='$to'{printf "%s,%s\n",$3,$5+'$port'};')
|
||||
echo "$toSave" >> $outputFile # Save data in csv
|
||||
done
|
||||
echo "Done"
|
39
g5k_bak/run-sim.sh
Executable file
39
g5k_bak/run-sim.sh
Executable file
|
@ -0,0 +1,39 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Parameters
|
||||
delay=60 # Delay before starting simulation (let CPU energy going down on the server)
|
||||
nbSensors=20 # Number of sensors that will send request to de server
|
||||
nbSensorsFactor=3 # nbSensors*nbSensorFactor
|
||||
simulationTime=300 # Approximative
|
||||
sensorsSendInterval=10 # Delay between sensors requests
|
||||
# requestPerSensor dynamically computed inside init-nodes
|
||||
vmSize=2048 # Number of alocated ram
|
||||
simKey="NONE"
|
||||
|
||||
# Where script is located
|
||||
simScript=$(dirname $(readlink -f "$0"))/init-nodes.sh
|
||||
|
||||
# Build a function using the script
|
||||
initNodes () {
|
||||
source "$simScript"
|
||||
}
|
||||
|
||||
|
||||
##### Test VM RAM #####
|
||||
simKey="vmSize"
|
||||
for vmSize in $(echo 1024 2048 4096)
|
||||
do
|
||||
initNodes deploy
|
||||
initNodes kill # Kill all vms (do not forget :D)
|
||||
done
|
||||
|
||||
vmSize=2048 # Reset vmSize
|
||||
|
||||
simKey="nbSensors"
|
||||
##### Test number of sensors #####
|
||||
for nbSensors in $(echo 20 100 300)
|
||||
do
|
||||
initNodes deploy
|
||||
initNodes kill # Kill all vms
|
||||
done
|
||||
|
8
g5k_bak/setup-mysql.sql
Normal file
8
g5k_bak/setup-mysql.sql
Normal file
|
@ -0,0 +1,8 @@
|
|||
create DATABASE IF NOT EXISTS experiment;
|
||||
use experiment;
|
||||
create TABLE IF NOT EXISTS temperature (id INTEGER,stamp INTEGER, val INTEGER);
|
||||
|
||||
use mysql;
|
||||
CREATE USER 'user'@'%' IDENTIFIED BY 'mysql';
|
||||
GRANT ALL ON experiment.* TO 'user'@'%';
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue