# # The life of a url in the cache is as follows; # # |------|-------|-------|-------|-------|-------| #modify serve fetch verify access expire release # |---------------------|------|------- # modify serve fetch # # |------| age # |--------------------------------------| life # |---------------| used # |-------------------------------| held # |---| stale # # modify = time of creation at server # serve = first time sent from server # fetch = time loaded to cache # verify = last time verified at server # access = last time accessed from cache # expire = time of expire at server # release = time released from cache # # url_fetches = number of fetches on the url (objects/url) # obj_accesses = number of accesses on the object (accesses/object) # obj_verifies = number of verifys on the object (verifies/object) # obj_age = total age of object when served # obj_life = expected life of object when served # obj_used = time from first to last access # obj_held = time from fetch to release # obj_stale = time from modify to last access before updating object # dur_fetch = duration of fetch (cache miss) # dur_verify = duration of verify (cache verify) # dur_access = duration of access (cache hit) # vol_fetch = volume of fetches (cache miss) # vol_verify = volume of verifies (cache verify) # vol_access = volume of accesses (cache hit) # # Note: # need modify and expire to calc life. # need modify and serve to calc age. # can approximate serve as fetch (- duration?) from Stats1 import * from sys import * from String import * url_fetches =Sample() obj_accesses =Sample() obj_verifies =Sample() obj_age =Sample() obj_life =Sample() obj_used =Sample() obj_held =Sample() obj_stale =Sample() dur_fetch =Sample() dur_verify =Sample() dur_access =Sample() vol_fetch =Sample() vol_verify =Sample() vol_access =Sample() urls ={} def fetch(url,time,dur,size): try: urls[url].fetch(time,dur,size) except: urls[url]=url_rec(); urls[url].fetch(time,dur,size) dur_fetch.Add(dur) vol_fetch.Add(size) def verify(url,time,dur,size): try: urls[url].verify(time,dur,size) except: urls[url]=url_rec(); urls[url].verify(time,dur,size) dur_verify.Add(dur) vol_verify.Add(size) def access(url,time,dur,size): try: urls[url].access(time,dur,size) except: urls[url]=url_rec(); urls[url].access(time,dur,size) dur_access.Add(dur) vol_access.Add(size) def release(url,time,served,modified,expires,size): try: urls[url].release(time,served,modified,expires,size) except: urls[url]=url_rec(); urls[url].release(time,served,modified,expires,size) def output(): # url_fetches.Display ("fetches per url :") obj_accesses.Display("accesses per object:") obj_verifies.Display("verifies per object:") obj_age.Display ("object fetched age :") obj_life.Display ("object fetched life:") obj_used.Display ("object used time :") obj_held.Display ("object held time :") obj_stale.Display ("object stale time :") dur_fetch.Display ("fetch request time :") dur_verify.Display ("verify request time:") dur_access.Display ("access request time:") vol_fetch.Display ("fetch request vol :") vol_verify.Display ("verify request vol :") vol_access.Display ("access request vol :") class url_rec: url_fetches =0 obj_accesses=0 obj_verifies=0 obj_modify =-2.0 obj_serve =-2.0 obj_fetch =-2.0 obj_verify =-2.0 obj_access =-2.0 obj_expire =-2.0 obj_release =-2.0 obj_last =-2.0 def fetch(self,time,dur,size): # print time,dur,size self.obj_last=self.obj_access self.url_fetches=self.url_fetches+1 self.obj_accesses=1 self.obj_verifies=0 self.obj_modify =-2.0 self.obj_serve =time-dur self.obj_fetch =time self.obj_verify =time self.obj_access =time self.obj_expire =-2.0 self.obj_release =-2.0 def verify(self,time,dur,size): self.obj_verifies=self.obj_verifies+1 self.obj_verify =time self.obj_access =time def access(self,time,dur,size): # print time,dur,size self.obj_accesses=self.obj_accesses+1 self.obj_access =time def release(self,time,served,modified,expired,size): # print time,served,modified,expired,size if served > 0: self.obj_serve=served self.obj_modify = modified self.obj_expire = expired self.obj_release = time if self.obj_fetch > 0: obj_accesses.Add(self.obj_accesses) obj_verifies.Add(self.obj_verifies) if self.obj_modify > 0: obj_age.Add(self.obj_serve - self.obj_modify) if self.obj_expire > 0: obj_life.Add(self.obj_expire - self.obj_modify) if self.obj_fetch > 0: obj_used.Add(self.obj_access - self.obj_fetch) obj_held.Add(self.obj_release - self.obj_fetch) if self.obj_last > 0 and self.obj_modify > 0: obj_stale.Add(self.obj_last - self.obj_modify) def display(self,comment): print comment, print self.url_fetches , print self.obj_accesses, print self.obj_verifies, print self.obj_modify , print self.obj_serve , print self.obj_fetch , print self.obj_verify , print self.obj_access , print self.obj_expire , print self.obj_release , print self.obj_last line=stdin.readline() while line: fields=split(line) if fields[1]=="RELEASE": release(fields[9],atof(fields[0]),atof(fields[3]),atof(fields[4]),atof(fields[5]),0.0) elif fields[1]!="SWAPIN" and fields[1]!="SWAPOUT": if fields[3]=="TCP_MISS/200": fetch(fields[6],atof(fields[0]),atof(fields[1]),atof(fields[4])) else: access(fields[6],atof(fields[0]),atof(fields[1]),atof(fields[4])) line=stdin.readline() #for v in urls.keys(): # print v, # urls[v].display() output()