From 64ea15bcf107d5c160f6dbf366b6e6d9e7c23990 Mon Sep 17 00:00:00 2001 From: filipecosta90 Date: Fri, 7 Jan 2022 12:31:48 +0000 Subject: [PATCH] Enabled per module configuration parameters --- pyproject.toml | 2 +- redisbench_admin/commands/__init__.py | 5 ++ redisbench_admin/commands/commands.json.py | 5 ++ redisbench_admin/environments/oss_cluster.py | 27 +++++------ .../environments/oss_standalone.py | 32 +++++++------ redisbench_admin/run/cluster.py | 2 + redisbench_admin/run/run.py | 2 +- redisbench_admin/run_local/local_db.py | 3 ++ redisbench_admin/run_remote/remote_db.py | 3 ++ redisbench_admin/run_remote/standalone.py | 28 +++++++++-- redisbench_admin/utils/benchmark_config.py | 10 ++++ redisbench_admin/utils/utils.py | 30 ++++++++++++ tests/test_benchmark_config.py | 23 ++++++++++ .../tsbs-scale100-cpu-max-all-1@4139rps.yml | 46 +++++++++++++++++++ tests/test_local.py | 22 +++++++++ tests/test_standalone.py | 13 ++++++ 16 files changed, 220 insertions(+), 33 deletions(-) create mode 100644 redisbench_admin/commands/__init__.py create mode 100644 redisbench_admin/commands/commands.json.py create mode 100644 tests/test_data/tsbs-scale100-cpu-max-all-1@4139rps.yml diff --git a/pyproject.toml b/pyproject.toml index e417659..f01bd1b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "redisbench-admin" -version = "0.6.8" +version = "0.6.9" description = "Redis benchmark run helper. A wrapper around Redis and Redis Modules benchmark tools ( ftsb_redisearch, memtier_benchmark, redis-benchmark, aibench, etc... )." authors = ["filipecosta90 ","Redis Performance Group "] readme = "README.md" diff --git a/redisbench_admin/commands/__init__.py b/redisbench_admin/commands/__init__.py new file mode 100644 index 0000000..eab2fdf --- /dev/null +++ b/redisbench_admin/commands/__init__.py @@ -0,0 +1,5 @@ +# BSD 3-Clause License +# +# Copyright (c) 2022., Redis Labs Modules +# All rights reserved. +# diff --git a/redisbench_admin/commands/commands.json.py b/redisbench_admin/commands/commands.json.py new file mode 100644 index 0000000..eab2fdf --- /dev/null +++ b/redisbench_admin/commands/commands.json.py @@ -0,0 +1,5 @@ +# BSD 3-Clause License +# +# Copyright (c) 2022., Redis Labs Modules +# All rights reserved. +# diff --git a/redisbench_admin/environments/oss_cluster.py b/redisbench_admin/environments/oss_cluster.py index 26f2e4a..1c417b1 100644 --- a/redisbench_admin/environments/oss_cluster.py +++ b/redisbench_admin/environments/oss_cluster.py @@ -4,13 +4,12 @@ # All rights reserved. # import logging -import os import subprocess from time import sleep import redis -from redisbench_admin.utils.utils import wait_for_conn +from redisbench_admin.utils.utils import wait_for_conn, redis_server_config_module_part def spin_up_local_redis_cluster( @@ -21,6 +20,7 @@ def spin_up_local_redis_cluster( local_module_file, configuration_parameters=None, dataset_load_timeout_secs=60, + modules_configuration_parameters_map={}, ): redis_processes = [] redis_conns = [] @@ -29,7 +29,13 @@ def spin_up_local_redis_cluster( shard_port = master_shard_id + start_port - 1 command = generate_cluster_redis_server_args( - dbdir, local_module_file, ip, shard_port, configuration_parameters, "no" + dbdir, + local_module_file, + ip, + shard_port, + configuration_parameters, + "no", + modules_configuration_parameters_map, ) logging.info( @@ -132,6 +138,7 @@ def generate_cluster_redis_server_args( port, configuration_parameters=None, daemonize="yes", + modules_configuration_parameters_map={}, ): # start redis-server command = [ @@ -171,19 +178,13 @@ def generate_cluster_redis_server_args( ) if local_module_file is not None: if type(local_module_file) == str: - command.extend( - [ - "--loadmodule", - os.path.abspath(local_module_file), - ] + redis_server_config_module_part( + command, local_module_file, modules_configuration_parameters_map ) if type(local_module_file) == list: for mod in local_module_file: - command.extend( - [ - "--loadmodule", - os.path.abspath(mod), - ] + redis_server_config_module_part( + command, mod, modules_configuration_parameters_map ) return command diff --git a/redisbench_admin/environments/oss_standalone.py b/redisbench_admin/environments/oss_standalone.py index 5434197..21ad369 100644 --- a/redisbench_admin/environments/oss_standalone.py +++ b/redisbench_admin/environments/oss_standalone.py @@ -4,12 +4,11 @@ # All rights reserved. # import logging -import os import subprocess import redis -from redisbench_admin.utils.utils import wait_for_conn +from redisbench_admin.utils.utils import wait_for_conn, redis_server_config_module_part def spin_up_local_redis( @@ -20,9 +19,15 @@ def spin_up_local_redis( configuration_parameters=None, dbdir_folder=None, dataset_load_timeout_secs=120, + modules_configuration_parameters_map={}, ): command = generate_standalone_redis_server_args( - binary, dbdir, local_module_files, port, configuration_parameters + binary, + dbdir, + local_module_files, + port, + configuration_parameters, + modules_configuration_parameters_map, ) logging.info( @@ -38,7 +43,12 @@ def spin_up_local_redis( def generate_standalone_redis_server_args( - binary, dbdir, local_module_files, port, configuration_parameters=None + binary, + dbdir, + local_module_files, + port, + configuration_parameters=None, + modules_configuration_parameters_map={}, ): # start redis-server command = [ @@ -60,18 +70,12 @@ def generate_standalone_redis_server_args( ) if local_module_files is not None: if type(local_module_files) == str: - command.extend( - [ - "--loadmodule", - os.path.abspath(local_module_files), - ] + redis_server_config_module_part( + command, local_module_files, modules_configuration_parameters_map ) if type(local_module_files) == list: for mod in local_module_files: - command.extend( - [ - "--loadmodule", - os.path.abspath(mod), - ] + redis_server_config_module_part( + command, mod, modules_configuration_parameters_map ) return command diff --git a/redisbench_admin/run/cluster.py b/redisbench_admin/run/cluster.py index 1817d91..3f2510c 100644 --- a/redisbench_admin/run/cluster.py +++ b/redisbench_admin/run/cluster.py @@ -111,6 +111,7 @@ def spin_up_redis_cluster_remote_redis( shard_count, start_port, ssh_port, + modules_configuration_parameters_map, ): logging.info("Generating the remote redis-server command arguments") redis_process_commands = [] @@ -123,6 +124,7 @@ def spin_up_redis_cluster_remote_redis( server_private_ip, shard_port, redis_configuration_parameters, + modules_configuration_parameters_map, ) logging.error( "Remote primary shard {} command: {}".format( diff --git a/redisbench_admin/run/run.py b/redisbench_admin/run/run.py index 2001f66..e30bdf1 100644 --- a/redisbench_admin/run/run.py +++ b/redisbench_admin/run/run.py @@ -42,7 +42,7 @@ def define_benchmark_plan(benchmark_definitions, default_specs): benchmark_runs_plan[benchmark_type] = {} # extract dataset-name - dbconfig_present, dataset_name, _, _ = extract_redis_dbconfig_parameters( + dbconfig_present, dataset_name, _, _, _ = extract_redis_dbconfig_parameters( benchmark_config, "dbconfig" ) if dataset_name is None: diff --git a/redisbench_admin/run_local/local_db.py b/redisbench_admin/run_local/local_db.py index 247a188..364ad76 100644 --- a/redisbench_admin/run_local/local_db.py +++ b/redisbench_admin/run_local/local_db.py @@ -68,6 +68,7 @@ def local_db_spin( _, redis_configuration_parameters, dataset_load_timeout_secs, + modules_configuration_parameters_map, ) = extract_redis_dbconfig_parameters(benchmark_config, "dbconfig") cluster_api_enabled = False logging.info( @@ -85,6 +86,7 @@ def local_db_spin( local_module_file, redis_configuration_parameters, dataset_load_timeout_secs, + modules_configuration_parameters_map, ) status = setup_redis_cluster_from_conns( @@ -111,6 +113,7 @@ def local_db_spin( redis_configuration_parameters, dbdir_folder, dataset_load_timeout_secs, + modules_configuration_parameters_map, ) r = redis.StrictRedis(port=args.port) diff --git a/redisbench_admin/run_remote/remote_db.py b/redisbench_admin/run_remote/remote_db.py index 4cf853d..dfb3cdf 100644 --- a/redisbench_admin/run_remote/remote_db.py +++ b/redisbench_admin/run_remote/remote_db.py @@ -90,6 +90,7 @@ def remote_db_spin( _, redis_configuration_parameters, dataset_load_timeout_secs, + modules_configuration_parameters_map, ) = extract_redis_dbconfig_parameters(benchmark_config, "dbconfig") cluster_start_port = 20000 @@ -129,6 +130,7 @@ def remote_db_spin( shard_count, cluster_start_port, db_ssh_port, + modules_configuration_parameters_map, ) for p in range(cluster_start_port, cluster_start_port + shard_count): @@ -153,6 +155,7 @@ def remote_db_spin( logname, redis_configuration_parameters, db_ssh_port, + modules_configuration_parameters_map, ) full_logfiles.append(full_logfile) local_redis_conn, ssh_tunnel = ssh_tunnel_redisconn( diff --git a/redisbench_admin/run_remote/standalone.py b/redisbench_admin/run_remote/standalone.py index 1c299af..17f846e 100644 --- a/redisbench_admin/run_remote/standalone.py +++ b/redisbench_admin/run_remote/standalone.py @@ -12,6 +12,7 @@ execute_remote_commands, ) from redisbench_admin.utils.ssh import SSHSession +from redisbench_admin.utils.utils import redis_server_config_module_part def spin_up_standalone_remote_redis( @@ -23,10 +24,15 @@ def spin_up_standalone_remote_redis( logfile, redis_configuration_parameters=None, port=22, + modules_configuration_parameters_map={}, ): full_logfile, initial_redis_cmd = generate_remote_standalone_redis_cmd( - logfile, redis_configuration_parameters, remote_module_files, temporary_dir + logfile, + redis_configuration_parameters, + remote_module_files, + temporary_dir, + modules_configuration_parameters_map, ) # start redis-server @@ -84,7 +90,11 @@ def remote_module_files_cp( def generate_remote_standalone_redis_cmd( - logfile, redis_configuration_parameters, remote_module_files, temporary_dir + logfile, + redis_configuration_parameters, + remote_module_files, + temporary_dir, + modules_configuration_parameters_map, ): initial_redis_cmd = 'redis-server --save "" --logfile {} --dir {} --daemonize yes --protected-mode no'.format( logfile, temporary_dir @@ -98,7 +108,17 @@ def generate_remote_standalone_redis_cmd( initial_redis_cmd += " --{} {}".format( configuration_parameter, configuration_value ) + command = [] + if remote_module_files is not None: + if type(remote_module_files) == str: + redis_server_config_module_part( + command, remote_module_files, modules_configuration_parameters_map + ) + if type(remote_module_files) == list: + for mod in remote_module_files: + redis_server_config_module_part( + command, mod, modules_configuration_parameters_map + ) if remote_module_files is not None: - for remote_module_file in remote_module_files: - initial_redis_cmd += " --loadmodule {}".format(remote_module_file) + initial_redis_cmd += " ".join(command) return full_logfile, initial_redis_cmd diff --git a/redisbench_admin/utils/benchmark_config.py b/redisbench_admin/utils/benchmark_config.py index f835053..67996a4 100644 --- a/redisbench_admin/utils/benchmark_config.py +++ b/redisbench_admin/utils/benchmark_config.py @@ -173,6 +173,7 @@ def merge_default_and_specific_properties_dict_type( def extract_redis_dbconfig_parameters(benchmark_config, dbconfig_keyname): redis_configuration_parameters = {} + modules_configuration_parameters_map = {} dataset_load_timeout_secs = 120 dataset_name = None dbconfig_present = False @@ -180,6 +181,10 @@ def extract_redis_dbconfig_parameters(benchmark_config, dbconfig_keyname): dbconfig_present = True if type(benchmark_config[dbconfig_keyname]) == list: for k in benchmark_config[dbconfig_keyname]: + if "module-configuration-parameters" in k: + modules_configuration_parameters_map = k[ + "module-configuration-parameters" + ] if "configuration-parameters" in k: cp = k["configuration-parameters"] for item in cp: @@ -190,6 +195,10 @@ def extract_redis_dbconfig_parameters(benchmark_config, dbconfig_keyname): if "dataset_name" in k: dataset_name = k["dataset_name"] if type(benchmark_config[dbconfig_keyname]) == dict: + if "module-configuration-parameters" in benchmark_config[dbconfig_keyname]: + modules_configuration_parameters_map = benchmark_config[ + dbconfig_keyname + ]["module-configuration-parameters"] if "configuration-parameters" in benchmark_config[dbconfig_keyname]: cp = benchmark_config[dbconfig_keyname]["configuration-parameters"] for k, v in cp.items(): @@ -204,6 +213,7 @@ def extract_redis_dbconfig_parameters(benchmark_config, dbconfig_keyname): dataset_name, redis_configuration_parameters, dataset_load_timeout_secs, + modules_configuration_parameters_map, ) diff --git a/redisbench_admin/utils/utils.py b/redisbench_admin/utils/utils.py index 9d304bc..6a071bc 100644 --- a/redisbench_admin/utils/utils.py +++ b/redisbench_admin/utils/utils.py @@ -25,6 +25,36 @@ EPOCH = dt.datetime.utcfromtimestamp(0) +def redis_server_config_module_part( + command, local_module_file, modules_configuration_parameters_map +): + command.extend( + [ + "--loadmodule", + os.path.abspath(local_module_file), + ] + ) + for ( + module_config_modulename, + module_config_dict, + ) in modules_configuration_parameters_map.items(): + if module_config_modulename in local_module_file: + for ( + module_config_parameter_name, + module_config_parameter_value, + ) in module_config_dict.items(): + if type(module_config_parameter_value) != str: + module_config_parameter_value = "{}".format( + module_config_parameter_value + ) + command.extend( + [ + module_config_parameter_name, + module_config_parameter_value, + ] + ) + + def upload_artifacts_to_s3( artifacts, s3_bucket_name, diff --git a/tests/test_benchmark_config.py b/tests/test_benchmark_config.py index f867282..34753c0 100644 --- a/tests/test_benchmark_config.py +++ b/tests/test_benchmark_config.py @@ -56,8 +56,10 @@ def test_extract_redis_configuration_parameters(): _, redis_configuration_parameters, dataset_load_timeout_secs, + modules_configuration_parameters_map, ) = extract_redis_dbconfig_parameters(benchmark_config, "dbconfig") assert redis_configuration_parameters == {} + assert modules_configuration_parameters_map == {} assert dataset_load_timeout_secs == 120 assert dbconfig_present == False @@ -70,8 +72,10 @@ def test_extract_redis_configuration_parameters(): _, redis_configuration_parameters, dataset_load_timeout_secs, + modules_configuration_parameters_map, ) = extract_redis_dbconfig_parameters(benchmark_config, "dbconfig") assert dataset_load_timeout_secs == 120 + assert modules_configuration_parameters_map == {} assert dbconfig_present == True assert redis_configuration_parameters == { "notify-keyspace-events": "KEA", @@ -87,6 +91,25 @@ def test_extract_redis_configuration_parameters(): _, redis_configuration_parameters, dataset_load_timeout_secs, + modules_configuration_parameters_map, ) = extract_redis_dbconfig_parameters(benchmark_config, "dbconfig") assert dataset_load_timeout_secs == 1200 + assert modules_configuration_parameters_map == {} + assert dbconfig_present == True + + with open( + "./tests/test_data/tsbs-scale100-cpu-max-all-1@4139rps.yml", "r" + ) as config_fd: + benchmark_config = yaml.safe_load(config_fd) + ( + dbconfig_present, + _, + redis_configuration_parameters, + dataset_load_timeout_secs, + modules_configuration_parameters_map, + ) = extract_redis_dbconfig_parameters(benchmark_config, "dbconfig") + assert dataset_load_timeout_secs == 120 + assert modules_configuration_parameters_map == { + "redistimeseries": {"CHUNK_SIZE_BYTES": 128} + } assert dbconfig_present == True diff --git a/tests/test_data/tsbs-scale100-cpu-max-all-1@4139rps.yml b/tests/test_data/tsbs-scale100-cpu-max-all-1@4139rps.yml new file mode 100644 index 0000000..a0bf33a --- /dev/null +++ b/tests/test_data/tsbs-scale100-cpu-max-all-1@4139rps.yml @@ -0,0 +1,46 @@ +version: 0.5 +name: "tsbs-scale100-cpu-max-all-1@4139rps" + +metadata: + labels: + test_type: query + includes_targets: "true" + +remote: + - type: oss-standalone + - setup: redistimeseries-m5 + +setups: + - oss-cluster-05-primaries + - oss-cluster-15-primaries + - oss-cluster-30-primaries + +dbconfig: + - dataset_name: "data_redistimeseries_cpu-only_100" + - tool: tsbs_load_redistimeseries + - parameters: + - file: "https://s3.amazonaws.com/benchmarks.redislabs/redistimeseries/tsbs/datasets/devops/scale100/data_redistimeseries_cpu-only_100.dat" + - check: + keyspacelen: 1000 + - module-configuration-parameters: + redistimeseries: + CHUNK_SIZE_BYTES: 128 + +clientconfig: + - benchmark_type: "read-only" + - tool: tsbs_run_queries_redistimeseries + - parameters: + - workers: 32 + - max-rps: 4139 + - print-interval: 2500 + - file: "https://s3.amazonaws.com/benchmarks.redislabs/redistimeseries/tsbs/queries/devops/scale100/devops-scale100-4days/queries_cpu-only_redistimeseries_100_cpu-max-all-1_1000000.dat" + +exporter: + redistimeseries: + metrics: + - "$.Totals.overallQuantiles.all_queries.q50": + "target-1": 7.18 + "target-2": 8.31 + - "$.Totals.overallQueryRates.all_queries": + "target-1": 4139 + "target-2": 4139 diff --git a/tests/test_local.py b/tests/test_local.py index 4fd6569..5a68d04 100644 --- a/tests/test_local.py +++ b/tests/test_local.py @@ -67,6 +67,28 @@ def test_generate_standalone_redis_server_args(): "--loadmodule", os.path.abspath(local_module_file), ] + + cmd = generate_standalone_redis_server_args( + "redis-server", + ".", + local_module_file, + "1010", + {"m1": {"CHUNK_SIZE_BYTES": 128}}, + ) + assert cmd == [ + "redis-server", + "--save", + '""', + "--port", + "1010", + "--dir", + ".", + "--loadmodule", + os.path.abspath(local_module_file), + "CHUNK_SIZE_BYTES", + "128", + ] + cmd = generate_standalone_redis_server_args( "redis-server", ".", None, "9999", {"notify-keyspace-events": "KEA"} ) diff --git a/tests/test_standalone.py b/tests/test_standalone.py index 9910fa1..6d6e1c8 100644 --- a/tests/test_standalone.py +++ b/tests/test_standalone.py @@ -12,6 +12,7 @@ from redisbench_admin.run_remote.standalone import ( spin_up_standalone_remote_redis, + generate_remote_standalone_redis_cmd, ) @@ -64,3 +65,15 @@ def test_spin_up_standalone_remote_redis(): None, port, ) + + +def test_generate_remote_standalone_redis_cmd(): + modules_configuration_parameters_map = {"m1": {"CHUNK_SIZE_BYTES": 128}} + full_logfile, initial_redis_cmd = generate_remote_standalone_redis_cmd( + "log1", + None, + ["m1.so"], + ".", + modules_configuration_parameters_map, + ) + assert initial_redis_cmd.endswith("m1.so CHUNK_SIZE_BYTES 128")