blob: 1528089ba50a7c64c8d7b090863f700dbcf19ae9 [file] [log] [blame]
kdanylov aka koder3a9e5db2017-05-09 20:00:44 +03001import logging
2
3
kdanylov aka koder150b2192017-04-01 16:53:01 +03004import numpy
5
6from cephlib.common import float2str
kdanylov aka koderb0833332017-05-13 20:39:17 +03007from cephlib import texttable
8from cephlib.statistic import calc_norm_stat_props, calc_histo_stat_props
kdanylov aka koder150b2192017-04-01 16:53:01 +03009
kdanylov aka koderb0833332017-05-13 20:39:17 +030010from .result_classes import IResultStorage
kdanylov aka koder150b2192017-04-01 16:53:01 +030011from .stage import Stage, StepOrder
12from .test_run_class import TestRun
13from .suits.io.fio import FioTest
kdanylov aka koder150b2192017-04-01 16:53:01 +030014from .suits.io.fio_hist import get_lat_vals
kdanylov aka koder3a9e5db2017-05-09 20:00:44 +030015from .data_selectors import get_aggregated
16
17
18logger = logging.getLogger("wally")
19
kdanylov aka koder150b2192017-04-01 16:53:01 +030020
21class ConsoleReportStage(Stage):
22
23 priority = StepOrder.REPORT
24
25 def run(self, ctx: TestRun) -> None:
kdanylov aka koderb0833332017-05-13 20:39:17 +030026 for suite in ctx.rstorage.iter_suite(FioTest.name):
kdanylov aka koder150b2192017-04-01 16:53:01 +030027 table = texttable.Texttable(max_width=200)
28
kdanylov aka koderb0833332017-05-13 20:39:17 +030029 tbl = ctx.rstorage.get_txt_report(suite)
kdanylov aka koder3a9e5db2017-05-09 20:00:44 +030030 if tbl is None:
31 table.header(["Description", "IOPS ~ Dev", "BW, MiBps", 'Skew/Kurt', 'lat med, ms', 'lat 95, ms'])
32 table.set_cols_align(('l', 'r', 'r', 'r', 'r', 'r'))
kdanylov aka koder150b2192017-04-01 16:53:01 +030033
kdanylov aka koderb0833332017-05-13 20:39:17 +030034 for job in sorted(ctx.rstorage.iter_job(suite), key=lambda job: job.params):
35 bw_ts = get_aggregated(ctx.rstorage, suite.storage_id, job.storage_id, metric='bw',
36 trange=job.reliable_info_range_s)
kdanylov aka koder3a9e5db2017-05-09 20:00:44 +030037 props = calc_norm_stat_props(bw_ts)
38 avg_iops = props.average // job.params.params['bsize']
39 iops_dev = props.deviation // job.params.params['bsize']
kdanylov aka koder150b2192017-04-01 16:53:01 +030040
kdanylov aka koderb0833332017-05-13 20:39:17 +030041 lat_ts = get_aggregated(ctx.rstorage, suite.storage_id, job.storage_id, metric='lat',
42 trange=job.reliable_info_range_s)
kdanylov aka koder3a9e5db2017-05-09 20:00:44 +030043 bins_edges = numpy.array(get_lat_vals(lat_ts.data.shape[1]), dtype='float32') / 1000 # convert us to ms
44 lat_props = calc_histo_stat_props(lat_ts, bins_edges)
45 table.add_row([job.params.summary,
46 "{} ~ {}".format(float2str(avg_iops), float2str(iops_dev)),
47 float2str(props.average / 1024), # Ki -> Mi
48 "{}/{}".format(float2str(props.skew), float2str(props.kurt)),
49 float2str(lat_props.perc_50), float2str(lat_props.perc_95)])
kdanylov aka koder150b2192017-04-01 16:53:01 +030050
kdanylov aka koder3a9e5db2017-05-09 20:00:44 +030051 tbl = table.draw()
kdanylov aka koderb0833332017-05-13 20:39:17 +030052 ctx.rstorage.put_txt_report(suite, tbl)
kdanylov aka koder3a9e5db2017-05-09 20:00:44 +030053 print(tbl)