diff --git a/scripts/perf/nvmf/README.md b/scripts/perf/nvmf/README.md index fda481662..9f7ab3aea 100644 --- a/scripts/perf/nvmf/README.md +++ b/scripts/perf/nvmf/README.md @@ -92,7 +92,7 @@ Optional: "zcopy_settings": false, "dif_insert_strip": true, "null_block_dif_type": 3, - "enable_pm": true + "pm_settings": [true, 30, 1, 60] } ``` @@ -132,8 +132,9 @@ Optional, common: - irq_scripts_dir - path to scripts directory of Mellanox mlnx-tools package; Used to run set_irq_affinity.sh script. Default: /usr/src/local/mlnx-tools/ofed_scripts -- enable_pm - if set to true, power measurement is enabled via collect-bmc-pm - on the target side. +- enable_pm - [bool, int(x), int(y), int(z)]; + if bool is set to true, power measurement is enabled via collect-bmc-pm on + the target side. For the meaning of remaining options see sar_settings. Optional, Kernel Target only: diff --git a/scripts/perf/nvmf/run_nvmf.py b/scripts/perf/nvmf/run_nvmf.py index 3b8d77788..2a6007a94 100755 --- a/scripts/perf/nvmf/run_nvmf.py +++ b/scripts/perf/nvmf/run_nvmf.py @@ -388,7 +388,10 @@ class Target(Server): self._nics_json_obj = json.loads(self.exec_cmd(["ip", "-j", "address", "show"])) self.subsystem_info_list = [] self.initiator_info = [] - self.enable_pm = True + self.enable_pm = False + self.pm_delay = 0 + self.pm_interval = 0 + self.pm_count = 1 if "null_block_devices" in target_config: self.null_block = target_config["null_block_devices"] @@ -407,8 +410,10 @@ class Target(Server): self.enable_zcopy = target_config["zcopy_settings"] if "results_dir" in target_config: self.results_dir = target_config["results_dir"] - if "enable_pm" in target_config: - self.enable_pm = target_config["enable_pm"] + if "pm_settings" in target_config: + self.enable_pm, self.pm_delay, self.pm_interval, self.pm_count = target_config["pm_settings"] + # Normalize pm_count - <= 0 means to loop indefinitely so let's avoid that to not block forever + self.pm_count = self.pm_count if self.pm_count > 0 else 1 self.script_dir = os.path.dirname(os.path.abspath(sys.argv[0])) self.spdk_dir = os.path.abspath(os.path.join(self.script_dir, "../../../")) @@ -502,7 +507,11 @@ class Target(Server): f.write("%0.2f" % sar_cpu_usage) def measure_power(self, results_dir, prefix, script_full_dir): - return subprocess.Popen(["%s/../pm/collect-bmc-pm" % script_full_dir, "-d", results_dir, "-l", "-p", prefix, "-x"]) + time.sleep(self.pm_delay) + self.log_print("Starting power measurements") + self.exec_cmd(["%s/../pm/collect-bmc-pm" % script_full_dir, + "-d", "%s" % results_dir, "-l", "-p", "%s" % prefix, + "-x", "-c", "%s" % self.pm_count, "-t", "%s" % self.pm_interval]) def ethtool_after_fio_ramp(self, fio_ramp_time): time.sleep(fio_ramp_time//2) @@ -1532,7 +1541,9 @@ if __name__ == "__main__": threads.append(ethtool_thread) if target_obj.enable_pm: - power_daemon = target_obj.measure_power(args.results, "%s_%s_%s" % (block_size, rw, io_depth), script_full_dir) + power_daemon = threading.Thread(target=target_obj.measure_power, + args=(args.results, "%s_%s_%s" % (block_size, rw, io_depth), script_full_dir)) + threads.append(power_daemon) for t in threads: t.start() @@ -1543,9 +1554,6 @@ if __name__ == "__main__": i.init_disconnect() i.copy_result_files(args.results) - if power_daemon: - power_daemon.terminate() - target_obj.restore_governor() target_obj.restore_tuned() target_obj.restore_services()