summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristian Hunt <kristian.hunt@gmail.com>2015-07-21 14:29:10 +0200
committerKristian Hunt <kristian.hunt@gmail.com>2015-08-13 14:43:33 +0200
commitf08252e8327c5b5625845ee44866dff1a7f7c16f (patch)
treebfd70de191810091caf6c2f5f37907a6910e0cae
parentab4371757c7223d59dddc7bece1d3afa4dc3814b (diff)
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 <kristian.hunt@gmail.com>
-rw-r--r--samples/lmbench.yaml46
-rw-r--r--setup.py1
-rw-r--r--yardstick/benchmark/scenarios/compute/__init__.py0
-rw-r--r--yardstick/benchmark/scenarios/compute/lmbench.py112
-rw-r--r--yardstick/benchmark/scenarios/compute/lmbench_benchmark.bash41
5 files changed, 200 insertions, 0 deletions
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
--- /dev/null
+++ b/yardstick/benchmark/scenarios/compute/__init__.py
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
+