mirror of
https://github.com/ARM-software/workload-automation.git
synced 2025-02-21 20:38:57 +00:00
sysbench workload updates.
- added the ability to run based on time, rather than number of requests. - added a parameter to taskset to specific core(s). Conflicts: wlauto/workloads/sysbench/__init__.py
This commit is contained in:
parent
e422ccc509
commit
62593987f4
@ -20,7 +20,7 @@ import os
|
|||||||
from wlauto import Workload, Parameter, Executable
|
from wlauto import Workload, Parameter, Executable
|
||||||
from wlauto.exceptions import WorkloadError, ConfigError
|
from wlauto.exceptions import WorkloadError, ConfigError
|
||||||
from wlauto.utils.misc import parse_value
|
from wlauto.utils.misc import parse_value
|
||||||
from wlauto.utils.types import boolean, numeric
|
from wlauto.utils.types import numeric
|
||||||
|
|
||||||
|
|
||||||
class Sysbench(Workload):
|
class Sysbench(Workload):
|
||||||
@ -58,8 +58,11 @@ class Sysbench(Workload):
|
|||||||
description='sysbench test to run'),
|
description='sysbench test to run'),
|
||||||
Parameter('num_threads', kind=int, default=8,
|
Parameter('num_threads', kind=int, default=8,
|
||||||
description='The number of threads sysbench will launch'),
|
description='The number of threads sysbench will launch'),
|
||||||
Parameter('max_requests', kind=int, default=2000,
|
Parameter('max_requests', kind=int, default=None,
|
||||||
description='The limit for the total number of requests'),
|
description='The limit for the total number of requests.'),
|
||||||
|
Parameter('max_time', kind=int, default=None,
|
||||||
|
description='''The limit for the total execution time. If neither this nor
|
||||||
|
``max_requests`` is specified, this will default to 30 seconds.'''),
|
||||||
Parameter('file_test_mode', default=None,
|
Parameter('file_test_mode', default=None,
|
||||||
allowed_values=['seqwr', 'seqrewr', 'seqrd', 'rndrd', 'rndwr', 'rndrw'],
|
allowed_values=['seqwr', 'seqrewr', 'seqrd', 'rndrd', 'rndwr', 'rndrw'],
|
||||||
description='File test mode to use. This should only be specified if ``test`` is '
|
description='File test mode to use. This should only be specified if ``test`` is '
|
||||||
@ -67,13 +70,16 @@ class Sysbench(Workload):
|
|||||||
'it will default to ``"seqwr"`` (please see sysbench documentation for '
|
'it will default to ``"seqwr"`` (please see sysbench documentation for '
|
||||||
'explanation of various modes).'),
|
'explanation of various modes).'),
|
||||||
Parameter('cmd_params', kind=str, default='',
|
Parameter('cmd_params', kind=str, default='',
|
||||||
description='Additional parameters to be passed to sysbench as a single string'),
|
description='Additional parameters to be passed to sysbench as a single stiring'),
|
||||||
Parameter('force_install', kind=boolean, default=True,
|
Parameter('force_install', kind=bool, default=True,
|
||||||
description='Always install the sysbench binary found on the host, even if'
|
description='Always install binary found on the host, even if already installed on device'),
|
||||||
'it is already installed on device'),
|
Parameter('taskset_mask', kind=int, default=0,
|
||||||
|
description='Always install binary found on the host, even if already installed on device'),
|
||||||
]
|
]
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
|
if (self.max_requests is None) and (self.max_time is None):
|
||||||
|
self.max_time = 30
|
||||||
if self.test == 'fileio' and not self.file_test_mode:
|
if self.test == 'fileio' and not self.file_test_mode:
|
||||||
self.logger.debug('Test is "fileio" and no file_test_mode specified -- using default.')
|
self.logger.debug('Test is "fileio" and no file_test_mode specified -- using default.')
|
||||||
self.file_test_mode = 'seqwr'
|
self.file_test_mode = 'seqwr'
|
||||||
@ -84,9 +90,13 @@ class Sysbench(Workload):
|
|||||||
self.on_host_binary = context.resolver.get(Executable(self, 'armeabi', 'sysbench'), strict=False)
|
self.on_host_binary = context.resolver.get(Executable(self, 'armeabi', 'sysbench'), strict=False)
|
||||||
|
|
||||||
def setup(self, context):
|
def setup(self, context):
|
||||||
self.command = self._build_command(test=self.test,
|
params = dict(test=self.test,
|
||||||
num_threads=self.num_threads,
|
num_threads=self.num_threads)
|
||||||
max_requests=self.max_requests)
|
if self.max_requests:
|
||||||
|
params['max_requests'] = self.max_requests
|
||||||
|
if self.max_time:
|
||||||
|
params['max_time'] = self.max_time
|
||||||
|
self.command = self._build_command(**params)
|
||||||
self.results_file = self.device.path.join(self.device.working_directory, 'sysbench_result.txt')
|
self.results_file = self.device.path.join(self.device.working_directory, 'sysbench_result.txt')
|
||||||
self._check_executable()
|
self._check_executable()
|
||||||
|
|
||||||
@ -99,11 +109,14 @@ class Sysbench(Workload):
|
|||||||
context.add_iteration_artifact('sysbench_output', kind='raw', path=host_results_file)
|
context.add_iteration_artifact('sysbench_output', kind='raw', path=host_results_file)
|
||||||
|
|
||||||
with open(host_results_file) as fh:
|
with open(host_results_file) as fh:
|
||||||
|
find_line_with('General statistics:', fh)
|
||||||
|
extract_metric('total time', fh.next(), context.result)
|
||||||
|
extract_metric('total number of events', fh.next(), context.result, lower_is_better=False)
|
||||||
find_line_with('response time:', fh)
|
find_line_with('response time:', fh)
|
||||||
extract_response_time_metric('min', fh.next(), context.result)
|
extract_metric('min', fh.next(), context.result, 'response time ')
|
||||||
extract_response_time_metric('avg', fh.next(), context.result)
|
extract_metric('avg', fh.next(), context.result, 'response time ')
|
||||||
extract_response_time_metric('max', fh.next(), context.result)
|
extract_metric('max', fh.next(), context.result, 'response time ')
|
||||||
extract_response_time_metric('approx. 95 percentile', fh.next(), context.result)
|
extract_metric('approx. 95 percentile', fh.next(), context.result)
|
||||||
find_line_with('Threads fairness:', fh)
|
find_line_with('Threads fairness:', fh)
|
||||||
extract_threads_fairness_metric('events', fh.next(), context.result)
|
extract_threads_fairness_metric('events', fh.next(), context.result)
|
||||||
extract_threads_fairness_metric('execution time', fh.next(), context.result)
|
extract_threads_fairness_metric('execution time', fh.next(), context.result)
|
||||||
@ -125,7 +138,11 @@ class Sysbench(Workload):
|
|||||||
if self.file_test_mode:
|
if self.file_test_mode:
|
||||||
param_strings.append('--file-test-mode={}'.format(self.file_test_mode))
|
param_strings.append('--file-test-mode={}'.format(self.file_test_mode))
|
||||||
sysbench_command = 'sysbench {} {} run'.format(' '.join(param_strings), self.cmd_params)
|
sysbench_command = 'sysbench {} {} run'.format(' '.join(param_strings), self.cmd_params)
|
||||||
return 'cd {} && {} > sysbench_result.txt'.format(self.device.working_directory, sysbench_command)
|
if self.taskset_mask:
|
||||||
|
taskset_string = 'busybox taskset 0x{:x} '.format(self.taskset_mask)
|
||||||
|
else:
|
||||||
|
taskset_string = ''
|
||||||
|
return 'cd {} && {} {} > sysbench_result.txt'.format(self.device.working_directory, taskset_string, sysbench_command)
|
||||||
|
|
||||||
|
|
||||||
# Utility functions
|
# Utility functions
|
||||||
@ -138,7 +155,7 @@ def find_line_with(text, fh):
|
|||||||
raise WorkloadError(message.format(fh.name, text))
|
raise WorkloadError(message.format(fh.name, text))
|
||||||
|
|
||||||
|
|
||||||
def extract_response_time_metric(metric, line, result):
|
def extract_metric(metric, line, result, prefix='', lower_is_better=True):
|
||||||
try:
|
try:
|
||||||
name, value_part = [part.strip() for part in line.split(':')]
|
name, value_part = [part.strip() for part in line.split(':')]
|
||||||
if name != metric:
|
if name != metric:
|
||||||
@ -151,11 +168,11 @@ def extract_response_time_metric(metric, line, result):
|
|||||||
raise WorkloadError('Could not parse value "{}"'.format(value_part))
|
raise WorkloadError('Could not parse value "{}"'.format(value_part))
|
||||||
value = numeric(value_part[:idx])
|
value = numeric(value_part[:idx])
|
||||||
units = value_part[idx:]
|
units = value_part[idx:]
|
||||||
result.add_metric('response time ' + metric,
|
result.add_metric(prefix + metric,
|
||||||
value, units, lower_is_better=True)
|
value, units, lower_is_better=lower_is_better)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
message = 'Could not extract sysbench metric "{}"; got "{}"'
|
message = 'Could not extract sysbench metric "{}"; got "{}"'
|
||||||
raise WorkloadError(message.format(metric, e))
|
raise WorkloadError(message.format(prefix + metric, e))
|
||||||
|
|
||||||
|
|
||||||
def extract_threads_fairness_metric(metric, line, result):
|
def extract_threads_fairness_metric(metric, line, result):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user