diff options
Diffstat (limited to 'storperf/fio/fio_invoker.py')
-rw-r--r-- | storperf/fio/fio_invoker.py | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/storperf/fio/fio_invoker.py b/storperf/fio/fio_invoker.py new file mode 100644 index 0000000..91ef6e8 --- /dev/null +++ b/storperf/fio/fio_invoker.py @@ -0,0 +1,105 @@ +############################################################################## +# Copyright (c) 2015 EMC and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +import sys +import getopt +import subprocess +import json +from threading import Thread + +class Usage(Exception): + def __init__(self, msg): + self.msg = msg + +class FIOInvoker(object): + def __init__(self): + self.event_listeners = set() + + def register(self, event_listener): + self.event_listeners.add(event_listener) + + def unregister(self, event_listener): + self.event_listeners.discard(event_listener) + + def stdout_handler(self): + self.json_body = "" + for line in iter(self.fio_process.stdout.readline, b''): + self.json_body += line + try: + json_metric = json.loads(self.json_body) + self.json_body = "" + + for event_listener in self.event_listeners: + event_listener(json_metric) + + except: + if self.json_body.startswith("fio"): + self.json_body = "" + pass + + self.fio_process.stdout.close() + + def stderr_handler(self): + for line in iter(self.fio_process.stderr.readline, b''): + print line + + self.fio_process.stderr.close() + + def execute(self, args=[]): + self.fio_process = subprocess.Popen(['fio']+args, + universal_newlines=True, stdout=subprocess.PIPE, + stderr=subprocess.PIPE); + + t = Thread(target=self.stdout_handler, args=()) + t.daemon = False + t.start() + + t = Thread(target=self.stderr_handler, args=()) + t.daemon = False + t.start() + + # fio --rw=randread --size=32m --directory=/tmp/fio-testing/data --ioengine=libaio --iodepth=2 --direct=1 --invalidate=1 --numjobs=4 --name=random-read + +def event(json_metric): + print json_metric + + +def main(argv=None): + if argv is None: + argv = sys.argv + try: + try: + opts = getopt.getopt(argv[1:], "h", ["help"]) + except getopt.error, msg: + raise Usage(msg) + + except Usage, err: + print >> sys.stderr, err.msg + print >> sys.stderr, "for help use --help" + return 2 + + for o in opts: + if o in ("-h", "--help"): + print __doc__ + return 0 + + simple_args = ['--rw=randread', '--size=32m', + '--directory=.', + '--iodepth=2', + '--direct=1', '--invalidate=1', '--numjobs=4', + '--name=random-read', '--output-format=json', + '--status-interval=3', + '--time_based', '--runtime=6'] + + invoker = FIOInvoker() + invoker.register(event) + invoker.execute(simple_args) + +if __name__ == "__main__": + sys.exit(main()) |