]>
git.proxmox.com Git - ceph.git/blob - ceph/src/spdk/test/nvmf/fio/nvmf_fio.py
3 from subprocess
import check_call
, call
, check_output
, Popen
, PIPE
, CalledProcessError
31 fio_job_template
= """
38 def interrupt_handler(signum
, frame
):
40 print("FIO terminated")
47 if (len(sys
.argv
) < 5):
49 print(" " + sys
.argv
[0] + " <io_size> <queue_depth> <test_type> <runtime>")
50 print("advanced usage:")
51 print("If you want to run fio with verify, please add verify string after runtime.")
52 print("Currently fio.py only support write rw randwrite randrw with verify enabled.")
55 io_size
= int(sys
.argv
[1])
56 queue_depth
= int(sys
.argv
[2])
57 test_type
= sys
.argv
[3]
64 devices
= get_target_devices()
65 print("Found devices: ", devices
)
67 # configure_devices(devices)
69 fio_executable
= check_output("which fio", shell
=True).split()[0]
70 except CalledProcessError
as e
:
71 sys
.stderr
.write(str(e
))
72 sys
.stderr
.write("\nCan't find the fio binary, please install it.\n")
75 device_paths
= ['/dev/' + dev
for dev
in devices
]
78 signal
.signal(signal
.SIGTERM
, interrupt_handler
)
79 signal
.signal(signal
.SIGINT
, interrupt_handler
)
80 fio
= Popen([fio_executable
, '-'], stdin
=PIPE
)
81 fio
.communicate(create_fio_config(io_size
, queue_depth
, device_paths
, test_type
, runtime
, verify
))
84 print("FIO completed with code %d\n" % rc
)
89 def get_target_devices():
90 output
= str(check_output('lsblk -l -o NAME', shell
=True).decode())
91 return re
.findall("(nvme[0-9]+n[0-9]+)\n", output
)
94 def create_fio_config(size
, q_depth
, devices
, test
, run_time
, verify
):
98 verifyfio
= verify_template
99 fiofile
= fio_template
% {"blocksize": size
, "iodepth": q_depth
,
100 "testtype": test
, "runtime": run_time
, "verify": verifyfio
}
101 for (i
, dev
) in enumerate(devices
):
102 fiofile
+= fio_job_template
% {"jobnumber": i
, "device": dev
}
103 return fiofile
.encode()
106 def set_device_parameter(devices
, filename_template
, value
):
108 filename
= filename_template
% dev
109 f
= open(filename
, 'r+b')
114 def configure_devices(devices
):
115 set_device_parameter(devices
, "/sys/block/%s/queue/nomerges", "2")
116 set_device_parameter(devices
, "/sys/block/%s/queue/nr_requests", "128")
121 set_device_parameter(devices
, "/sys/block/%s/device/queue_depth", str(qd
))
126 print("Could not set block device queue depths.")
128 print("Requested queue_depth {} but only {} is supported.".format(str(requested_qd
), str(qd
)))
129 set_device_parameter(devices
, "/sys/block/%s/queue/scheduler", "noop")
132 if __name__
== "__main__":