filename - file name for fio workload
type: string
unit: na
- default: /home/ec2-user/data.raw
+ default: /home/ubuntu/data.raw
bs - block size used for the io units
type: int
unit: bytes
TARGET_SCRIPT = "fio_benchmark.bash"
- def __init__(self, context):
- self.context = context
+ def __init__(self, scenario_cfg, context_cfg):
+ self.scenario_cfg = scenario_cfg
+ self.context_cfg = context_cfg
self.setup_done = False
def setup(self):
self.target_script = pkg_resources.resource_filename(
"yardstick.benchmark.scenarios.storage",
Fio.TARGET_SCRIPT)
- user = self.context.get("user", "root")
- host = self.context.get("host", None)
- key_filename = self.context.get("key_filename", "~/.ssh/id_rsa")
-
- LOG.info("user:%s, host:%s", user, host)
- self.client = ssh.SSH(user, host, key_filename=key_filename)
+ host = self.context_cfg["host"]
+ user = host.get("user", "root")
+ ssh_port = host.get("ssh_port", ssh.DEFAULT_PORT)
+ ip = host.get("ip", None)
+ key_filename = host.get("key_filename", "~/.ssh/id_rsa")
+
+ LOG.info("user:%s, host:%s", user, ip)
+ self.client = ssh.SSH(user, ip, key_filename=key_filename,
+ port=ssh_port)
self.client.wait(timeout=600)
# copy script to host
self.setup_done = True
- def run(self, args):
+ def run(self, result):
"""execute the benchmark"""
default_args = "-ioengine=libaio -direct=1 -group_reporting " \
"-numjobs=1 -time_based --output-format=json"
- result = {}
if not self.setup_done:
self.setup()
- options = args["options"]
- filename = options.get("filename", "/home/ec2-user/data.raw")
+ options = self.scenario_cfg["options"]
+ filename = options.get("filename", "/home/ubuntu/data.raw")
bs = options.get("bs", "4k")
iodepth = options.get("iodepth", "1")
rw = options.get("rw", "write")
ramp_time = options.get("ramp_time", 20)
name = "yardstick-fio"
# if run by a duration runner
- duration_time = self.context.get("duration", None)
+ duration_time = self.scenario_cfg["runner"].get("duration", None) \
+ if "runner" in self.scenario_cfg else None
# if run by an arithmetic runner
arithmetic_time = options.get("duration", None)
if duration_time:
raw_data = json.loads(stdout)
# The bandwidth unit is KB/s, and latency unit is us
- result["read_bw"] = raw_data["jobs"][0]["read"]["bw"]
- result["read_iops"] = raw_data["jobs"][0]["read"]["iops"]
- result["read_lat"] = raw_data["jobs"][0]["read"]["lat"]["mean"]
- result["write_bw"] = raw_data["jobs"][0]["write"]["bw"]
- result["write_iops"] = raw_data["jobs"][0]["write"]["iops"]
- result["write_lat"] = raw_data["jobs"][0]["write"]["lat"]["mean"]
-
- # TODO: add sla check
-
- return result
+ if rw in ["read", "randread", "rw", "randrw"]:
+ result["read_bw"] = raw_data["jobs"][0]["read"]["bw"]
+ result["read_iops"] = raw_data["jobs"][0]["read"]["iops"]
+ result["read_lat"] = raw_data["jobs"][0]["read"]["lat"]["mean"]
+ if rw in ["write", "randwrite", "rw", "randrw"]:
+ result["write_bw"] = raw_data["jobs"][0]["write"]["bw"]
+ result["write_iops"] = raw_data["jobs"][0]["write"]["iops"]
+ result["write_lat"] = raw_data["jobs"][0]["write"]["lat"]["mean"]
+
+ if "sla" in self.scenario_cfg:
+ sla_error = ""
+ for k, v in result.items():
+ if k not in self.scenario_cfg['sla']:
+ continue
+
+ if "lat" in k:
+ # For lattency small value is better
+ max_v = float(self.scenario_cfg['sla'][k])
+ if v > max_v:
+ sla_error += "%s %f > sla:%s(%f); " % (k, v, k, max_v)
+ else:
+ # For bandwidth and iops big value is better
+ min_v = int(self.scenario_cfg['sla'][k])
+ if v < min_v:
+ sla_error += "%s %d < " \
+ "sla:%s(%d); " % (k, v, k, min_v)
+
+ assert sla_error == "", sla_error
def _test():
key_filename = pkg_resources.resource_filename("yardstick.resources",
"files/yardstick_key")
ctx = {
- "host": "10.0.0.101",
- "user": "ec2-user",
- "key_filename": key_filename
+ "host": {
+ "ip": "10.229.47.137",
+ "user": "root",
+ "key_filename": key_filename
+ }
}
logger = logging.getLogger("yardstick")
logger.setLevel(logging.DEBUG)
- fio = Fio(ctx)
-
options = {
- "filename": "/home/ec2-user/data.raw",
+ "filename": "/home/ubuntu/data.raw",
"bs": "4k",
"iodepth": "1",
"rw": "rw",
"ramp_time": 1,
"duration": 10
}
+ result = {}
args = {"options": options}
- result = fio.run(args)
+ fio = Fio(args, ctx)
+ fio.run(result)
print result
if __name__ == '__main__':