| import re |
| import sys |
| |
| |
| splitter_rr = "(?ms)=====+\n" |
| |
| |
| def get_data_from_output(fname): |
| results = {} |
| fc = open(fname).read() |
| |
| for block in re.split(splitter_rr, fc): |
| block = block.strip() |
| if not block.startswith("[{u'__meta__':"): |
| continue |
| for val in eval(block): |
| meta = val['__meta__'] |
| meta['sync'] = 's' if meta['sync'] else 'a' |
| key = "{action} {sync} {blocksize}k".format(**meta) |
| results.setdefault(key, []).append(val['bw_mean']) |
| |
| processed_res = {} |
| |
| for k, v in results.items(): |
| v.sort() |
| med = float(sum(v)) / len(v) |
| ran = sum(abs(x - med) for x in v) / len(v) |
| processed_res[k] = (int(med), int(ran)) |
| |
| return processed_res |
| |
| |
| def ksort(x): |
| op, sync, sz = x.split(" ") |
| return (op, sync, int(sz[:-1])) |
| |
| |
| def show_data(path1, path2=None): |
| templ_1 = " {:>10} {:>5} {:>5} {:>6} ~ {:>5} {:>2}% {:>5}" |
| templ_2 = templ_1 + " {:>6} ~ {:>5} {:>2}% {:>5} ---- {:>6}% " |
| |
| ln_1 = templ_1.replace("<", "^").replace(">", "^") |
| ln_1 = ln_1.format("Oper", "Sync", "BSZ", "BW1", "DEV1", "%", "IOPS1") |
| |
| ln_2 = templ_2.replace("<", "^").replace(">", "^") |
| ln_2 = ln_2.format("Oper", "Sync", "BSZ", "BW1", "DEV1", "%", |
| "IOPS1", "BW2", "DEV2", "%", "IOPS2", "DIFF %") |
| |
| sep_1 = '-' * len(ln_1) |
| sep_2 = '-' * len(ln_2) |
| |
| res_1 = get_data_from_output(path1) |
| |
| if path2 is None: |
| res_2 = None |
| sep = sep_1 |
| ln = ln_1 |
| templ = templ_1 |
| else: |
| res_2 = get_data_from_output(path2) |
| sep = sep_2 |
| ln = ln_2 |
| templ = templ_2 |
| |
| print sep |
| print ln |
| print sep |
| |
| prev_tp = None |
| |
| common_keys = set(res_1.keys()) |
| |
| if res_2 is not None: |
| common_keys &= set(res_2.keys()) |
| |
| for k in sorted(common_keys, key=ksort): |
| tp = k.rsplit(" ", 1)[0] |
| op, s, sz = k.split(" ") |
| s = 'sync' if s == 's' else 'async' |
| |
| if tp != prev_tp and prev_tp is not None: |
| print sep |
| |
| prev_tp = tp |
| |
| m1, d1 = res_1[k] |
| iops1 = m1 / int(sz[:-1]) |
| perc1 = int(d1 * 100.0 / m1 + 0.5) |
| |
| if res_2 is not None: |
| m2, d2 = res_2[k] |
| iops2 = m2 / int(sz[:-1]) |
| perc2 = int(d2 * 100.0 / m2 + 0.5) |
| avg_diff = int(((m2 - m1) * 100.) / m2 + 0.5) |
| |
| if res_2 is not None: |
| print templ.format(op, s, sz, m1, d1, perc1, iops1, |
| m2, d2, perc2, iops2, avg_diff) |
| else: |
| print templ.format(op, s, sz, m1, d1, perc1, iops1) |
| |
| print sep |
| |
| |
| def main(argv): |
| path1 = argv[0] |
| path2 = argv[1] if len(argv) > 1 else None |
| show_data(path1, path2) |
| return 0 |
| |
| if __name__ == "__main__": |
| exit(main(sys.argv[1:])) |
| # print " ", results[k] |