scripts/nvmf_perf: stop checking self.mode in parent class
Make sure all attributes are initialized in both classes. If something is not supported or works a bit differently - move it to children's class method. Signed-off-by: Karol Latecki <karol.latecki@intel.com> Change-Id: I963ef1e9fe4288992a15f65671c1b85e8e7f7fd6 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14882 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com> Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com> Reviewed-by: Michal Berger <michal.berger@intel.com>
This commit is contained in:
parent
1e629c3219
commit
de7c369173
@ -128,14 +128,8 @@ class Server:
|
|||||||
self.exec_cmd(["sudo", "modprobe", "-a",
|
self.exec_cmd(["sudo", "modprobe", "-a",
|
||||||
"nvme-%s" % self.transport,
|
"nvme-%s" % self.transport,
|
||||||
"nvmet-%s" % self.transport])
|
"nvmet-%s" % self.transport])
|
||||||
if self.mode == "kernel" and hasattr(self, "null_block") and self.null_block:
|
|
||||||
self.exec_cmd(["sudo", "modprobe", "null_blk",
|
|
||||||
"nr_devices=%s" % self.null_block])
|
|
||||||
|
|
||||||
def configure_adq(self):
|
def configure_adq(self):
|
||||||
if self.mode == "kernel":
|
|
||||||
self.log.warning("WARNING: ADQ setup not yet supported for Kernel mode. Skipping configuration.")
|
|
||||||
return
|
|
||||||
self.adq_load_modules()
|
self.adq_load_modules()
|
||||||
self.adq_configure_nic()
|
self.adq_configure_nic()
|
||||||
|
|
||||||
@ -153,10 +147,6 @@ class Server:
|
|||||||
def adq_configure_tc(self):
|
def adq_configure_tc(self):
|
||||||
self.log.info("Configuring ADQ Traffic classes and filters...")
|
self.log.info("Configuring ADQ Traffic classes and filters...")
|
||||||
|
|
||||||
if self.mode == "kernel":
|
|
||||||
self.log.warning("WARNING: ADQ setup not yet supported for Kernel mode. Skipping configuration.")
|
|
||||||
return
|
|
||||||
|
|
||||||
num_queues_tc0 = 2 # 2 is minimum number of queues for TC0
|
num_queues_tc0 = 2 # 2 is minimum number of queues for TC0
|
||||||
num_queues_tc1 = self.num_cores
|
num_queues_tc1 = self.num_cores
|
||||||
port_param = "dst_port" if isinstance(self, Target) else "src_port"
|
port_param = "dst_port" if isinstance(self, Target) else "src_port"
|
||||||
@ -266,13 +256,9 @@ class Server:
|
|||||||
def configure_sysctl(self):
|
def configure_sysctl(self):
|
||||||
self.log.info("Tuning sysctl settings...")
|
self.log.info("Tuning sysctl settings...")
|
||||||
|
|
||||||
busy_read = 0
|
|
||||||
if self.enable_adq and self.mode == "spdk":
|
|
||||||
busy_read = 1
|
|
||||||
|
|
||||||
sysctl_opts = {
|
sysctl_opts = {
|
||||||
"net.core.busy_poll": 0,
|
"net.core.busy_poll": 0,
|
||||||
"net.core.busy_read": busy_read,
|
"net.core.busy_read": 0,
|
||||||
"net.core.somaxconn": 4096,
|
"net.core.somaxconn": 4096,
|
||||||
"net.core.netdev_max_backlog": 8192,
|
"net.core.netdev_max_backlog": 8192,
|
||||||
"net.ipv4.tcp_max_syn_backlog": 16384,
|
"net.ipv4.tcp_max_syn_backlog": 16384,
|
||||||
@ -285,6 +271,9 @@ class Server:
|
|||||||
"vm.overcommit_memory": 1,
|
"vm.overcommit_memory": 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if self.enable_adq:
|
||||||
|
sysctl_opts.update(self.adq_set_busy_read(1))
|
||||||
|
|
||||||
for opt, value in sysctl_opts.items():
|
for opt, value in sysctl_opts.items():
|
||||||
self.sysctl_restore_dict.update({opt: self.exec_cmd(["sysctl", "-n", opt]).strip()})
|
self.sysctl_restore_dict.update({opt: self.exec_cmd(["sysctl", "-n", opt]).strip()})
|
||||||
self.log.info(self.exec_cmd(["sudo", "sysctl", "-w", "%s=%s" % (opt, value)]).strip())
|
self.log.info(self.exec_cmd(["sudo", "sysctl", "-w", "%s=%s" % (opt, value)]).strip())
|
||||||
@ -756,15 +745,6 @@ ramp_time={ramp_time}
|
|||||||
runtime={run_time}
|
runtime={run_time}
|
||||||
rate_iops={rate_iops}
|
rate_iops={rate_iops}
|
||||||
"""
|
"""
|
||||||
if "spdk" in self.mode:
|
|
||||||
ioengine = "%s/build/fio/spdk_bdev" % self.spdk_dir
|
|
||||||
spdk_conf = "spdk_json_conf=%s/bdev.conf" % self.spdk_dir
|
|
||||||
else:
|
|
||||||
ioengine = self.ioengine
|
|
||||||
spdk_conf = ""
|
|
||||||
out = self.exec_cmd(["sudo", "nvme", "list", "|", "grep", "-E", "'SPDK|Linux'",
|
|
||||||
"|", "awk", "'{print $1}'"])
|
|
||||||
subsystems = [x for x in out.split("\n") if "nvme" in x]
|
|
||||||
|
|
||||||
if self.cpus_allowed is not None:
|
if self.cpus_allowed is not None:
|
||||||
self.log.info("Limiting FIO workload execution on specific cores %s" % self.cpus_allowed)
|
self.log.info("Limiting FIO workload execution on specific cores %s" % self.cpus_allowed)
|
||||||
@ -784,24 +764,20 @@ rate_iops={rate_iops}
|
|||||||
self.log.info("Limiting FIO workload execution to %s cores" % self.num_cores)
|
self.log.info("Limiting FIO workload execution to %s cores" % self.num_cores)
|
||||||
threads = range(0, int(self.num_cores))
|
threads = range(0, int(self.num_cores))
|
||||||
else:
|
else:
|
||||||
self.num_cores = len(subsystems)
|
self.num_cores = len(self.subsystem_info_list)
|
||||||
threads = range(0, len(subsystems))
|
threads = range(0, len(self.subsystem_info_list))
|
||||||
|
|
||||||
if "spdk" in self.mode:
|
|
||||||
filename_section = self.gen_fio_filename_conf(self.subsystem_info_list, threads, io_depth, num_jobs,
|
filename_section = self.gen_fio_filename_conf(self.subsystem_info_list, threads, io_depth, num_jobs,
|
||||||
offset, offset_inc)
|
offset, offset_inc)
|
||||||
else:
|
|
||||||
filename_section = self.gen_fio_filename_conf(threads, io_depth, num_jobs,
|
|
||||||
offset, offset_inc)
|
|
||||||
|
|
||||||
fio_config = fio_conf_template.format(ioengine=ioengine, spdk_conf=spdk_conf,
|
fio_config = fio_conf_template.format(ioengine=self.ioengine, spdk_conf=self.spdk_conf,
|
||||||
rw=rw, rwmixread=rwmixread, block_size=block_size,
|
rw=rw, rwmixread=rwmixread, block_size=block_size,
|
||||||
ramp_time=ramp_time, run_time=run_time, rate_iops=rate_iops)
|
ramp_time=ramp_time, run_time=run_time, rate_iops=rate_iops)
|
||||||
|
|
||||||
# TODO: hipri disabled for now, as it causes fio errors:
|
# TODO: hipri disabled for now, as it causes fio errors:
|
||||||
# io_u error on file /dev/nvme2n1: Operation not supported
|
# io_u error on file /dev/nvme2n1: Operation not supported
|
||||||
# See comment in KernelInitiator class, init_connect() function
|
# See comment in KernelInitiator class, init_connect() function
|
||||||
if hasattr(self, "ioengine") and "io_uring" in self.ioengine:
|
if "io_uring" in self.ioengine:
|
||||||
fio_config = fio_config + """
|
fio_config = fio_config + """
|
||||||
fixedbufs=1
|
fixedbufs=1
|
||||||
registerfiles=1
|
registerfiles=1
|
||||||
@ -875,6 +851,22 @@ class KernelTarget(Target):
|
|||||||
if "nvmet_bin" in target_config:
|
if "nvmet_bin" in target_config:
|
||||||
self.nvmet_bin = target_config["nvmet_bin"]
|
self.nvmet_bin = target_config["nvmet_bin"]
|
||||||
|
|
||||||
|
def load_drivers(self):
|
||||||
|
self.log.info("Loading drivers")
|
||||||
|
super().load_drivers()
|
||||||
|
if self.null_block:
|
||||||
|
self.exec_cmd(["sudo", "modprobe", "null_blk", "nr_devices=%s" % self.null_block])
|
||||||
|
|
||||||
|
def configure_adq(self):
|
||||||
|
self.log.warning("WARNING: ADQ setup not yet supported for Kernel mode. Skipping configuration.")
|
||||||
|
|
||||||
|
def adq_configure_tc(self):
|
||||||
|
self.log.warning("WARNING: ADQ setup not yet supported for Kernel mode. Skipping configuration.")
|
||||||
|
|
||||||
|
def adq_set_busy_read(self, busy_read_val):
|
||||||
|
self.log.warning("WARNING: ADQ setup not yet supported for Kernel mode. busy_read set to 0")
|
||||||
|
return {"net.core.busy_read": 0}
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
self.nvmet_command(self.nvmet_bin, "clear")
|
self.nvmet_command(self.nvmet_bin, "clear")
|
||||||
self.restore_settings()
|
self.restore_settings()
|
||||||
@ -1011,6 +1003,9 @@ class SPDKTarget(Target):
|
|||||||
self.log.info("====DSA settings:====")
|
self.log.info("====DSA settings:====")
|
||||||
self.log.info("DSA enabled: %s" % (self.enable_dsa))
|
self.log.info("DSA enabled: %s" % (self.enable_dsa))
|
||||||
|
|
||||||
|
def adq_set_busy_read(self, busy_read_val):
|
||||||
|
return {"net.core.busy_read": busy_read_val}
|
||||||
|
|
||||||
def get_nvme_devices_count(self):
|
def get_nvme_devices_count(self):
|
||||||
return len(self.get_nvme_devices())
|
return len(self.get_nvme_devices())
|
||||||
|
|
||||||
@ -1218,6 +1213,7 @@ class KernelInitiator(Initiator):
|
|||||||
# Defaults
|
# Defaults
|
||||||
self.extra_params = ""
|
self.extra_params = ""
|
||||||
self.ioengine = "libaio"
|
self.ioengine = "libaio"
|
||||||
|
self.spdk_conf = ""
|
||||||
|
|
||||||
if "num_cores" in initiator_config:
|
if "num_cores" in initiator_config:
|
||||||
self.num_cores = initiator_config["num_cores"]
|
self.num_cores = initiator_config["num_cores"]
|
||||||
@ -1230,6 +1226,16 @@ class KernelInitiator(Initiator):
|
|||||||
if "io_uring" in self.ioengine:
|
if "io_uring" in self.ioengine:
|
||||||
self.extra_params = "--nr-poll-queues=8"
|
self.extra_params = "--nr-poll-queues=8"
|
||||||
|
|
||||||
|
def configure_adq(self):
|
||||||
|
self.log.warning("WARNING: ADQ setup not yet supported for Kernel mode. Skipping configuration.")
|
||||||
|
|
||||||
|
def adq_configure_tc(self):
|
||||||
|
self.log.warning("WARNING: ADQ setup not yet supported for Kernel mode. Skipping configuration.")
|
||||||
|
|
||||||
|
def adq_set_busy_read(self, busy_read_val):
|
||||||
|
self.log.warning("WARNING: ADQ setup not yet supported for Kernel mode. busy_read set to 0")
|
||||||
|
return {"net.core.busy_read": 0}
|
||||||
|
|
||||||
def get_connected_nvme_list(self):
|
def get_connected_nvme_list(self):
|
||||||
json_obj = json.loads(self.exec_cmd(["sudo", "nvme", "list", "-o", "json"]))
|
json_obj = json.loads(self.exec_cmd(["sudo", "nvme", "list", "-o", "json"]))
|
||||||
nvme_list = [os.path.basename(x["DevicePath"]) for x in json_obj["Devices"]
|
nvme_list = [os.path.basename(x["DevicePath"]) for x in json_obj["Devices"]
|
||||||
@ -1280,7 +1286,10 @@ class KernelInitiator(Initiator):
|
|||||||
self.exec_cmd(["cat", "/sys/class/nvme/%s/address" % nvme_ctrl]))
|
self.exec_cmd(["cat", "/sys/class/nvme/%s/address" % nvme_ctrl]))
|
||||||
return self.get_route_nic_numa(remote_nvme_ip.group(0))
|
return self.get_route_nic_numa(remote_nvme_ip.group(0))
|
||||||
|
|
||||||
def gen_fio_filename_conf(self, threads, io_depth, num_jobs=1, offset=False, offset_inc=0):
|
def gen_fio_filename_conf(self, subsystems, threads, io_depth, num_jobs=1, offset=False, offset_inc=0):
|
||||||
|
if len(threads) >= len(subsystems):
|
||||||
|
threads = range(0, len(subsystems))
|
||||||
|
|
||||||
# Generate connected nvme devices names and sort them by used NIC numa node
|
# Generate connected nvme devices names and sort them by used NIC numa node
|
||||||
# to allow better grouping when splitting into fio sections.
|
# to allow better grouping when splitting into fio sections.
|
||||||
nvme_list = [os.path.join("/dev", nvme) for nvme in self.get_connected_nvme_list()]
|
nvme_list = [os.path.join("/dev", nvme) for nvme in self.get_connected_nvme_list()]
|
||||||
@ -1332,6 +1341,12 @@ class SPDKInitiator(Initiator):
|
|||||||
if "num_cores" in initiator_config:
|
if "num_cores" in initiator_config:
|
||||||
self.num_cores = initiator_config["num_cores"]
|
self.num_cores = initiator_config["num_cores"]
|
||||||
|
|
||||||
|
self.ioengine = "%s/build/fio/spdk_bdev" % self.spdk_dir
|
||||||
|
self.spdk_conf = "spdk_json_conf=%s/bdev.conf" % self.spdk_dir
|
||||||
|
|
||||||
|
def adq_set_busy_read(self, busy_read_val):
|
||||||
|
return {"net.core.busy_read": busy_read_val}
|
||||||
|
|
||||||
def install_spdk(self):
|
def install_spdk(self):
|
||||||
self.log.info("Using fio binary %s" % self.fio_bin)
|
self.log.info("Using fio binary %s" % self.fio_bin)
|
||||||
self.exec_cmd(["git", "-C", self.spdk_dir, "submodule", "update", "--init"])
|
self.exec_cmd(["git", "-C", self.spdk_dir, "submodule", "update", "--init"])
|
||||||
|
Loading…
Reference in New Issue
Block a user