blob: 5a4df58602d9877c04449d90616de0a420272d91 [file] [log] [blame]
koder aka kdanilov4af80852015-02-01 23:36:38 +02001import os
koder aka kdanilov4af80852015-02-01 23:36:38 +02002import sys
koder aka kdanilov4af80852015-02-01 23:36:38 +02003import json
koder aka kdanilov78ba8952015-02-03 01:11:23 +02004import pprint
koder aka kdanilov4af80852015-02-01 23:36:38 +02005import os.path
koder aka kdanilov80cb6192015-02-02 03:06:08 +02006import argparse
koder aka kdanilov4af80852015-02-01 23:36:38 +02007import datetime
koder aka kdanilov4af80852015-02-01 23:36:38 +02008import multiprocessing
9
koder aka kdanilov4643fd62015-02-10 16:20:13 -080010import io_scenario
11import rally_runner
12from itest import IOPerfTest
koder aka kdanilov80cb6192015-02-02 03:06:08 +020013
koder aka kdanilov4af80852015-02-01 23:36:38 +020014
15def log(x):
16 dt_str = datetime.datetime.now().strftime("%H:%M:%S")
17 pref = dt_str + " " + str(os.getpid()) + " >>>> "
18 sys.stderr.write(pref + x.replace("\n", "\n" + pref) + "\n")
19
20
koder aka kdanilov4643fd62015-02-10 16:20:13 -080021def run_io_test(tool,
22 script_args,
23 test_runner,
24 keep_temp_files=False):
koder aka kdanilov479b8d82015-02-09 12:56:22 +020025
koder aka kdanilov4643fd62015-02-10 16:20:13 -080026 files_dir = os.path.dirname(io_scenario.__file__)
koder aka kdanilov56ee3ed2015-02-02 19:00:31 +020027
koder aka kdanilov98615bf2015-02-02 00:59:07 +020028 path = 'iozone' if 'iozone' == tool else 'fio'
koder aka kdanilov4643fd62015-02-10 16:20:13 -080029 src_testtool_path = os.path.join(files_dir, path)
koder aka kdanilov78ba8952015-02-03 01:11:23 +020030
koder aka kdanilov4643fd62015-02-10 16:20:13 -080031 result_queue = multiprocessing.Queue()
koder aka kdanilov4af80852015-02-01 23:36:38 +020032
koder aka kdanilov4643fd62015-02-10 16:20:13 -080033 obj = IOPerfTest(script_args,
34 src_testtool_path,
35 result_queue.put,
36 keep_temp_files)
koder aka kdanilov4af80852015-02-01 23:36:38 +020037
koder aka kdanilov4643fd62015-02-10 16:20:13 -080038 test_runner(obj)
koder aka kdanilov4af80852015-02-01 23:36:38 +020039
koder aka kdanilov4643fd62015-02-10 16:20:13 -080040 test_result = []
41 while not result_queue.empty():
42 test_result.append(result_queue.get())
koder aka kdanilov4af80852015-02-01 23:36:38 +020043
koder aka kdanilov4643fd62015-02-10 16:20:13 -080044 return test_result
koder aka kdanilov80cb6192015-02-02 03:06:08 +020045
46
47def parse_args(argv):
48 parser = argparse.ArgumentParser(
49 description="Run rally disk io performance test")
50 parser.add_argument("tool_type", help="test tool type",
51 choices=['iozone', 'fio'])
koder aka kdanilov80cb6192015-02-02 03:06:08 +020052 parser.add_argument("-l", dest='extra_logs',
53 action='store_true', default=False,
54 help="print some extra log info")
55 parser.add_argument("-o", "--io-opts", dest='io_opts',
koder aka kdanilov4643fd62015-02-10 16:20:13 -080056 required=True,
koder aka kdanilov78ba8952015-02-03 01:11:23 +020057 help="cmd line options for io.py")
58 parser.add_argument("-t", "--test-directory", help="directory with test",
koder aka kdanilov56ee3ed2015-02-02 19:00:31 +020059 dest="test_directory", required=True)
koder aka kdanilov56ee3ed2015-02-02 19:00:31 +020060 parser.add_argument("--max-preparation-time", default=300,
61 type=int, dest="max_preparation_time")
koder aka kdanilov4a72f122015-02-09 12:25:54 +020062 parser.add_argument("-k", "--keep", default=False,
63 help="keep temporary files",
koder aka kdanilov4643fd62015-02-10 16:20:13 -080064 dest="keep_temp_files", action='store_true')
koder aka kdanilov4a72f122015-02-09 12:25:54 +020065 parser.add_argument("--rally-extra-opts", dest="rally_extra_opts",
66 default="", help="rally extra options")
koder aka kdanilov78ba8952015-02-03 01:11:23 +020067
koder aka kdanilov80cb6192015-02-02 03:06:08 +020068 return parser.parse_args(argv)
koder aka kdanilov4af80852015-02-01 23:36:38 +020069
70
71def main(argv):
koder aka kdanilov80cb6192015-02-02 03:06:08 +020072 opts = parse_args(argv)
koder aka kdanilov98615bf2015-02-02 00:59:07 +020073
koder aka kdanilov80cb6192015-02-02 03:06:08 +020074 if not opts.extra_logs:
75 global log
76
77 def nolog(x):
78 pass
79
80 log = nolog
koder aka kdanilov80cb6192015-02-02 03:06:08 +020081 else:
koder aka kdanilov4643fd62015-02-10 16:20:13 -080082 rally_runner.log = log
koder aka kdanilov80cb6192015-02-02 03:06:08 +020083
koder aka kdanilov4643fd62015-02-10 16:20:13 -080084 script_args = [opt.strip()
85 for opt in opts.io_opts.split(" ")
86 if opt.strip() != ""]
koder aka kdanilov1b0d3502015-02-03 21:32:31 +020087
koder aka kdanilov4643fd62015-02-10 16:20:13 -080088 runner = rally_runner.get_rally_runner(
89 files_dir=os.path.dirname(io_scenario.__file__),
90 rally_extra_opts=opts.rally_extra_opts.split(" "),
91 max_preparation_time=opts.max_preparation_time,
92 keep_temp_files=opts.keep_temp_files)
93
94 res = run_io_test(opts.tool_type,
95 script_args,
96 runner,
97 opts.keep_temp_files)
koder aka kdanilov78ba8952015-02-03 01:11:23 +020098
koder aka kdanilov4a72f122015-02-09 12:25:54 +020099 print "=" * 80
100 print pprint.pformat(res)
101 print "=" * 80
102
103 if len(res) != 0:
104 bw_mean = 0.0
105 for measurement in res:
106 bw_mean += measurement["bw_mean"]
107
108 bw_mean /= len(res)
109
110 it = ((bw_mean - measurement["bw_mean"]) ** 2 for measurement in res)
111 bw_dev = sum(it) ** 0.5
112
113 meta = res[0]['__meta__']
114 key = "{0} {1} {2}k".format(meta['action'],
115 's' if meta['sync'] else 'a',
116 meta['blocksize'])
117
118 print
119 print "====> " + json.dumps({key: (int(bw_mean), int(bw_dev))})
120 print
121 print "=" * 80
koder aka kdanilov78ba8952015-02-03 01:11:23 +0200122
koder aka kdanilov80cb6192015-02-02 03:06:08 +0200123 return 0
koder aka kdanilov4af80852015-02-01 23:36:38 +0200124
koder aka kdanilov4af80852015-02-01 23:36:38 +0200125
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800126ostack_prepare = """
127glance image-create --name 'ubuntu' --disk-format qcow2
128--container-format bare --is-public true --copy-from
129https://cloud-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-disk1.img
130
131nova flavor-create ceph.512 ceph.512 512 50 1
132nova server-group-create --policy anti-affinity ceph
133"""
134
koder aka kdanilov4af80852015-02-01 23:36:38 +0200135
136if __name__ == '__main__':
koder aka kdanilov98615bf2015-02-02 00:59:07 +0200137 exit(main(sys.argv[1:]))