mirror of
https://github.com/cetic/unikernels.git
synced 2024-10-18 23:22:35 +07:00
94 lines
3.2 KiB
Python
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")
|
|
|
|
|