perfkitbenchmarker/linux_benchmarks/cloudsuite_data_serving_benchmark.py (168 lines of code) (raw):
# Copyright 2016 PerfKitBenchmarker Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Runs the data_serving benchmark of Cloudsuite.
More info: http://cloudsuite.ch/dataserving/
"""
import re
from absl import flags
from perfkitbenchmarker import background_tasks
from perfkitbenchmarker import configs
from perfkitbenchmarker import errors
from perfkitbenchmarker import sample
from perfkitbenchmarker.linux_packages import docker
FLAGS = flags.FLAGS
flags.DEFINE_integer(
'cloudsuite_data_serving_rec_count',
1000,
'Record count in the database.',
lower_bound=1,
)
flags.DEFINE_integer(
'cloudsuite_data_serving_op_count',
1000,
'Operation count to be executed.',
lower_bound=1,
)
BENCHMARK_NAME = 'cloudsuite_data_serving'
BENCHMARK_CONFIG = """
cloudsuite_data_serving:
description: >
Run YCSB client against Cassandra servers.
Specify record count and operation count with
--cloudsuite_data_serving_rec_count and
--cloudsuite_data_serving_op_count.
vm_groups:
server_seed:
vm_spec: *default_dual_core
vm_count: 1
servers:
vm_spec: *default_dual_core
vm_count: 1
client:
vm_spec: *default_dual_core
vm_count: 1
"""
def GetConfig(user_config):
return configs.LoadConfig(BENCHMARK_CONFIG, user_config, BENCHMARK_NAME)
def Prepare(benchmark_spec):
"""Prepare docker containers and set the dataset up.
Install docker. Pull the required images from DockerHub.
Create a table into server-seed and load the dataset.
Args:
benchmark_spec: The benchmark specification. Contains all data that is
required to run the benchmark.
"""
server_seed = benchmark_spec.vm_groups['server_seed'][0]
servers = benchmark_spec.vm_groups['servers']
client = benchmark_spec.vm_groups['client'][0]
def PrepareCommon(vm):
if not docker.IsInstalled(vm):
vm.Install('docker')
def PrepareServerSeed(vm):
PrepareCommon(vm)
vm.Install('cloudsuite/data-serving:server')
vm.RemoteCommand(
'sudo docker run -d --name cassandra-server-seed '
'--net host cloudsuite/data-serving:server'
)
def PrepareServer(vm):
PrepareCommon(vm)
vm.Install('cloudsuite/data-serving:server')
start_server_cmd = (
'sudo docker run -d --name cassandra-server '
'-e CASSANDRA_SEEDS=%s --net host '
'cloudsuite/data-serving:server'
% server_seed.internal_ip
)
vm.RemoteCommand(start_server_cmd)
def PrepareClient(vm):
PrepareCommon(vm)
vm.Install('cloudsuite/data-serving:client')
target_arg_tuples = (
[(PrepareServerSeed, [server_seed], {})]
+ [(PrepareServer, [vm], {}) for vm in servers]
+ [(PrepareClient, [client], {})]
)
background_tasks.RunParallelThreads(target_arg_tuples, len(target_arg_tuples))
def Run(benchmark_spec):
"""Run the data_serving benchmark.
Args:
benchmark_spec: The benchmark specification. Contains all data that is
required to run the benchmark.
Returns:
A list of sample.Sample objects.
"""
server_seed = benchmark_spec.vm_groups['server_seed'][0]
servers = benchmark_spec.vm_groups['servers']
client = benchmark_spec.vm_groups['client'][0]
results = []
server_ips_arr = []
server_ips_arr.append(server_seed.internal_ip)
for vm in servers:
server_ips_arr.append(vm.internal_ip)
server_ips = ','.join(server_ips_arr)
rec_count_cfg = '-e RECORDCOUNT=%d' % FLAGS.cloudsuite_data_serving_rec_count
op_count_cfg = '-e OPERATIONCOUNT=%d' % FLAGS.cloudsuite_data_serving_op_count
benchmark_cmd = (
'sudo docker run %s %s --rm --name cassandra-client'
' --net host cloudsuite/data-serving:client %s'
% (rec_count_cfg, op_count_cfg, server_ips)
)
stdout, _ = client.RemoteCommand(benchmark_cmd)
def GetResults(match_str, result_label, result_metric):
matches = re.findall(match_str, stdout)
if len(matches) != 1:
raise errors.Benchmarks.RunError(
'Expected to find result label: %s' % result_label
)
results.append(
sample.Sample(result_label, float(matches[0]), result_metric)
)
GetResults(r'\[OVERALL\], RunTime\(ms\), (\d+.?\d*)', 'OVERALL RunTime', 'ms')
GetResults(
r'\[OVERALL\], Throughput\(ops\/sec\), (\d+.?\d*)',
'OVERALL Throughput',
'ops/sec',
)
GetResults(
r'\[CLEANUP\], Operations, (\d+.?\d*)', 'CLEANUP Operations', 'ops'
)
GetResults(
r'\[CLEANUP\], AverageLatency\(us\), (\d+.?\d*)',
'CLEANUP AverageLatency',
'us',
)
GetResults(
r'\[CLEANUP\], MinLatency\(us\), (\d+.?\d*)', 'CLEANUP MinLatency', 'us'
)
GetResults(
r'\[CLEANUP\], MaxLatency\(us\), (\d+.?\d*)', 'CLEANUP MaxLatency', 'us'
)
GetResults(
r'\[CLEANUP\], 95thPercentileLatency\(ms\), (\d+.?\d*)',
'CLEANUP 95thPercentileLatency',
'ms',
)
GetResults(
r'\[CLEANUP\], 99thPercentileLatency\(ms\), (\d+.?\d*)',
'CLEANUP 99thPercentileLatency',
'ms',
)
GetResults(r'\[READ\], Operations, (\d+.?\d*)', 'READ Operations', 'ops')
GetResults(
r'\[READ\], AverageLatency\(us\), (\d+.?\d*)', 'READ AverageLatency', 'us'
)
GetResults(r'\[READ\], MinLatency\(us\), (\d+.?\d*)', 'READ MinLatency', 'us')
GetResults(r'\[READ\], MaxLatency\(us\), (\d+.?\d*)', 'READ MaxLatency', 'us')
GetResults(
r'\[READ\], 95thPercentileLatency\(ms\), (\d+.?\d*)',
'READ 95thPercentileLatency',
'ms',
)
GetResults(
r'\[READ\], 99thPercentileLatency\(ms\), (\d+.?\d*)',
'READ 99thPercentileLatency',
'ms',
)
GetResults(r'\[UPDATE\], Operations, (\d+.?\d*)', 'UPDATE Operations', 'us')
GetResults(
r'\[UPDATE\], AverageLatency\(us\), (\d+.?\d*)',
'UPDATE AverageLatency',
'us',
)
GetResults(
r'\[UPDATE\], MinLatency\(us\), (\d+.?\d*)', 'UPDATE MinLatency', 'us'
)
GetResults(
r'\[UPDATE\], MaxLatency\(us\), (\d+.?\d*)', 'UPDATE MaxLatency', 'us'
)
GetResults(
r'\[UPDATE\], 95thPercentileLatency\(ms\), (\d+.?\d*)',
'UPDATE 95thPercentileLatency',
'ms',
)
GetResults(
r'\[UPDATE\], 99thPercentileLatency\(ms\), (\d+.?\d*)',
'UPDATE 99thPercentileLatency',
'ms',
)
return results
def Cleanup(benchmark_spec):
"""Stop and remove docker containers. Remove images.
Args:
benchmark_spec: The benchmark specification. Contains all data that is
required to run the benchmark.
"""
server_seed = benchmark_spec.vm_groups['server_seed'][0]
servers = benchmark_spec.vm_groups['servers']
def CleanupServerCommon(vm):
vm.RemoteCommand('sudo docker rm cassandra-server')
def CleanupServerSeed(vm):
vm.RemoteCommand('sudo docker stop cassandra-server-seed')
CleanupServerCommon(vm)
def CleanupServer(vm):
vm.RemoteCommand('sudo docker stop cassandra-server')
CleanupServerCommon(vm)
target_arg_tuples = [(CleanupServerSeed, [server_seed], {})] + [
(CleanupServer, [vm], {}) for vm in servers
]
background_tasks.RunParallelThreads(target_arg_tuples, len(target_arg_tuples))