diff --git a/src/profiler.py b/src/profiler.py new file mode 100644 index 0000000000000000000000000000000000000000..b2b9d0d053ddaed02d6ac852d28b70f9c8457e55 --- /dev/null +++ b/src/profiler.py @@ -0,0 +1,124 @@ +#!/usr/bin/python +############################################################################## +# profiler of oneM2M stacks +# creator: +# Thierry Monteil (thierry.monteil@irit.fr) +# +#BSD 3-Clause License +# +#Copyright (c) 2024, IoT / SmartM2M-oneM2M-performance-evaluation +#All rights reserved. + +import socket +import os +import time +import signal + +# port and host to receive order from client part +HOST = 'localhost' +PORT = 9998 + +# capacity of processor in term of mips +MIPS = 4589 + +def runoneM2MStack(STACK): + newpid = os.fork() + if newpid == -1: + print("Error creating stack") + exit(-1) + + elif newpid == 0: # should run +"stack + print("start stack: "+STACK) + if STACK=="ACME": + os.execv('/usr/bin/python3',['python3','-m','acme']) + print("error stack "+STACK+" has been stopped") + exit(-2) + + else: # shoud open process image + time.sleep(5) + print("pid of stack is"+str(newpid)) + fic_cpu=open('/proc/'+str(newpid)+'/stat','r') + fic_mem=open('/proc/'+str(newpid)+'/statm','r') + #fic_cpu=open('./stat.txt','r') + #fic_mem=open('./statm.txt','r') + print("stat files have been opened") + return fic_cpu, fic_mem, newpid + +def getResources(fic_res, fic_mem): + # tick per secodfor this processor + CLK_TCK=100 + linecpu=fic_res.read() + fic_res.seek(0) + # find the fields + fieldscpu = linecpu.strip().split(' ') + # analyse fields + cpu = (float(fieldscpu[13])+float(fieldscpu[14]))/CLK_TCK + linemem=fic_mem.read() + fic_mem.seek(0) + fieldsmem = linemem.strip().split(' ') + size_rss_pages = int(fieldsmem[1]) # size resident pages + size_shared_pages = int(fieldsmem[2]) # size shared pages + # convert in Bytes + size_page_Bytes = os.sysconf('SC_PAGESIZE') + memory=size_rss_pages * size_page_Bytes + size_shared_pages * size_page_Bytes + print("cpu: "+str(cpu)+" mem: "+str(memory)) + return cpu, memory + + +def main(): + global fic_cpu + global fic_mem + global fic_stat +# run server part + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + s.bind((HOST, PORT)) + s.listen(1) + runServer=True + print("-----------connect") + conn, address = s.accept() + with conn: + while runServer: + buff = conn.recv(512) + message = buff.decode('utf-8') + print("-----------receive "+message) + # runserver=False for stop + fieldsorder =message.strip().split(' ') + + if fieldsorder[0]=="RUN": + # run the stack + fic_cpu, fic_mem, pid= runoneM2MStack(fieldsorder[1]) + print("iot stack: "+fieldsorder[1]+" is running with pid:"+str(pid)) + # open json file + fic_stat=open(fieldsorder[1]+"_Resources",'w') + fic_stat.write("Mips "+str(MIPS)+"\n") + print("-----------send OK") + conn.sendall("OK".encode('utf-8')) + elif fieldsorder[0]=="START": + cpu_start, mem_start = getResources(fic_cpu, fic_mem) + print("-----------send OK") + conn.sendall("OK".encode('utf-8')) + elif fieldsorder[0]=="STOP": + cpu_end, mem_end = getResources(fic_cpu, fic_mem) + # write cpu and mem used per request + print("-----------write: "+fieldsorder[2]+", "+fieldsorder[3] + ", cpu, "+str((cpu_end-cpu_start)/int(fieldsorder[1]))+", mem, "+str((mem_end-mem_start)/int(fieldsorder[1]))) + fic_stat.write(fieldsorder[2]+", "+fieldsorder[3] + ", cpu, "+str((cpu_end-cpu_start)/int(fieldsorder[1]))+", mem, "+str((mem_end-mem_start)/int(fieldsorder[1]))+"\n") + print("-----------send OK") + conn.sendall("OK".encode('utf-8')) + elif fieldsorder[0]=="END": + time.sleep(2); + fic_stat.close() + fic_mem.close() + fic_cpu.close() + runServer=False + print("-----------send OK") + conn.sendall("OK".encode('utf-8')) + print("Stop IoT STACK") + os.kill(pid, signal.SIGKILL) + + + + + +if __name__ == "__main__": + main()