fixes
diff --git a/report_templates/report_cinder_iscsi.html b/report_templates/report_cinder_iscsi.html
index 364ea52..7bd1f5b 100644
--- a/report_templates/report_cinder_iscsi.html
+++ b/report_templates/report_cinder_iscsi.html
@@ -27,8 +27,8 @@
<td><div align="right">{direct_iops_r_max[0]} ~ {direct_iops_r_max[1]}%</div></td>
</tr>
<tr>
- <td>Write 64KiB</td>
- <td><div align="right">{direct_iops_w64_max[0]} ~ {direct_iops_w64_max[1]}%</div></td>
+ <td>Write 4KiB</td>
+ <td><div align="right">{direct_iops_w_max[0]} ~ {direct_iops_w_max[1]}%</div></td>
</tr>
</table>
</td><td> </td><td>
diff --git a/wally/discover/discover.py b/wally/discover/discover.py
index 2f41562..957ecbe 100644
--- a/wally/discover/discover.py
+++ b/wally/discover/discover.py
@@ -89,7 +89,7 @@
with open(fuel_openrc_fname, "w") as fd:
fd.write(openrc_templ.format(**ctx.fuel_openstack_creds))
msg = "Openrc for cluster {0} saves into {1}"
- logger.debug(msg.format(env_name, fuel_openrc_fname))
+ logger.info(msg.format(env_name, fuel_openrc_fname))
nodes_to_run.extend(nodes)
elif cluster == "ceph":
diff --git a/wally/report.py b/wally/report.py
index cb871b3..39950a4 100644
--- a/wally/report.py
+++ b/wally/report.py
@@ -505,8 +505,11 @@
break
if di.bw_write_max is None:
- di.bw_write_max = find_max_where(processed_results,
- 'd', '1m', 'write', False)
+ 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,
@@ -532,14 +535,13 @@
latv = [lat for _, lat, _ in rws4k_iops_lat_th]
- for tlatv_ms in [10, 30, 100]:
- tlat = tlatv_ms * 1000
+ for tlat in [10, 30, 100]:
pos = bisect.bisect_left(latv, tlat)
if 0 == pos:
- setattr(di, 'rws4k_{}ms'.format(tlatv_ms), 0)
+ setattr(di, 'rws4k_{}ms'.format(tlat), 0)
elif pos == len(latv):
iops3, _, _ = rws4k_iops_lat_th[-1]
- setattr(di, 'rws4k_{}ms'.format(tlatv_ms), ">=" + str(iops3))
+ setattr(di, 'rws4k_{}ms'.format(tlat), ">=" + str(iops3))
else:
lat1 = latv[pos - 1]
lat2 = latv[pos]
@@ -552,14 +554,14 @@
th_iops_coef = (iops2 - iops1) / (th2 - th1)
iops3 = th_iops_coef * (th3 - th1) + iops1
- setattr(di, 'rws4k_{}ms'.format(tlatv_ms), int(iops3))
+ setattr(di, 'rws4k_{}ms'.format(tlat), int(iops3))
hdi = DiskInfo()
def pp(x):
med, conf = x.rounded_average_conf()
conf_perc = int(float(conf) / med * 100)
- return (med, conf_perc)
+ return (round_3_digit(med), conf_perc)
hdi.direct_iops_r_max = pp(di.direct_iops_r_max)
@@ -610,6 +612,7 @@
]
images = make_plots(perf_infos, plots)
di = get_disk_info(perf_infos)
+
return render_all_html(comment, di, lab_info, images, "report_cinder_iscsi.html")
diff --git a/wally/run_test.py b/wally/run_test.py
index 0e8f6e9..4484d45 100755
--- a/wally/run_test.py
+++ b/wally/run_test.py
@@ -438,7 +438,11 @@
for group in cfg['tests']:
- assert len(group.items()) == 1
+ if len(group.items()) != 1:
+ msg = "Items in tests section should have len == 1"
+ logger.error(msg)
+ raise utils.StopTestError(msg)
+
key, config = group.items()[0]
if 'start_test_nodes' == key:
@@ -619,6 +623,9 @@
descr = "Disk io performance test suite"
parser = argparse.ArgumentParser(prog='wally', description=descr)
+ # subparsers = parser.add_subparsers()
+ # test_parser = subparsers.add_parser('test', help='run tests')
+
parser.add_argument("-l", dest='extra_logs',
action='store_true', default=False,
help="print some extra log info")
@@ -730,8 +737,8 @@
opts = parse_args(argv)
- # x = load_data_from_path("/var/wally_results/silky_virgen")
- # y = load_data_from_path("/var/wally_results/cibarial_jacob")
+ # x = load_data_from_path("/var/wally_results/uncorroborant_dinah")
+ # y = load_data_from_path("/var/wally_results/nonmelting_jamal")
# print(IOPerfTest.format_diff_for_console([x['io'], y['io']]))
# exit(1)
@@ -746,7 +753,8 @@
save_run_params()
if cfg_dict.get('logging', {}).get("extra_logs", False) or opts.extra_logs:
- level = logging.DEBUG
+ # level = logging.DEBUG
+ level = logging.INFO
else:
level = logging.WARNING
diff --git a/wally/suits/io/ceph.cfg b/wally/suits/io/ceph.cfg
index 330b1bd..48c1ec6 100644
--- a/wally/suits/io/ceph.cfg
+++ b/wally/suits/io/ceph.cfg
@@ -1,11 +1,11 @@
[global]
include defaults.cfg
-NUMJOBS_R={% 1, 5, 10, 15, 25, 40 %}
-NUMJOBS_W={% 1, 3, 5, 7, 10%}
-NUMJOBS_SEQ_OPS={% 1, 2, 3, 10 %}
+NUMJOBS_R={% 1, 5, 10, 15, 25, 40, 80 %}
+NUMJOBS_W={% 1, 5, 10, 15, 25 %}
+NUMJOBS_SEQ_OPS={% 1, 3, 10 %}
-ramp_time=15
+ramp_time=60
runtime=240
# ---------------------------------------------------------------------
diff --git a/wally/suits/io/cinder_iscsi.cfg b/wally/suits/io/cinder_iscsi.cfg
index fd67090..01439b3 100644
--- a/wally/suits/io/cinder_iscsi.cfg
+++ b/wally/suits/io/cinder_iscsi.cfg
@@ -1,11 +1,9 @@
[global]
include defaults.cfg
-
-NUMJOBS={% 1, 5, 10, 15, 25, 40 %}
-
-ramp_time=15
-runtime=240
+ramp_time=30
+runtime=120
direct=1
+NUMJOBS={% 1, 5, 10, 15, 25, 40 %}
# ---------------------------------------------------------------------
# check different thread count, sync mode. (latency, iops) = func(th_count)
@@ -26,25 +24,26 @@
numjobs={NUMJOBS}
# ---------------------------------------------------------------------
-# check IOPS randwrite.
+# Read always sync, with large request latency linear write
+# ......
# ---------------------------------------------------------------------
[cinder_iscsi_{TEST_SUMM}]
-blocksize=4k
-rw=randwrite
+blocksize=64m
+rw=randread
# ---------------------------------------------------------------------
# No reason for th count > 1 in case of sequantial operations
# ot they became random
# ---------------------------------------------------------------------
[cinder_iscsi_{TEST_SUMM}]
-blocksize=16m
-rw={% randread,randwrite %}
-numjobs={% 1, 2, 3, 10 %}
+blocksize=8m
+rw=write
-# [cinder_iscsi_{TEST_SUMM}]
-# blocksize=1m
-# rw={% read,write %}
-# offset={UNIQ_OFFSET}
-# ramp_time=90
-# runtime=30
-#
+# ---------------------------------------------------------------------
+# check IOPS randwrite. This test MUST BE THE LAST ONE
+# 240 seconds needs to clean caches
+# ---------------------------------------------------------------------
+[cinder_iscsi_{TEST_SUMM}]
+ramp_time=240
+blocksize=4k
+rw=randwrite
diff --git a/wally/suits/io/fio.py b/wally/suits/io/fio.py
index a57faff..f9f1d1b 100644
--- a/wally/suits/io/fio.py
+++ b/wally/suits/io/fio.py
@@ -146,6 +146,7 @@
self.lat = None
self.lat_50 = None
self.lat_95 = None
+ self.lat_avg = None
self.raw_bw = []
self.raw_iops = []
@@ -202,7 +203,7 @@
"""
def __init__(self, config, fio_task, ts_results, raw_result, run_interval):
- self.name = fio_task.name.split("_")[0]
+ self.name = fio_task.name.rsplit("_", 1)[0]
self.fio_task = fio_task
self.bw = ts_results.get('bw')
@@ -310,10 +311,11 @@
res.append(sum(dt[idx] for dt in arr))
return res
- # pinfo.raw_lat = map(prepare, self.lat.per_vm())
- # num_th = sum(map(len, pinfo.raw_lat))
- # avg_lat = [val / num_th for val in agg_data(pinfo.raw_lat)]
- # pinfo.lat = data_property(avg_lat)
+ pinfo.raw_lat = map(prepare, self.lat.per_vm())
+ num_th = sum(map(len, pinfo.raw_lat))
+ lat_avg = [val / num_th for val in agg_data(pinfo.raw_lat)]
+ pinfo.lat_avg = data_property(lat_avg).average / 1000 # us to ms
+
pinfo.lat_50, pinfo.lat_95 = self.get_lat_perc_50_95_multy()
pinfo.lat = pinfo.lat_50
@@ -353,8 +355,10 @@
bw_per_th = sum(sum(pinfo.raw_bw, []), [])
if average(bw_per_th) > 10:
pinfo.bw = bw_log
- else:
pinfo.bw2 = bw_report
+ else:
+ pinfo.bw = bw_report
+ pinfo.bw2 = bw_log
self._pinfo = pinfo
@@ -421,10 +425,13 @@
# size is megabytes
def check_prefill_required(self, rossh, fname, size, num_blocks=16):
- with rossh.connection.open_sftp() as sftp:
- fstats = sftp.stat(fname)
+ try:
+ with rossh.connection.open_sftp() as sftp:
+ fstats = sftp.stat(fname)
- if stat.S_ISREG(fstats) and fstats.st_size < size * 1024 ** 2:
+ if stat.S_ISREG(fstats.st_mode) and fstats.st_size < size * 1024 ** 2:
+ return True
+ except EnvironmentError:
return True
cmd = 'python -c "' + \
@@ -624,8 +631,6 @@
lat_bw_limit_reached = set()
with ThreadPoolExecutor(len(self.config.nodes)) as pool:
- self.fio_configs.sort(key=lambda x: int(x.vals.get('numjobs', 1)))
-
for pos, fio_cfg in enumerate(self.fio_configs):
test_descr = get_test_summary(fio_cfg.vals).split("th")[0]
if test_descr in lat_bw_limit_reached:
@@ -859,10 +864,10 @@
def key_func(data):
tpl = data.summary_tpl()
- return (data.name.rsplit("_", 1)[0],
+ return (data.name,
tpl.oper,
tpl.mode,
- tpl.bsize,
+ ssize2b(tpl.bsize),
int(tpl.th_count) * int(tpl.vm_count))
res = []
@@ -878,6 +883,7 @@
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)
@@ -898,7 +904,8 @@
"iops_per_vm": int(iops_per_vm),
"bw_per_vm": int(bw_per_vm),
"lat_50": lat_50,
- "lat_95": lat_95})
+ "lat_95": lat_95,
+ "lat_avg": lat_avg})
return res
@@ -913,7 +920,8 @@
Field("iops\n/vm", "iops_per_vm", "r", 3),
Field("KiBps\n/vm", "bw_per_vm", "r", 6),
Field("lat ms\nmedian", "lat_50", "r", 3),
- Field("lat ms\n95%", "lat_95", "r", 3)
+ Field("lat ms\n95%", "lat_95", "r", 3),
+ Field("lat\navg", "lat_avg", "r", 3),
]
fiels_and_header_dct = dict((item.attr, item) for item in fiels_and_header)
diff --git a/wally/suits/io/fio_task_parser.py b/wally/suits/io/fio_task_parser.py
index 9d19f3a..0f788ed 100644
--- a/wally/suits/io/fio_task_parser.py
+++ b/wally/suits/io/fio_task_parser.py
@@ -232,9 +232,25 @@
if len(cycles) == 0:
yield sec
else:
- for combination in itertools.product(*cycles.values()):
+ # thread should changes faster
+ numjobs = cycles.pop('numjobs', None)
+ items = cycles.items()
+
+ if len(items) > 0:
+ keys, vals = zip(*items)
+ keys = list(keys)
+ vals = list(vals)
+ else:
+ keys = []
+ vals = []
+
+ if numjobs is not None:
+ vals.append(numjobs)
+ keys.append('numjobs')
+
+ for combination in itertools.product(*vals):
new_sec = sec.copy()
- new_sec.vals.update(zip(cycles.keys(), combination))
+ new_sec.vals.update(zip(keys, combination))
yield new_sec
@@ -354,7 +370,11 @@
if th_count is None:
th_count = vals.get('concurence', 1)
- return TestSumm(rw, sync_mode, vals['blocksize'], th_count, vm_count)
+ return TestSumm(rw,
+ sync_mode,
+ vals['blocksize'],
+ th_count,
+ vm_count)
def get_test_summary(sec, vm_count=None):
diff --git a/wally/suits/io/hdd.cfg b/wally/suits/io/hdd.cfg
index ede6de2..b3c6293 100644
--- a/wally/suits/io/hdd.cfg
+++ b/wally/suits/io/hdd.cfg
@@ -3,10 +3,10 @@
# NUMJOBS={% 1, 5, 10, 15, 20, 30, 40, 80 %}
-NUMJOBS={% 1, 3, 5, 10, 20, 40 %}
+NUMJOBS={% 1, 5, 10, 15, 25, 40 %}
-ramp_time=5
-runtime=90
+ramp_time=30
+runtime=120
direct=1
# ---------------------------------------------------------------------
@@ -28,16 +28,17 @@
numjobs={NUMJOBS}
# ---------------------------------------------------------------------
-# check IOPS randwrite.
-# ---------------------------------------------------------------------
-[hdd_{TEST_SUMM}]
-blocksize=4k
-rw=randwrite
-
-# ---------------------------------------------------------------------
# No reason for th count > 1 in case of sequantial operations
# ot they became random
# ---------------------------------------------------------------------
[hdd_{TEST_SUMM}]
blocksize=1m
rw={% read, write %}
+
+# ---------------------------------------------------------------------
+# check IOPS randwrite.
+# ---------------------------------------------------------------------
+[hdd_{TEST_SUMM}]
+ramp_time=240
+blocksize=4k
+rw=randwrite
diff --git a/wally/suits/io/rrd.cfg b/wally/suits/io/rrd.cfg
index 3383dce..86a73c5 100644
--- a/wally/suits/io/rrd.cfg
+++ b/wally/suits/io/rrd.cfg
@@ -1,14 +1,34 @@
[global]
include defaults.cfg
+ramp_time=30
+runtime=120
+numjobs={% 1,10 %}
+direct=1
+rw={% randwrite, randread %}
# ---------------------------------------------------------------------
-[rws_{TEST_SUMM}]
-blocksize=4k
-rw=randwrite
-sync=1
-ramp_time=15
-runtime=120
-numjobs={% 50,150 %}
+#[test_{TEST_SUMM}]
+#blocksize=1m
+
+# ---------------------------------------------------------------------
+#[test_{TEST_SUMM}]
+#blocksize=4m
+
+# ---------------------------------------------------------------------
+#[test_{TEST_SUMM}]
+#blocksize=16m
+
+# ---------------------------------------------------------------------
+[test_{TEST_SUMM}]
+blocksize=64m
+rw=randread
+numjobs=1
+
+# ---------------------------------------------------------------------
+[test_{TEST_SUMM}]
+blocksize=4m
+rw=write
+numjobs=1
# ---------------------------------------------------------------------
# [rws_{TEST_SUMM}]