def run_fio(vms, fio_cfg_fname, out_path, perf_vmex=False, json=False):
- global fio_bin
- job_name = os.path.splitext(os.path.basename(fio_cfg_fname))[0]
-
- # Build command for FIO
- fio_cmd = " ".join([fio_bin, "--eta=never"])
- if json:
- fio_cmd = " ".join([fio_bin, "--output-format=json"])
- for vm in vms:
- # vm[0] = IP address, vm[1] = Port number
- fio_cmd = " ".join([fio_cmd,
- "--client={vm_ip},{vm_port}".format(vm_ip=vm[0], vm_port=vm[1]),
- "--remote-config {cfg}".format(cfg=fio_cfg_fname)])
- print(fio_cmd)
-
- if perf_vmex:
- perf_dir = os.path.join(out_path, "perf_stats")
- try:
- os.mkdir(perf_dir)
- except OSError:
- pass
-
- # Start gathering perf statistics for host and VM guests
- perf_rec_file = os.path.join(perf_dir, "perf.data.kvm")
- perf_run_cmd = "perf kvm --host --guest " + \
- "-o {0} stat record -a".format(perf_rec_file)
- print(perf_run_cmd)
- perf_p = exec_cmd(perf_run_cmd, blocking=False)
-
- # Run FIO test on VMs
- rc, out = exec_cmd(fio_cmd, blocking=True)
-
- # if for some reason output contains lines with "eta" - remove them
- out = re.sub(r'.+\[eta\s+\d{2}m:\d{2}s\]', '', out)
-
- print(out)
-
- if rc != 0:
- print("ERROR! While executing FIO jobs - RC: {rc}".format(rc=rc, out=out))
- sys.exit(rc)
- else:
- save_file(os.path.join(out_path, ".".join([job_name, "log"])), "w", out)
-
- if perf_vmex:
- # Stop gathering perf statistics and prepare some result files
- perf_p.send_signal(signal.SIGINT)
- perf_p.wait()
-
- perf_stat_cmd = "perf kvm --host -i {perf_rec} stat report --event vmexit"\
- .format(perf_rec=perf_rec_file)
-
- rc, out = exec_cmd(" ".join([perf_stat_cmd, "--event vmexit"]),
- blocking=True)
- print("VMexit host stats:")
- print("{perf_out}".format(perf_out=out))
- save_file(os.path.join(perf_dir, "vmexit_stats_" + job_name),
- "w", "{perf_out}".format(perf_out=out))
- try:
- os.remove(perf_rec_file)
- except OSError:
- pass
+ global fio_bin
+ job_name = os.path.splitext(os.path.basename(fio_cfg_fname))[0]
+
+ # Build command for FIO
+ fio_cmd = " ".join([fio_bin, "--eta=never"])
+ if json:
+ fio_cmd = " ".join([fio_bin, "--output-format=json"])
+ for vm in vms:
+ # vm[0] = IP address, vm[1] = Port number
+ fio_cmd = " ".join([fio_cmd,
+ "--client={vm_ip},{vm_port}".format(vm_ip=vm[0], vm_port=vm[1]),
+ "--remote-config {cfg}".format(cfg=fio_cfg_fname)])
+ print(fio_cmd)
+
+ if perf_vmex:
+ perf_dir = os.path.join(out_path, "perf_stats")
+ try:
+ os.mkdir(perf_dir)
+ except OSError:
+ pass
+
+ # Start gathering perf statistics for host and VM guests
+ perf_rec_file = os.path.join(perf_dir, "perf.data.kvm")
+ perf_run_cmd = "perf kvm --host --guest " + \
+ "-o {0} stat record -a".format(perf_rec_file)
+ print(perf_run_cmd)
+ perf_p = exec_cmd(perf_run_cmd, blocking=False)
+
+ # Run FIO test on VMs
+ rc, out = exec_cmd(fio_cmd, blocking=True)
+
+ # if for some reason output contains lines with "eta" - remove them
+ out = re.sub(r'.+\[eta\s+\d{2}m:\d{2}s\]', '', out)
+
+ print(out)
+
+ if rc != 0:
+ print("ERROR! While executing FIO jobs - RC: {rc}".format(rc=rc, out=out))
+ sys.exit(rc)
+ else:
+ save_file(os.path.join(out_path, ".".join([job_name, "log"])), "w", out)
+
+ if perf_vmex:
+ # Stop gathering perf statistics and prepare some result files
+ perf_p.send_signal(signal.SIGINT)
+ perf_p.wait()
+
+ perf_stat_cmd = "perf kvm --host -i {perf_rec} stat report --event vmexit"\
+ .format(perf_rec=perf_rec_file)
+
+ rc, out = exec_cmd(" ".join([perf_stat_cmd, "--event vmexit"]),
+ blocking=True)
+ print("VMexit host stats:")
+ print("{perf_out}".format(perf_out=out))
+ save_file(os.path.join(perf_dir, "vmexit_stats_" + job_name),
+ "w", "{perf_out}".format(perf_out=out))
+ try:
+ os.remove(perf_rec_file)
+ except OSError:
+ pass
def main():