def distribution_with_subsampling(num:int=1, interval:int=100, pause:float=None, duty:float=None, subinterval:int=None, vms=None): """ Intervals are in ms. Duty cycle is in (0,1] range. """ from qemu import ipcistat # lazy loading standard = defaultdict(list) withskip = defaultdict(list) assert not (pause and duty), "accepts either pause or duty" if duty: pause = (interval / duty) / 1000 # in seconds elif not pause: pause = 0.1 for _ in range(num): print("step 1: {} out of {}".format(_+1, num)) # STEP 1: normal freezing approach for vm in vms: sleep(pause) vm.exclusive() try: ipc = vm.ipcstat(interval) standard[vm.bname].append(ipc) #print("saving quasi to", vm.bname, ipc) except NotCountedError: print("missed data point for", vm.bname) pass vm.shared() # STEP 2: approach with sub-sampling and skip #print("step 2: {} out of {}".format(_+1, num)) for vm in vms: sleep(pause) try: vm.exclusive() ipc = ipcistat(vm, interval=interval, subinterval=subinterval) withskip[vm.bname].append(ipc) #print("saving sub-sampled to", vm.bname, ipc) except NotCountedError: print("missed data point for", vm.bname) pass finally: vm.shared() return Struct(standard=standard, withskip=withskip)
def distribution_with_subsampling2(num:int=1, interval:int=100, pause:float=None, duty:float=None, subinterval:int=None, vms=None): """ Intervals are in ms. Duty cycle is in (0,1] range. """ from qemu import ipcistat # lazy loading assert not (pause and duty), "accepts either pause or duty" if duty: pause = (interval / duty) / 1000 # in seconds elif not pause: pause = 0.1 isolated = defaultdict(list) frozen = defaultdict(list) batch_size = 10 assert num % batch_size == 0, \ "number of samples should divide by 10, got %s" % num iterations = num // batch_size for i in range(iterations): print("interval %s: %s out of %s" % (interval, i, iterations)) isolated_sampling(num=batch_size, interval=interval, pause=pause, result=isolated, vms=vms) for i in range(num): for vm in vms: sleep(pause) try: vm.exclusive() ipc = ipcistat(vm, interval=interval, subinterval=subinterval) frozen[vm.bname].append(ipc) #print("saving sub-sampled to", vm.bname, ipc) except NotCountedError: print("missed data point for", vm.bname) pass finally: vm.shared() freezing_sampling(num=batch_size, interval=interval, pause=pause, result=frozen, vms=vms) return Struct(isolated=isolated, frozen=frozen)