From 04dd0282927199e655e3f1be193e2eb1d5a07ddd Mon Sep 17 00:00:00 2001 From: Michal Berger Date: Tue, 23 Aug 2022 21:08:01 +0200 Subject: [PATCH] perf/nvmf: Gather power statistics on the target side Use collect-bmc-pm to gather power usage stats during fio workloads. Signed-off-by: Michal Berger Change-Id: I20d1f3009c8a32c3927ad2cf2f932a8e97d3e7c5 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14164 Tested-by: SPDK CI Jenkins Reviewed-by: Karol Latecki Reviewed-by: Jim Harris Reviewed-by: Tomasz Zawadzki --- scripts/perf/nvmf/README.md | 5 ++++- scripts/perf/nvmf/run_nvmf.py | 13 +++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/scripts/perf/nvmf/README.md b/scripts/perf/nvmf/README.md index 8f6d695a3..9fef9b044 100644 --- a/scripts/perf/nvmf/README.md +++ b/scripts/perf/nvmf/README.md @@ -91,7 +91,8 @@ Optional: "scheduler_settings": "static", "zcopy_settings": false, "dif_insert_strip": true, - "null_block_dif_type": 3 + "null_block_dif_type": 3, + "enable_pm": true } ``` @@ -131,6 +132,8 @@ 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. Optional, Kernel Target only: diff --git a/scripts/perf/nvmf/run_nvmf.py b/scripts/perf/nvmf/run_nvmf.py index 51418ae25..52d2931fb 100755 --- a/scripts/perf/nvmf/run_nvmf.py +++ b/scripts/perf/nvmf/run_nvmf.py @@ -371,6 +371,7 @@ 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 if "null_block_devices" in target_config: self.null_block = target_config["null_block_devices"] @@ -389,6 +390,8 @@ 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"] self.script_dir = os.path.dirname(os.path.abspath(sys.argv[0])) self.spdk_dir = os.path.abspath(os.path.join(self.script_dir, "../../../")) @@ -650,6 +653,9 @@ class Target(Server): with open(os.path.join(results_dir, sar_cpu_util_file), "w") as f: 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"]) + def ethtool_after_fio_ramp(self, fio_ramp_time): time.sleep(fio_ramp_time//2) nic_names = [self.get_nic_name_by_ip(n) for n in self.nic_ips] @@ -1555,6 +1561,7 @@ if __name__ == "__main__": for block_size, io_depth, rw in fio_workloads: threads = [] configs = [] + power_daemon = None for i in initiators: if i.mode == "kernel": i.kernel_init_connect() @@ -1596,6 +1603,9 @@ if __name__ == "__main__": ethtool_thread = threading.Thread(target=target_obj.ethtool_after_fio_ramp, args=(fio_ramp_time,)) 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) + for t in threads: t.start() for t in threads: @@ -1606,6 +1616,9 @@ if __name__ == "__main__": i.kernel_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()