This commit is contained in:
Loic Guegan 2019-05-17 09:53:09 +02:00
parent 026a84902c
commit 1ab4a6a97a
19 changed files with 95601 additions and 4 deletions

View file

@ -0,0 +1 @@
## OAR [2019-05-16 15:38:38] Job 1028994 KILLED ##

48
energyCloud/g5k/clients.py Executable file
View 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

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

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

153
energyCloud/g5k/init-nodes.sh Executable file
View file

@ -0,0 +1,153 @@
#!/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"
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} duration:$(( simEnd - simStart ))" >> $logFile
echo "./recordEnergy.sh nova $(echo serverNode|grep -o ^.*[-][0-9]*) $simStart $simEnd energy_${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

View 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"

View file

@ -0,0 +1,41 @@
#!/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"
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
energyCloud/g5k/run-sim.sh Executable file
View 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

View 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'@'%';

View file

@ -0,0 +1,15 @@
---------- Simulation (key=vmSize) start at 1558010372 (Thu May 16 14:39:32 CEST 2019)
Simulation parameters: serverNode:nova-7.lyon.grid5000.fr serverIp:10.140.16.1 serverMac:00:16:3E:8C:10:01 clientNode:nova-8.lyon.grid5000.fr clientNode:nova-8.lyon.grid5000.fr clientMac:00:16:3E:8C:10:02 delay:60 nbSensors:20 nbSensorsFactor:3 requestPerSensors:30 sensorsRequestPerSec: simKey:vmSize duration:308
./recordEnergy.sh nova nova-7.lyon.grid5000.fr 1558010372 1558010680 energy_1558010372_1558010680.csv
---------- Simulation (key=vmSize) end at 1558010680 (Thu May 16 14:44:40 CEST 2019)
---------- Simulation (key=vmSize) start at 1558010868 (Thu May 16 14:47:48 CEST 2019)
Simulation parameters: serverNode:nova-7.lyon.grid5000.fr serverIp:10.140.16.1 serverMac:00:16:3E:8C:10:01 clientNode:nova-8.lyon.grid5000.fr clientNode:nova-8.lyon.grid5000.fr clientMac:00:16:3E:8C:10:02 delay:60 nbSensors:20 nbSensorsFactor:3 requestPerSensors:30 sensorsRequestPerSec: simKey:vmSize duration:308
./recordEnergy.sh nova nova-7.lyon.grid5000.fr 1558010868 1558011176 energy_1558010868_1558011176.csv
---------- Simulation (key=vmSize) end at 1558011176 (Thu May 16 14:52:56 CEST 2019)
---------- Simulation (key=vmSize) start at 1558011366 (Thu May 16 14:56:06 CEST 2019)
Simulation parameters: serverNode:nova-7.lyon.grid5000.fr serverIp:10.140.16.1 serverMac:00:16:3E:8C:10:01 clientNode:nova-8.lyon.grid5000.fr clientNode:nova-8.lyon.grid5000.fr clientMac:00:16:3E:8C:10:02 delay:60 nbSensors:20 nbSensorsFactor:3 requestPerSensors:30 sensorsRequestPerSec: simKey:vmSize duration:308
./recordEnergy.sh nova nova-7.lyon.grid5000.fr 1558011366 1558011674 energy_1558011366_1558011674.csv
---------- Simulation (key=vmSize) end at 1558011674 (Thu May 16 15:01:14 CEST 2019)

24
g5k/energyFromLogs.sh Executable file
View 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

View file

@ -77,6 +77,7 @@ then
done
log "Installing mysql on $serverIp"
serverNodeName=$(echo $serverNode|grep -o ^.*[-][0-9]*) # For logging
onNode="ssh -q root@$serverIp" # For convenience
##### Server #####
@ -105,8 +106,8 @@ then
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} duration:$(( simEnd - simStart ))" >> $logFile
echo "./recordEnergy.sh nova $serverNode $simStart $simEnd energy_${simStart}_${simEnd}.csv" >> $logFile
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 #####

View file

@ -9,11 +9,12 @@ 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=$(expr 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
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

View file

@ -21,7 +21,7 @@ initNodes () {
##### Test VM RAM #####
simKey="vmSize"
for vmSize in $(echo 128 1024 2048)
for vmSize in $(echo 1024 2048 4096)
do
initNodes deploy
initNodes kill # Kill all vms (do not forget :D)

15
g5k/simLogs.txt Normal file
View file

@ -0,0 +1,15 @@
---------- Simulation (key=vmSize) start at 1558010372 (Thu May 16 14:39:32 CEST 2019)
Simulation parameters: serverNode:nova-7.lyon.grid5000.fr serverIp:10.140.16.1 serverMac:00:16:3E:8C:10:01 clientNode:nova-8.lyon.grid5000.fr clientNode:nova-8.lyon.grid5000.fr clientMac:00:16:3E:8C:10:02 delay:60 nbSensors:20 nbSensorsFactor:3 requestPerSensors:30 sensorsRequestPerSec: simKey:vmSize duration:308
./recordEnergy.sh nova nova-7.lyon.grid5000.fr 1558010372 1558010680 energy_1558010372_1558010680.csv
---------- Simulation (key=vmSize) end at 1558010680 (Thu May 16 14:44:40 CEST 2019)
---------- Simulation (key=vmSize) start at 1558010868 (Thu May 16 14:47:48 CEST 2019)
Simulation parameters: serverNode:nova-7.lyon.grid5000.fr serverIp:10.140.16.1 serverMac:00:16:3E:8C:10:01 clientNode:nova-8.lyon.grid5000.fr clientNode:nova-8.lyon.grid5000.fr clientMac:00:16:3E:8C:10:02 delay:60 nbSensors:20 nbSensorsFactor:3 requestPerSensors:30 sensorsRequestPerSec: simKey:vmSize duration:308
./recordEnergy.sh nova nova-7.lyon.grid5000.fr 1558010868 1558011176 energy_1558010868_1558011176.csv
---------- Simulation (key=vmSize) end at 1558011176 (Thu May 16 14:52:56 CEST 2019)
---------- Simulation (key=vmSize) start at 1558011366 (Thu May 16 14:56:06 CEST 2019)
Simulation parameters: serverNode:nova-7.lyon.grid5000.fr serverIp:10.140.16.1 serverMac:00:16:3E:8C:10:01 clientNode:nova-8.lyon.grid5000.fr clientNode:nova-8.lyon.grid5000.fr clientMac:00:16:3E:8C:10:02 delay:60 nbSensors:20 nbSensorsFactor:3 requestPerSensors:30 sensorsRequestPerSec: simKey:vmSize duration:308
./recordEnergy.sh nova nova-7.lyon.grid5000.fr 1558011366 1558011674 energy_1558011366_1558011674.csv
---------- Simulation (key=vmSize) end at 1558011674 (Thu May 16 15:01:14 CEST 2019)