| import texttable |
| |
| from wally.utils import ssize_to_b |
| from wally.suits.io.agent import get_test_summary |
| from wally.statistic import med_dev, round_deviation, round_3_digit |
| |
| |
| def key_func(k_data): |
| _, data = k_data |
| |
| return (data['rw'], |
| data['sync_mode'], |
| ssize_to_b(data['blocksize']), |
| data['concurence']) |
| |
| |
| def format_results_for_console(test_set): |
| """ |
| create a table with io performance report |
| for console |
| """ |
| tab = texttable.Texttable() |
| tab.set_deco(tab.HEADER | tab.VLINES | tab.BORDER) |
| tab.set_cols_align(["l", "r", "r", "r", "r"]) |
| |
| prev_k = None |
| items = sorted(test_set['res'].items(), key=key_func) |
| |
| for test_name, data in items: |
| curr_k = key_func((test_name, data))[:3] |
| |
| if prev_k is not None: |
| if prev_k != curr_k: |
| tab.add_row(["---"] * 5) |
| |
| prev_k = curr_k |
| |
| descr = get_test_summary(data) |
| |
| iops, _ = round_deviation(med_dev(data['iops'])) |
| bw, bwdev = round_deviation(med_dev(data['bw'])) |
| |
| # 3 * sigma |
| if 0 == bw: |
| assert 0 == bwdev |
| dev_perc = 0 |
| else: |
| dev_perc = int((bwdev * 300) / bw) |
| |
| med_lat, _ = round_deviation(med_dev(data['lat'])) |
| med_lat = int(med_lat) // 1000 |
| |
| iops = round_3_digit(iops) |
| bw = round_3_digit(bw) |
| med_lat = round_3_digit(med_lat) |
| |
| params = (descr, int(iops), int(bw), dev_perc, med_lat) |
| tab.add_row(params) |
| |
| header = ["Description", "IOPS", "BW KiBps", "Dev * 3 %", "clat ms"] |
| tab.header(header) |
| |
| return tab.draw() |