]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/spdk/scripts/fio.py
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / spdk / scripts / fio.py
index 35bc5f86d06702947601029771f2576a3fa50f50..0868633ee7f3663cb4da5fccb38a7987f9443ff3 100755 (executable)
@@ -1,6 +1,6 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
-from subprocess import check_call, call, check_output, Popen, PIPE
+from subprocess import check_call, call, check_output, Popen, PIPE, CalledProcessError
 import re
 import sys
 import signal
@@ -16,7 +16,7 @@ ioengine=libaio
 direct=1
 bs=%(blocksize)d
 iodepth=%(iodepth)d
-norandommap=1
+norandommap=%(norandommap)d
 %(verify)s
 verify_dump=1
 
@@ -34,20 +34,22 @@ filename=%(device)s
 
 """
 
+
 def interrupt_handler(signum, frame):
     fio.terminate()
-    print "FIO terminated"
+    print("FIO terminated")
     sys.exit(0)
 
+
 def main():
 
     global fio
     if (len(sys.argv) < 5):
-        print "usage:"
-        print "  " + sys.argv[0] + " <io_size> <queue_depth> <test_type> <runtime>"
-        print "advanced usage:"
-        print "If you want to run fio with verify, please add verify string after runtime."
-        print "Currently fio.py only support write rw randwrite randrw with verify enabled."
+        print("usage:")
+        print("  " + sys.argv[0] + " <io_size> <queue_depth> <test_type> <runtime>")
+        print("advanced usage:")
+        print("If you want to run fio with verify, please add verify string after runtime.")
+        print("Currently fio.py only support write rw randwrite randrw with verify enabled.")
         sys.exit(1)
 
     io_size = int(sys.argv[1])
@@ -60,44 +62,64 @@ def main():
         verify = False
 
     devices = get_target_devices()
-    print "Found devices: ", devices
+    print(("Found devices: ", devices))
 
     configure_devices(devices)
-    fio_executable = '/usr/bin/fio'
+    try:
+            fio_executable = check_output("which fio", shell=True).split()[0]
+    except CalledProcessError as e:
+            sys.stderr.write(str(e))
+            sys.stderr.write("\nCan't find the fio binary, please install it.\n")
+            sys.exit(1)
 
     device_paths = ['/dev/' + dev for dev in devices]
     sys.stdout.flush()
     signal.signal(signal.SIGTERM, interrupt_handler)
     signal.signal(signal.SIGINT, interrupt_handler)
     fio = Popen([fio_executable, '-'], stdin=PIPE)
-    fio.communicate(create_fio_config(io_size, queue_depth, device_paths, test_type, runtime, verify))
+    fio.communicate(create_fio_config(io_size, queue_depth, device_paths, test_type, runtime, verify).encode())
     fio.stdin.close()
     rc = fio.wait()
-    print "FIO completed with code %d\n" % rc
+    print("FIO completed with code %d\n" % rc)
     sys.stdout.flush()
     sys.exit(rc)
 
+
 def get_target_devices():
     output = check_output('iscsiadm -m session -P 3', shell=True)
-    return re.findall("Attached scsi disk (sd[a-z]+)", output)
+    return re.findall("Attached scsi disk (sd[a-z]+)", output.decode("ascii"))
+
 
 def create_fio_config(size, q_depth, devices, test, run_time, verify):
+    norandommap = 0
     if not verify:
         verifyfio = ""
+        norandommap = 1
     else:
         verifyfio = verify_template
     fiofile = fio_template % {"blocksize": size, "iodepth": q_depth,
-                              "testtype": test, "runtime": run_time, "verify": verifyfio}
+                              "testtype": test, "runtime": run_time,
+                              "norandommap": norandommap, "verify": verifyfio}
     for (i, dev) in enumerate(devices):
         fiofile += fio_job_template % {"jobnumber": i, "device": dev}
     return fiofile
 
+
 def set_device_parameter(devices, filename_template, value):
+    valid_value = True
+
     for dev in devices:
         filename = filename_template % dev
         f = open(filename, 'r+b')
-        f.write(value)
-        f.close()
+        try:
+            f.write(value.encode())
+            f.close()
+        except OSError:
+            valid_value = False
+            continue
+
+    return valid_value
+
 
 def configure_devices(devices):
     set_device_parameter(devices, "/sys/block/%s/queue/nomerges", "2")
@@ -111,10 +133,12 @@ def configure_devices(devices):
         except IOError:
             qd = qd - 1
     if qd == 0:
-        print "Could not set block device queue depths."
+        print("Could not set block device queue depths.")
     else:
-        print "Requested queue_depth {} but only {} is supported.".format(str(requested_qd), str(qd))
-    set_device_parameter(devices, "/sys/block/%s/queue/scheduler", "noop")
+        print("Requested queue_depth {} but only {} is supported.".format(str(requested_qd), str(qd)))
+    if not set_device_parameter(devices, "/sys/block/%s/queue/scheduler", "noop"):
+        set_device_parameter(devices, "/sys/block/%s/queue/scheduler", "none")
+
 
 if __name__ == "__main__":
     main()