blob: 55696167551c1abc77cfc212d7ad0fb1a743e813 [file] [log] [blame]
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]