1 ##############################################################################
2 # Copyright (c) 2015 Huawei Technologies Co.,Ltd.
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
13 import yardstick.ssh as ssh
14 from yardstick.benchmark.scenarios import base
16 LOG = logging.getLogger(__name__)
19 class Fio(base.Scenario):
20 """Execute fio benchmark in a host
23 filename - file name for fio workload
26 default: /home/ec2-user/data.raw
27 bs - block size used for the io units
31 iodepth - number of iobuffers to keep in flight
35 rw - type of io pattern [read, write, randwrite, randread, rw, randrw]
39 ramp_time - run time before logging any performance
44 Read link below for more fio args description:
45 http://www.bluestop.org/fio/HOWTO.txt
47 __scenario_type__ = "Fio"
49 TARGET_SCRIPT = "fio_benchmark.bash"
51 def __init__(self, context):
52 self.context = context
53 self.setup_done = False
57 self.target_script = pkg_resources.resource_filename(
58 "yardstick.benchmark.scenarios.storage",
60 user = self.context.get("user", "root")
61 host = self.context.get("host", None)
62 key_filename = self.context.get("key_filename", "~/.ssh/id_rsa")
64 LOG.info("user:%s, host:%s", user, host)
65 self.client = ssh.SSH(user, host, key_filename=key_filename)
66 self.client.wait(timeout=600)
69 self.client.run("cat > ~/fio.sh",
70 stdin=open(self.target_script, "rb"))
72 self.setup_done = True
75 """execute the benchmark"""
76 default_args = "-ioengine=libaio -direct=1 -group_reporting " \
77 "-numjobs=1 -time_based --output-format=json"
80 if not self.setup_done:
83 options = args["options"]
84 filename = options.get("filename", "/home/ec2-user/data.raw")
85 bs = options.get("bs", "4k")
86 iodepth = options.get("iodepth", "1")
87 rw = options.get("rw", "write")
88 ramp_time = options.get("ramp_time", 20)
89 name = "yardstick-fio"
90 # if run by a duration runner
91 duration_time = self.context.get("duration", None)
92 # if run by an arithmetic runner
93 arithmetic_time = options.get("duration", None)
95 runtime = duration_time
97 runtime = arithmetic_time
101 cmd_args = "-filename=%s -bs=%s -iodepth=%s -rw=%s -ramp_time=%s " \
102 "-runtime=%s -name=%s %s" \
103 % (filename, bs, iodepth, rw, ramp_time, runtime, name,
105 cmd = "sudo bash fio.sh %s %s" % (filename, cmd_args)
106 LOG.debug("Executing command: %s", cmd)
107 # Set timeout, so that the cmd execution does not exit incorrectly
108 # when the test run time is last long
109 timeout = int(ramp_time) + int(runtime) + 600
110 status, stdout, stderr = self.client.execute(cmd, timeout=timeout)
112 raise RuntimeError(stderr)
114 raw_data = json.loads(stdout)
116 # The bandwidth unit is KB/s, and latency unit is us
117 result["read_bw"] = raw_data["jobs"][0]["read"]["bw"]
118 result["read_iops"] = raw_data["jobs"][0]["read"]["iops"]
119 result["read_lat"] = raw_data["jobs"][0]["read"]["lat"]["mean"]
120 result["write_bw"] = raw_data["jobs"][0]["write"]["bw"]
121 result["write_iops"] = raw_data["jobs"][0]["write"]["iops"]
122 result["write_lat"] = raw_data["jobs"][0]["write"]["lat"]["mean"]
124 # TODO: add sla check
130 '''internal test function'''
131 key_filename = pkg_resources.resource_filename("yardstick.resources",
132 "files/yardstick_key")
134 "host": "10.0.0.101",
136 "key_filename": key_filename
139 logger = logging.getLogger("yardstick")
140 logger.setLevel(logging.DEBUG)
145 "filename": "/home/ec2-user/data.raw",
152 args = {"options": options}
154 result = fio.run(args)
157 if __name__ == '__main__':