def render_all_html(comment, info, lab_description, images, templ_name): data = info.__dict__.copy() for name, val in data.items(): if not name.startswith("__"): if val is None: if name in ("direct_iops_w64_max", "direct_iops_w_max"): data[name] = ("-", "-", "-") else: data[name] = "-" elif isinstance(val, (int, float, long)): data[name] = round_3_digit(val) data["bw_read_max"] = (data["bw_read_max"][0] // 1024, data["bw_read_max"][1], data["bw_read_max"][2]) data["bw_write_max"] = (data["bw_write_max"][0] // 1024, data["bw_write_max"][1], data["bw_write_max"][2]) # templ_name = 'report_ceph_1.html' # import pprint # pprint.pprint(data) # pprint.pprint(info.__dict__) images.update(data) templ = get_template(templ_name) return templ.format(lab_info=lab_description, comment=comment, **images)
def render_all_html(comment, info, lab_description, images, templ_name): data = info.__dict__.copy() for name, val in data.items(): if not name.startswith('__'): if val is None: if name in ('direct_iops_w64_max', 'direct_iops_w_max'): data[name] = ('-', '-', '-') else: data[name] = '-' elif isinstance(val, (int, float, long)): data[name] = round_3_digit(val) data['bw_read_max'] = (data['bw_read_max'][0] // 1024, data['bw_read_max'][1], data['bw_read_max'][2]) data['bw_write_max'] = (data['bw_write_max'][0] // 1024, data['bw_write_max'][1], data['bw_write_max'][2]) # templ_name = 'report_ceph_1.html' # import pprint # pprint.pprint(data) # pprint.pprint(info.__dict__) images.update(data) templ = get_template(templ_name) return templ.format(lab_info=lab_description, comment=comment, **images)
def prepare_data(cls, results): """ create a table with io performance report for console """ def key_func(data): tpl = data.summary_tpl() return (data.name, tpl.oper, tpl.mode, ssize2b(tpl.bsize), int(tpl.th_count) * int(tpl.vm_count)) res = [] for item in sorted(results, key=key_func): test_dinfo = item.disk_perf_info() iops, _ = test_dinfo.iops.rounded_average_conf() bw, bw_conf = test_dinfo.bw.rounded_average_conf() _, bw_dev = test_dinfo.bw.rounded_average_dev() conf_perc = int(round(bw_conf * 100 / bw)) dev_perc = int(round(bw_dev * 100 / bw)) lat_50 = round_3_digit(int(test_dinfo.lat_50)) lat_95 = round_3_digit(int(test_dinfo.lat_95)) lat_avg = round_3_digit(int(test_dinfo.lat_avg)) testnodes_count = len(item.config.nodes) iops_per_vm = round_3_digit(iops / testnodes_count) bw_per_vm = round_3_digit(bw / testnodes_count) iops = round_3_digit(iops) bw = round_3_digit(bw) summ = "{0.oper}{0.mode} {0.bsize:>4} {0.th_count:>3}th {0.vm_count:>2}vm".format(item.summary_tpl()) res.append({"name": key_func(item)[0], "key": key_func(item)[:4], "summ": summ, "iops": int(iops), "bw": int(bw), "conf": str(conf_perc), "dev": str(dev_perc), "iops_per_vm": int(iops_per_vm), "bw_per_vm": int(bw_per_vm), "lat_50": lat_50, "lat_95": lat_95, "lat_avg": lat_avg}) return res
def render_all_html(comment, info, lab_description, images, templ_name): data = info.__dict__.copy() for name, val in data.items(): if not name.startswith('__'): if val is None: data[name] = '-' elif isinstance(val, (int, float, long)): data[name] = round_3_digit(val) data['bw_read_max'] = (data['bw_read_max'][0] // 1024, data['bw_read_max'][1]) data['bw_write_max'] = (data['bw_write_max'][0] // 1024, data['bw_write_max'][1]) images.update(data) return get_template(templ_name).format(lab_info=lab_description, comment=comment, **images)
def pp(x): med, conf = x.rounded_average_conf() conf_perc = int(float(conf) / med * 100) dev_perc = int(float(x.deviation) / med * 100) return (round_3_digit(med), conf_perc, dev_perc)
def get_disk_info(processed_results): di = DiskInfo() di.direct_iops_w_max = find_max_where(processed_results, 'd', '4k', 'randwrite') di.direct_iops_r_max = find_max_where(processed_results, 'd', '4k', 'randread') di.direct_iops_w64_max = find_max_where(processed_results, 'd', '64k', 'randwrite') for sz in ('16m', '64m'): di.bw_write_max = find_max_where(processed_results, 'd', sz, 'randwrite', False) if di.bw_write_max is not None: break if di.bw_write_max is None: for sz in ('1m', '2m', '4m', '8m'): di.bw_write_max = find_max_where(processed_results, 'd', sz, 'write', False) if di.bw_write_max is not None: break for sz in ('16m', '64m'): di.bw_read_max = find_max_where(processed_results, 'd', sz, 'randread', False) if di.bw_read_max is not None: break if di.bw_read_max is None: di.bw_read_max = find_max_where(processed_results, 'd', '1m', 'read', False) rws4k_iops_lat_th = [] for res in processed_results: if res.sync_mode in 'xs' and res.p.blocksize == '4k': if res.p.rw != 'randwrite': continue rws4k_iops_lat_th.append((res.iops.average, res.lat, # res.lat.average, res.concurence)) rws4k_iops_lat_th.sort(key=lambda (_1, _2, conc): conc) latv = [lat for _, lat, _ in rws4k_iops_lat_th] for tlat in [10, 30, 100]: pos = bisect.bisect_left(latv, tlat) if 0 == pos: setattr(di, 'rws4k_{}ms'.format(tlat), 0) elif pos == len(latv): iops3, _, _ = rws4k_iops_lat_th[-1] iops3 = int(round_3_digit(iops3)) setattr(di, 'rws4k_{}ms'.format(tlat), ">=" + str(iops3)) else: lat1 = latv[pos - 1] lat2 = latv[pos] iops1, _, th1 = rws4k_iops_lat_th[pos - 1] iops2, _, th2 = rws4k_iops_lat_th[pos] th_lat_coef = (th2 - th1) / (lat2 - lat1) th3 = th_lat_coef * (tlat - lat1) + th1 th_iops_coef = (iops2 - iops1) / (th2 - th1) iops3 = th_iops_coef * (th3 - th1) + iops1 iops3 = int(round_3_digit(iops3)) setattr(di, 'rws4k_{}ms'.format(tlat), iops3) hdi = DiskInfo() def pp(x): med, conf = x.rounded_average_conf() conf_perc = int(float(conf) / med * 100) dev_perc = int(float(x.deviation) / med * 100) return (round_3_digit(med), conf_perc, dev_perc) hdi.direct_iops_r_max = pp(di.direct_iops_r_max) if di.direct_iops_w_max is not None: hdi.direct_iops_w_max = pp(di.direct_iops_w_max) else: hdi.direct_iops_w_max = None if di.direct_iops_w64_max is not None: hdi.direct_iops_w64_max = pp(di.direct_iops_w64_max) else: hdi.direct_iops_w64_max = None hdi.bw_write_max = pp(di.bw_write_max) hdi.bw_read_max = pp(di.bw_read_max) hdi.rws4k_10ms = di.rws4k_10ms if 0 != di.rws4k_10ms else None hdi.rws4k_30ms = di.rws4k_30ms if 0 != di.rws4k_30ms else None hdi.rws4k_100ms = di.rws4k_100ms if 0 != di.rws4k_100ms else None return hdi
def prepare_data(cls, results): """ create a table with io performance report for console """ def key_func(data): tpl = data.summary_tpl() return (data.name, tpl.oper, tpl.mode, ssize2b(tpl.bsize), int(tpl.th_count) * int(tpl.vm_count)) res = [] for item in sorted(results, key=key_func): test_dinfo = item.disk_perf_info() testnodes_count = len(item.config.nodes) iops, _ = test_dinfo.iops.rounded_average_conf() if test_dinfo.iops_sys is not None: iops_sys, iops_sys_conf = test_dinfo.iops_sys.rounded_average_conf( ) _, iops_sys_dev = test_dinfo.iops_sys.rounded_average_dev() iops_sys_per_vm = round_3_digit(iops_sys / testnodes_count) iops_sys = round_3_digit(iops_sys) else: iops_sys = None iops_sys_per_vm = None iops_sys_dev = None iops_sys_conf = None bw, bw_conf = test_dinfo.bw.rounded_average_conf() _, bw_dev = test_dinfo.bw.rounded_average_dev() conf_perc = int(round(bw_conf * 100 / bw)) dev_perc = int(round(bw_dev * 100 / bw)) lat_50 = round_3_digit(int(test_dinfo.lat_50)) lat_95 = round_3_digit(int(test_dinfo.lat_95)) lat_avg = round_3_digit(int(test_dinfo.lat_avg)) iops_per_vm = round_3_digit(iops / testnodes_count) bw_per_vm = round_3_digit(bw / testnodes_count) iops = round_3_digit(iops) bw = round_3_digit(bw) summ = "{0.oper}{0.mode} {0.bsize:>4} {0.th_count:>3}th {0.vm_count:>2}vm".format( item.summary_tpl()) res.append({ "name": key_func(item)[0], "key": key_func(item)[:4], "summ": summ, "iops": int(iops), "bw": int(bw), "conf": str(conf_perc), "dev": str(dev_perc), "iops_per_vm": int(iops_per_vm), "bw_per_vm": int(bw_per_vm), "lat_50": lat_50, "lat_95": lat_95, "lat_avg": lat_avg, "iops_sys": iops_sys, "iops_sys_per_vm": iops_sys_per_vm, "sys_conf": iops_sys_conf, "sys_dev": iops_sys_dev }) return res
def get_disk_info(processed_results): di = DiskInfo() di.direct_iops_w_max = find_max_where(processed_results, 'd', '4k', 'randwrite') di.direct_iops_r_max = find_max_where(processed_results, 'd', '4k', 'randread') di.direct_iops_w64_max = find_max_where(processed_results, 'd', '64k', 'randwrite') for sz in ('16m', '64m'): di.bw_write_max = find_max_where(processed_results, 'd', sz, 'randwrite', False) if di.bw_write_max is not None: break if di.bw_write_max is None: for sz in ('1m', '2m', '4m', '8m'): di.bw_write_max = find_max_where(processed_results, 'd', sz, 'write', False) if di.bw_write_max is not None: break for sz in ('16m', '64m'): di.bw_read_max = find_max_where(processed_results, 'd', sz, 'randread', False) if di.bw_read_max is not None: break if di.bw_read_max is None: di.bw_read_max = find_max_where(processed_results, 'd', '1m', 'read', False) rws4k_iops_lat_th = [] for res in processed_results: if res.sync_mode in 'xs' and res.p.blocksize == '4k': if res.p.rw != 'randwrite': continue rws4k_iops_lat_th.append(( res.iops.average, res.lat, # res.lat.average, res.concurence)) rws4k_iops_lat_th.sort(key=lambda (_1, _2, conc): conc) latv = [lat for _, lat, _ in rws4k_iops_lat_th] for tlat in [10, 30, 100]: pos = bisect.bisect_left(latv, tlat) if 0 == pos: setattr(di, 'rws4k_{}ms'.format(tlat), 0) elif pos == len(latv): iops3, _, _ = rws4k_iops_lat_th[-1] iops3 = int(round_3_digit(iops3)) setattr(di, 'rws4k_{}ms'.format(tlat), ">=" + str(iops3)) else: lat1 = latv[pos - 1] lat2 = latv[pos] iops1, _, th1 = rws4k_iops_lat_th[pos - 1] iops2, _, th2 = rws4k_iops_lat_th[pos] th_lat_coef = (th2 - th1) / (lat2 - lat1) th3 = th_lat_coef * (tlat - lat1) + th1 th_iops_coef = (iops2 - iops1) / (th2 - th1) iops3 = th_iops_coef * (th3 - th1) + iops1 iops3 = int(round_3_digit(iops3)) setattr(di, 'rws4k_{}ms'.format(tlat), iops3) hdi = DiskInfo() def pp(x): med, conf = x.rounded_average_conf() conf_perc = int(float(conf) / med * 100) dev_perc = int(float(x.deviation) / med * 100) return (round_3_digit(med), conf_perc, dev_perc) hdi.direct_iops_r_max = pp(di.direct_iops_r_max) if di.direct_iops_w_max is not None: hdi.direct_iops_w_max = pp(di.direct_iops_w_max) else: hdi.direct_iops_w_max = None if di.direct_iops_w64_max is not None: hdi.direct_iops_w64_max = pp(di.direct_iops_w64_max) else: hdi.direct_iops_w64_max = None hdi.bw_write_max = pp(di.bw_write_max) hdi.bw_read_max = pp(di.bw_read_max) hdi.rws4k_10ms = di.rws4k_10ms if 0 != di.rws4k_10ms else None hdi.rws4k_30ms = di.rws4k_30ms if 0 != di.rws4k_30ms else None hdi.rws4k_100ms = di.rws4k_100ms if 0 != di.rws4k_100ms else None return hdi