a lot of fixes and improvements
diff --git a/scripts/generate_load.py b/scripts/generate_load.py
new file mode 100644
index 0000000..4d43964
--- /dev/null
+++ b/scripts/generate_load.py
@@ -0,0 +1,84 @@
+# BLOCK_SIZES = "1k 4k 64k 256k 1m"
+# OPERATIONS="randwrite write randread read"
+# SYNC_TYPES="s a d"
+# REPEAT_COUNT="3"
+# CONCURRENCES="1 8 64"
+
+from utils import ssize_to_kb
+
+SYNC_FACTOR = "x500"
+DIRECT_FACTOR = "x10000"
+ASYNC_FACTOR = "r2"
+
+
+def make_list(x):
+    if not isinstance(x, (list, tuple)):
+        return [x]
+    return x
+
+HDD_SIZE_KB = 45 * 1000 * 1000
+
+
+def make_load(sizes, opers, sync_types, concurrence,
+              tester_type='iozone', repeat_count=3):
+
+    iodepth = 1
+    for conc in make_list(concurrence):
+        for bsize in make_list(sizes):
+            for oper in make_list(opers):
+                for sync_type in make_list(sync_types):
+
+                    # filter out too slow options
+                    if bsize in "1k 4k" and sync_type == "a":
+                        continue
+
+                    # filter out sync reads
+                    if oper in "read randread" and sync_type == "s":
+                        continue
+
+                    if sync_type == "s":
+                        size_sync_opts = "--iosize {0} -s".format(SYNC_FACTOR)
+                    elif sync_type == "d":
+                        if oper == 'randread':
+                            assert SYNC_FACTOR[0] == 'x'
+                            max_f = int(SYNC_FACTOR[1:])
+                        else:
+                            max_f = None
+
+                        mmax_f = HDD_SIZE_KB / (int(conc) * ssize_to_kb(bsize))
+
+                        if max_f is None or mmax_f > max_f:
+                            max_f = mmax_f
+
+                        assert DIRECT_FACTOR[0] == 'x'
+                        if max_f > int(DIRECT_FACTOR[1:]):
+                            max_f = DIRECT_FACTOR
+                        else:
+                            max_f = "x{0}".format(max_f)
+
+                        size_sync_opts = "--iosize {0} -d".format(max_f)
+
+                    else:
+                        size_sync_opts = "--iosize {0}".format(ASYNC_FACTOR)
+
+                    # size_sync_opts = get_file_size_opts(sync_type)
+
+                    io_opts = "--type {0} ".format(tester_type)
+                    io_opts += "-a {0} ".format(oper)
+                    io_opts += "--iodepth {0} ".format(iodepth)
+                    io_opts += "--blocksize {0} ".format(bsize)
+                    io_opts += size_sync_opts + " "
+                    io_opts += "--concurrency {0}".format(conc)
+
+                    for i in range(repeat_count):
+                        yield io_opts
+
+
+sizes = "4k 64k 2m".split()
+opers = "randwrite write randread read".split()
+sync_types = "s a d".split()
+concurrence = "1 8 64".split()
+
+for io_opts in make_load(sizes=sizes, concurrence=concurrence,
+                         sync_types=sync_types, opers=opers):
+    print io_opts