From: Kristian Hunt Date: Tue, 21 Jul 2015 12:29:10 +0000 (+0200) Subject: Add lmbench scenario and sample X-Git-Tag: brahmaputra.1.0~207^2 X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F40%2F1040%2F3;p=yardstick.git Add lmbench scenario and sample Supports measuring memory read latency using Lmbench. SLA can be verified for maximum latency time in nanoseconds compared against results from every measurement taken. Change-Id: Ia187e68eaa03341ba14b6e9eb986afb1d00dd0f6 JIRA: YARDSTICK-89 JIRA: YARDSTICK-92 Signed-off-by: Kristian Hunt --- diff --git a/samples/lmbench.yaml b/samples/lmbench.yaml new file mode 100644 index 000000000..c7526c04c --- /dev/null +++ b/samples/lmbench.yaml @@ -0,0 +1,46 @@ +--- +# Sample benchmark task config file +# measure memory read latency using lmbench + +schema: "yardstick:task:0.1" + +scenarios: +- + type: Lmbench + options: + stride: 64 + stop_size: 32 + + host: demeter.demo + + runner: + type: Arithmetic + name: stride + stop: 128 + step: 64 + + sla: + max_latency: 35 + action: monitor + +context: + name: demo + image: yardstick-trusty-server + flavor: yardstick-flavor + user: ec2-user + + placement_groups: + pgrp1: + policy: "availability" + + servers: + demeter: + floating_ip: true + placement: "pgrp1" + + networks: + test: + cidr: '10.0.1.0/24' + external_network: "net04_ext" + + diff --git a/setup.py b/setup.py index fee8f3c25..48390a3b4 100644 --- a/setup.py +++ b/setup.py @@ -10,6 +10,7 @@ setup( include_package_data=True, package_data={ 'yardstick': [ + 'benchmark/scenarios/compute/*.bash', 'benchmark/scenarios/networking/*.bash', 'benchmark/scenarios/storage/*.bash', 'resources/files/*' diff --git a/yardstick/benchmark/scenarios/compute/__init__.py b/yardstick/benchmark/scenarios/compute/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/yardstick/benchmark/scenarios/compute/lmbench.py b/yardstick/benchmark/scenarios/compute/lmbench.py new file mode 100644 index 000000000..4ce2825c7 --- /dev/null +++ b/yardstick/benchmark/scenarios/compute/lmbench.py @@ -0,0 +1,112 @@ +############################################################################## +# Copyright (c) 2015 Ericsson AB 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 pkg_resources +import logging +import json + +import yardstick.ssh as ssh +from yardstick.benchmark.scenarios import base + +LOG = logging.getLogger(__name__) +LOG.setLevel(logging.DEBUG) + + +class Lmbench(base.Scenario): + """Execute lmbench memory read latency benchmark in a host + + Parameters + stride - number of locations in memory between starts of array elements + type: int + unit: bytes + default: 128 + stop_size - maximum array size to test (minimum value is 0.000512) + type: int + unit: megabytes + default: 16 + + Results are accurate to the ~2-5 nanosecond range. + """ + __scenario_type__ = "Lmbench" + + TARGET_SCRIPT = "lmbench_benchmark.bash" + + def __init__(self, context): + self.context = context + self.setup_done = False + + def setup(self): + """scenario setup""" + self.target_script = pkg_resources.resource_filename( + "yardstick.benchmark.scenarios.compute", + Lmbench.TARGET_SCRIPT) + user = self.context.get("user", "ubuntu") + host = self.context.get("host", None) + key_filename = self.context.get('key_filename', "~/.ssh/id_rsa") + + LOG.debug("user:%s, host:%s", user, host) + self.client = ssh.SSH(user, host, key_filename=key_filename) + self.client.wait(timeout=600) + + # copy script to host + self.client.run("cat > ~/lmbench.sh", + stdin=open(self.target_script, 'rb')) + + self.setup_done = True + + def run(self, args): + """execute the benchmark""" + + if not self.setup_done: + self.setup() + + options = args['options'] + stride = options.get('stride', 128) + stop_size = options.get('stop_size', 16) + + cmd = "sudo bash lmbench.sh %d %d" % (stop_size, stride) + LOG.debug("Executing command: %s", cmd) + status, stdout, stderr = self.client.execute(cmd) + + if status: + raise RuntimeError(stderr) + + data = json.loads(stdout) + + if "sla" in args: + sla_max_latency = int(args['sla']['max_latency']) + for result in data: + latency = result['latency'] + assert latency <= sla_max_latency, "latency %f > " \ + "sla:max_latency(%f)" % (latency, sla_max_latency) + + return data + + +def _test(): + """internal test function""" + key_filename = pkg_resources.resource_filename('yardstick.resources', + 'files/yardstick_key') + ctx = {'host': '172.16.0.137', + 'user': 'ubuntu', + 'key_filename': key_filename + } + + logger = logging.getLogger('yardstick') + logger.setLevel(logging.DEBUG) + + p = Lmbench(ctx) + + options = {'stride': 128, 'stop_size': 16} + + args = {'options': options} + result = p.run(args) + print result + +if __name__ == '__main__': + _test() diff --git a/yardstick/benchmark/scenarios/compute/lmbench_benchmark.bash b/yardstick/benchmark/scenarios/compute/lmbench_benchmark.bash new file mode 100644 index 000000000..04e3c1a9d --- /dev/null +++ b/yardstick/benchmark/scenarios/compute/lmbench_benchmark.bash @@ -0,0 +1,41 @@ +#!/bin/bash + +############################################################################## +# Copyright (c) 2015 Ericsson AB 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 +############################################################################## + +# Run a lmbench read memory latency benchmark in a host and +# outputs in json format the array sizes in megabytes and +# load latency over all points in that array in nanosecods + +set -e + +SIZE=$1 +shift +STRIDE=$1 + +# write the result to stdout in json format +output_json() +{ + iter=0 + echo [ + while read DATA + do + if [ $iter -gt 1 ] && [ -n "$DATA" ]; then + echo , + fi + + echo -n $DATA | awk '/ /{printf "{\"size\": %s, \"latency\": %s}", $1, $2}' + + iter=$((iter+1)) + done + echo ] +} + +/usr/lib/lmbench/bin/x86_64-linux-gnu/lat_mem_rd $SIZE $STRIDE 2>&1 | output_json +