Commit | Line | Data |
---|---|---|
15835530 VF |
1 | #!/usr/bin/python2.7 |
2 | # | |
3 | # sgunmap-test.py | |
4 | # | |
5 | # Basic performance testing using fio's sg ioengine | |
6 | # | |
7 | # USAGE | |
8 | # sgunmap-perf.py char-device block-device fio-executable | |
9 | # | |
10 | # EXAMPLE | |
11 | # t/sgunmap-perf.py /dev/sg1 /dev/sdb ./fio | |
12 | # | |
13 | # REQUIREMENTS | |
14 | # Python 2.6+ | |
15 | # | |
16 | # | |
17 | ||
18 | from __future__ import absolute_import | |
19 | from __future__ import print_function | |
20 | import sys | |
21 | import json | |
22 | import argparse | |
23 | import subprocess | |
24 | from six.moves import range | |
25 | ||
26 | ||
27 | def parse_args(): | |
28 | parser = argparse.ArgumentParser() | |
29 | parser.add_argument('cdev', | |
30 | help='character device target (e.g., /dev/sg0)') | |
31 | parser.add_argument('bdev', | |
32 | help='block device target (e.g., /dev/sda)') | |
33 | parser.add_argument('fioc', | |
34 | help='path to candidate fio executable (e.g., ./fio)') | |
35 | parser.add_argument('fior', | |
36 | help='path to reference fio executable (e.g., ./fio)') | |
37 | args = parser.parse_args() | |
38 | ||
39 | return args | |
40 | ||
41 | ||
42 | def fulldevice(fio, dev, ioengine='psync', rw='trim', bs='1M'): | |
43 | parameters = ["--name=test", | |
44 | "--output-format=json", | |
45 | "--random_generator=lfsr", | |
46 | "--bs={0}".format(bs), | |
47 | "--rw={0}".format(rw), | |
48 | "--ioengine={0}".format(ioengine), | |
49 | "--filename={0}".format(dev)] | |
50 | ||
51 | output = subprocess.check_output([fio] + parameters) | |
52 | jsondata = json.loads(output) | |
53 | jobdata = jsondata['jobs'][0] | |
54 | return jobdata | |
55 | ||
56 | ||
57 | def runtest(fio, dev, rw, qd, batch, bs='512', runtime='30s'): | |
58 | parameters = ["--name=test", | |
59 | "--random_generator=tausworthe64", | |
60 | "--time_based", | |
61 | "--runtime={0}".format(runtime), | |
62 | "--output-format=json", | |
63 | "--ioengine=sg", | |
64 | "--blocksize={0}".format(bs), | |
65 | "--rw={0}".format(rw), | |
66 | "--filename={0}".format(dev), | |
67 | "--iodepth={0}".format(qd), | |
68 | "--iodepth_batch={0}".format(batch)] | |
69 | ||
70 | output = subprocess.check_output([fio] + parameters) | |
71 | jsondata = json.loads(output) | |
72 | jobdata = jsondata['jobs'][0] | |
73 | # print(parameters) | |
74 | ||
75 | return jobdata | |
76 | ||
77 | ||
78 | def runtests(fio, dev, qd, batch, rw, bs='512', trials=5): | |
79 | iops = [] | |
80 | for x in range(trials): | |
81 | jd = runtest(fio, dev, rw, qd, batch, bs=bs) | |
82 | total = jd['read']['iops'] + jd['write']['iops'] + jd['trim']['iops'] | |
83 | # print(total) | |
84 | iops.extend([total]) | |
85 | return iops, (sum(iops) / trials) | |
86 | ||
87 | if __name__ == '__main__': | |
88 | args = parse_args() | |
89 | ||
90 | print("Trimming full device {0}".format(args.cdev)) | |
91 | fulldevice(args.fior, args.cdev, ioengine='sg') | |
92 | ||
93 | print("Running rand read tests on {0}" | |
94 | " with fio candidate build {1}".format(args.cdev, args.fioc)) | |
95 | randread, rrmean = runtests(args.fioc, args.cdev, 16, 1, 'randread', | |
96 | trials=5) | |
97 | print("IOPS mean {0}, trials {1}".format(rrmean, randread)) | |
98 | ||
99 | print("Running rand read tests on {0}" | |
100 | " with fio reference build {1}".format(args.cdev, args.fior)) | |
101 | randread, rrmean = runtests(args.fior, args.cdev, 16, 1, 'randread', | |
102 | trials=5) | |
103 | print("IOPS mean {0}, trials {1}".format(rrmean, randread)) | |
104 | ||
105 | print("Running rand write tests on {0}" | |
106 | " with fio candidate build {1}".format(args.cdev, args.fioc)) | |
107 | randwrite, rwmean = runtests(args.fioc, args.cdev, 16, 1, 'randwrite', | |
108 | trials=5) | |
109 | print("IOPS mean {0}, trials {1}".format(rwmean, randwrite)) | |
110 | ||
111 | print("Running rand write tests on {0}" | |
112 | " with fio reference build {1}".format(args.cdev, args.fior)) | |
113 | randwrite, rwmean = runtests(args.fior, args.cdev, 16, 1, 'randwrite', | |
114 | trials=5) | |
115 | print("IOPS mean {0}, trials {1}".format(rwmean, randwrite)) |