unikernels/BENCHMARKING/startup_cont_benchmark.py
Gaetan Longree 4411d5800e First commit
2018-05-11 15:51:48 +02:00

94 lines
3.2 KiB
Python

#!/usr/bin/python3
import sys
import subprocess
import os.path
import csv
import json
import time
import _thread
import os
import datetime as datetime
import random
BENCHMARK_TIME_SECONDS=60*20
MAX_NBR_VMS=150
NBR_VMS_INCREMENT=10
GUESTS=dict()
NBR_VMS=0
def run_cmd(COMMAND):
return subprocess.run(COMMAND, stdout=subprocess.PIPE, shell=True)
def timeGuestStart(GUEST):
response = 1
startTime=datetime.datetime.now()
while response is not 0:
response = os.system("ping -c 1 " + GUESTS[GUEST] + "> /dev/null 2>&1")
endTime=datetime.datetime.now()
bootTime=(endTime-startTime).microseconds
with open("startup_cont_benchmark.csv", "a") as file:
writer = csv.writer(file)
writer.writerow([NBR_VMS, GUEST, (bootTime/1000000)])
if __name__ == '__main__':
if len(sys.argv) < 2:
print("Application Startup Benchmarking Tool - CETIC Internship 2017/18 on Unikernels\n\tUsage: python3 startup_cont_benchmark.py [nbr of VMs]")
sys.exit(1)
NBR_VMS=int(sys.argv[1])
if os.path.isfile("startup_cont_benchmark.csv") is not True:
subprocess.run("touch startup_cont_benchmark.csv", stdout=subprocess.PIPE, shell=True)
with open("startup_cont_benchmark.csv", "w") as file:
writer = csv.writer(file)
writer.writerow(["NBR_OF_GUESTS", "GUEST_STOPPED", "STARTUP_TIME_SECONDS"])
while NBR_VMS < MAX_NBR_VMS:
print("### STOPPING PREVIOUS VMS")
# stop all running VMs
run_cmd("docker stop $(docker ps -a -q) 2> /dev/null")
run_cmd("virsh list | grep running | awk '{ print $2}' | while read DOMAIN; do virsh destroy $DOMAIN; sleep 3; virsh undefine $DOMAIN; done")
run_cmd("docker ps -a -q | while read DOMAIN; do docker rm $DOMAIN; done")
# create table of guest VMs
GUESTS.clear()
i = 10
for x in range(int(NBR_VMS)):
GUESTS[("VM_"+str(x))] = ("172.18.0." + str(i))
i = i+1
print("### BUILDING CONTAINERS")
run_cmd("cd ../SOURCE/CONTAINER && docker build -t cetic/compiler .")
run_cmd("cd ../SOURCE/CONTAINER/DNS &&\
docker run --rm -it -v $PWD:/usr/src/build -w /usr/src/build cetic/compiler g++ -std=c++11 -static -o runnableService *.cpp &&\
docker build -t cetic/dns .")
run_cmd("docker network create --subnet=172.18.0.0/16 --driver=bridge bench_net 2> /dev/null")
print("### LAUNCHING CONTAINERS")
# create and launch each VM
for key, value in GUESTS.items():
# for each entry in GUESTS build the unikernel and move the img to another folder
run_cmd("docker run --cpus 1 -m 128m -d --ip " + value + " --network=bench_net --name " + key + " cetic/dns 2> /dev/null")
print("### LAUNCHING BENCHMARK FOR " + str(BENCHMARK_TIME_SECONDS) + " SECONDS")
timeout=time.time() + BENCHMARK_TIME_SECONDS
while time.time() <= timeout:
# stop a VM
RANDOM_GUEST="VM_"+str(random.randint(0, (int(NBR_VMS)-1)))
run_cmd("docker stop " + RANDOM_GUEST)
print(RANDOM_GUEST + " shut down")
# launch a thread to start a VM
_thread.start_new_thread(run_cmd, ("docker start " + RANDOM_GUEST, ))
# launch another thread to time boot time
_thread.start_new_thread(timeGuestStart, (RANDOM_GUEST, ))
print(RANDOM_GUEST + " started...")
time.sleep(5)
#increment number of VMs for next test
NBR_VMS=NBR_VMS+NBR_VMS_INCREMENT
run_cmd("docker stop $(docker ps -a -q) 2> /dev/null")