redis-benchmarks-specification 0.1.280__py3-none-any.whl → 0.1.282__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of redis-benchmarks-specification might be problematic. Click here for more details.
- redis_benchmarks_specification/__common__/timeseries.py +14 -3
- redis_benchmarks_specification/__compare__/args.py +24 -0
- redis_benchmarks_specification/__compare__/compare.py +161 -59
- redis_benchmarks_specification/__runner__/args.py +9 -3
- redis_benchmarks_specification/__runner__/remote_profiling.py +118 -81
- redis_benchmarks_specification/__runner__/runner.py +190 -76
- {redis_benchmarks_specification-0.1.280.dist-info → redis_benchmarks_specification-0.1.282.dist-info}/METADATA +1 -1
- {redis_benchmarks_specification-0.1.280.dist-info → redis_benchmarks_specification-0.1.282.dist-info}/RECORD +11 -11
- {redis_benchmarks_specification-0.1.280.dist-info → redis_benchmarks_specification-0.1.282.dist-info}/LICENSE +0 -0
- {redis_benchmarks_specification-0.1.280.dist-info → redis_benchmarks_specification-0.1.282.dist-info}/WHEEL +0 -0
- {redis_benchmarks_specification-0.1.280.dist-info → redis_benchmarks_specification-0.1.282.dist-info}/entry_points.txt +0 -0
|
@@ -79,7 +79,9 @@ def run_local_command_with_timeout(command_str, timeout_seconds, description="co
|
|
|
79
79
|
tuple: (success, stdout, stderr)
|
|
80
80
|
"""
|
|
81
81
|
try:
|
|
82
|
-
logging.info(
|
|
82
|
+
logging.info(
|
|
83
|
+
f"Running {description} with {timeout_seconds}s timeout: {command_str}"
|
|
84
|
+
)
|
|
83
85
|
|
|
84
86
|
# Use shell=True to support complex command strings with pipes, etc.
|
|
85
87
|
process = subprocess.Popen(
|
|
@@ -87,7 +89,7 @@ def run_local_command_with_timeout(command_str, timeout_seconds, description="co
|
|
|
87
89
|
shell=True,
|
|
88
90
|
stdout=subprocess.PIPE,
|
|
89
91
|
stderr=subprocess.PIPE,
|
|
90
|
-
text=True
|
|
92
|
+
text=True,
|
|
91
93
|
)
|
|
92
94
|
|
|
93
95
|
try:
|
|
@@ -106,7 +108,9 @@ def run_local_command_with_timeout(command_str, timeout_seconds, description="co
|
|
|
106
108
|
logging.error(f"{description} timed out after {timeout_seconds} seconds")
|
|
107
109
|
process.kill()
|
|
108
110
|
try:
|
|
109
|
-
stdout, stderr = process.communicate(
|
|
111
|
+
stdout, stderr = process.communicate(
|
|
112
|
+
timeout=5
|
|
113
|
+
) # Give 5 seconds to cleanup
|
|
110
114
|
except subprocess.TimeoutExpired:
|
|
111
115
|
stdout, stderr = "", "Process killed due to timeout"
|
|
112
116
|
return False, stdout, f"Timeout after {timeout_seconds} seconds. {stderr}"
|
|
@@ -136,7 +140,9 @@ def calculate_process_timeout(command_str, buffer_timeout):
|
|
|
136
140
|
if test_time_match:
|
|
137
141
|
test_time = int(test_time_match.group(1))
|
|
138
142
|
timeout = test_time + buffer_timeout
|
|
139
|
-
logging.info(
|
|
143
|
+
logging.info(
|
|
144
|
+
f"Set process timeout to {timeout}s (test-time: {test_time}s + {buffer_timeout}s buffer)"
|
|
145
|
+
)
|
|
140
146
|
return timeout
|
|
141
147
|
|
|
142
148
|
logging.info(f"Using default process timeout: {default_timeout}s")
|
|
@@ -170,7 +176,9 @@ def parse_size(size):
|
|
|
170
176
|
return int(number * units[unit])
|
|
171
177
|
|
|
172
178
|
|
|
173
|
-
def extract_expected_benchmark_duration(
|
|
179
|
+
def extract_expected_benchmark_duration(
|
|
180
|
+
benchmark_command_str, override_memtier_test_time
|
|
181
|
+
):
|
|
174
182
|
"""
|
|
175
183
|
Extract expected benchmark duration from command string or override.
|
|
176
184
|
|
|
@@ -242,7 +250,9 @@ def run_multiple_clients(
|
|
|
242
250
|
if "memtier_benchmark" in client_tool:
|
|
243
251
|
# Set benchmark path based on local install option
|
|
244
252
|
if args.benchmark_local_install:
|
|
245
|
-
full_benchmark_path = getattr(
|
|
253
|
+
full_benchmark_path = getattr(
|
|
254
|
+
args, "memtier_bin_path", "memtier_benchmark"
|
|
255
|
+
)
|
|
246
256
|
else:
|
|
247
257
|
full_benchmark_path = f"/usr/local/bin/{client_tool}"
|
|
248
258
|
|
|
@@ -334,7 +344,9 @@ def run_multiple_clients(
|
|
|
334
344
|
# Calculate container timeout
|
|
335
345
|
container_timeout = 300 # 5 minutes default
|
|
336
346
|
# Use new timeout_buffer argument, fallback to container_timeout_buffer for backward compatibility
|
|
337
|
-
buffer_timeout = getattr(
|
|
347
|
+
buffer_timeout = getattr(
|
|
348
|
+
args, "timeout_buffer", getattr(args, "container_timeout_buffer", 60)
|
|
349
|
+
)
|
|
338
350
|
if "test-time" in benchmark_command_str:
|
|
339
351
|
# Try to extract test time and add buffer
|
|
340
352
|
import re
|
|
@@ -520,17 +532,29 @@ def run_multiple_clients(
|
|
|
520
532
|
)
|
|
521
533
|
elif "vector-db-benchmark" in tool:
|
|
522
534
|
# For vector-db-benchmark, look for summary JSON file
|
|
523
|
-
summary_files = [
|
|
535
|
+
summary_files = [
|
|
536
|
+
f
|
|
537
|
+
for f in os.listdir(temporary_dir_client)
|
|
538
|
+
if f.endswith("-summary.json")
|
|
539
|
+
]
|
|
524
540
|
if summary_files:
|
|
525
|
-
summary_filepath = os.path.join(
|
|
541
|
+
summary_filepath = os.path.join(
|
|
542
|
+
temporary_dir_client, summary_files[0]
|
|
543
|
+
)
|
|
526
544
|
try:
|
|
527
|
-
with open(summary_filepath,
|
|
545
|
+
with open(summary_filepath, "r") as f:
|
|
528
546
|
vector_json = json.load(f)
|
|
529
|
-
logging.info(
|
|
547
|
+
logging.info(
|
|
548
|
+
f"Successfully read vector-db-benchmark JSON output from {summary_files[0]}"
|
|
549
|
+
)
|
|
530
550
|
except Exception as e:
|
|
531
|
-
logging.warning(
|
|
551
|
+
logging.warning(
|
|
552
|
+
f"Failed to read vector-db-benchmark JSON from {summary_files[0]}: {e}"
|
|
553
|
+
)
|
|
532
554
|
else:
|
|
533
|
-
logging.warning(
|
|
555
|
+
logging.warning(
|
|
556
|
+
f"No vector-db-benchmark summary JSON file found for client {client_index}"
|
|
557
|
+
)
|
|
534
558
|
|
|
535
559
|
logging.info(
|
|
536
560
|
f"Successfully read JSON output from client {client_index} ({tool})"
|
|
@@ -554,25 +578,33 @@ def run_multiple_clients(
|
|
|
554
578
|
aggregated_json.update(pubsub_json)
|
|
555
579
|
aggregated_json.update(vector_json)
|
|
556
580
|
aggregated_stdout = json.dumps(aggregated_json, indent=2)
|
|
557
|
-
logging.info(
|
|
581
|
+
logging.info(
|
|
582
|
+
"Using merged JSON results from memtier, pubsub-sub-bench, and vector-db-benchmark clients"
|
|
583
|
+
)
|
|
558
584
|
elif memtier_json and pubsub_json:
|
|
559
585
|
# Use memtier as base and add pubsub metrics
|
|
560
586
|
aggregated_json = memtier_json.copy()
|
|
561
587
|
aggregated_json.update(pubsub_json)
|
|
562
588
|
aggregated_stdout = json.dumps(aggregated_json, indent=2)
|
|
563
|
-
logging.info(
|
|
589
|
+
logging.info(
|
|
590
|
+
"Using merged JSON results from memtier and pubsub-sub-bench clients"
|
|
591
|
+
)
|
|
564
592
|
elif memtier_json and vector_json:
|
|
565
593
|
# Use memtier as base and add vector metrics
|
|
566
594
|
aggregated_json = memtier_json.copy()
|
|
567
595
|
aggregated_json.update(vector_json)
|
|
568
596
|
aggregated_stdout = json.dumps(aggregated_json, indent=2)
|
|
569
|
-
logging.info(
|
|
597
|
+
logging.info(
|
|
598
|
+
"Using merged JSON results from memtier and vector-db-benchmark clients"
|
|
599
|
+
)
|
|
570
600
|
elif pubsub_json and vector_json:
|
|
571
601
|
# Use pubsub as base and add vector metrics
|
|
572
602
|
aggregated_json = pubsub_json.copy()
|
|
573
603
|
aggregated_json.update(vector_json)
|
|
574
604
|
aggregated_stdout = json.dumps(aggregated_json, indent=2)
|
|
575
|
-
logging.info(
|
|
605
|
+
logging.info(
|
|
606
|
+
"Using merged JSON results from pubsub-sub-bench and vector-db-benchmark clients"
|
|
607
|
+
)
|
|
576
608
|
elif memtier_json:
|
|
577
609
|
# Only memtier available
|
|
578
610
|
aggregated_json = memtier_json
|
|
@@ -591,7 +623,9 @@ def run_multiple_clients(
|
|
|
591
623
|
else:
|
|
592
624
|
# Fall back to concatenated stdout
|
|
593
625
|
aggregated_stdout = "\n".join([r["stdout"] for r in successful_results])
|
|
594
|
-
logging.warning(
|
|
626
|
+
logging.warning(
|
|
627
|
+
"No JSON results found, falling back to concatenated stdout"
|
|
628
|
+
)
|
|
595
629
|
|
|
596
630
|
return aggregated_stdout, results
|
|
597
631
|
|
|
@@ -913,7 +947,9 @@ def prepare_vector_db_benchmark_parameters(
|
|
|
913
947
|
|
|
914
948
|
# Add custom arguments if specified
|
|
915
949
|
if "arguments" in clientconfig:
|
|
916
|
-
benchmark_command_str =
|
|
950
|
+
benchmark_command_str = (
|
|
951
|
+
" ".join(benchmark_command) + " " + clientconfig["arguments"]
|
|
952
|
+
)
|
|
917
953
|
else:
|
|
918
954
|
benchmark_command_str = " ".join(benchmark_command)
|
|
919
955
|
|
|
@@ -1156,8 +1192,8 @@ def process_self_contained_coordinator_stream(
|
|
|
1156
1192
|
|
|
1157
1193
|
# Check if all tested commands are supported by this Redis instance
|
|
1158
1194
|
supported_commands = get_supported_redis_commands(redis_conns)
|
|
1159
|
-
commands_supported, unsupported_commands =
|
|
1160
|
-
benchmark_config, supported_commands
|
|
1195
|
+
commands_supported, unsupported_commands = (
|
|
1196
|
+
check_test_command_support(benchmark_config, supported_commands)
|
|
1161
1197
|
)
|
|
1162
1198
|
|
|
1163
1199
|
if not commands_supported:
|
|
@@ -1328,7 +1364,11 @@ def process_self_contained_coordinator_stream(
|
|
|
1328
1364
|
if "dbconfig" in benchmark_config:
|
|
1329
1365
|
if "preload_tool" in benchmark_config["dbconfig"]:
|
|
1330
1366
|
# Get timeout buffer for preload
|
|
1331
|
-
buffer_timeout = getattr(
|
|
1367
|
+
buffer_timeout = getattr(
|
|
1368
|
+
args,
|
|
1369
|
+
"timeout_buffer",
|
|
1370
|
+
getattr(args, "container_timeout_buffer", 60),
|
|
1371
|
+
)
|
|
1332
1372
|
|
|
1333
1373
|
res = data_prepopulation_step(
|
|
1334
1374
|
benchmark_config,
|
|
@@ -1397,8 +1437,13 @@ def process_self_contained_coordinator_stream(
|
|
|
1397
1437
|
benchmark_tool = "redis-benchmark"
|
|
1398
1438
|
|
|
1399
1439
|
# Set benchmark path based on local install option
|
|
1400
|
-
if
|
|
1401
|
-
|
|
1440
|
+
if (
|
|
1441
|
+
args.benchmark_local_install
|
|
1442
|
+
and "memtier_benchmark" in benchmark_tool
|
|
1443
|
+
):
|
|
1444
|
+
full_benchmark_path = getattr(
|
|
1445
|
+
args, "memtier_bin_path", "memtier_benchmark"
|
|
1446
|
+
)
|
|
1402
1447
|
else:
|
|
1403
1448
|
full_benchmark_path = f"/usr/local/bin/{benchmark_tool}"
|
|
1404
1449
|
|
|
@@ -1564,7 +1609,7 @@ def process_self_contained_coordinator_stream(
|
|
|
1564
1609
|
args.remote_profile_port,
|
|
1565
1610
|
args.remote_profile_output_dir,
|
|
1566
1611
|
args.remote_profile_username,
|
|
1567
|
-
args.remote_profile_password
|
|
1612
|
+
args.remote_profile_password,
|
|
1568
1613
|
)
|
|
1569
1614
|
|
|
1570
1615
|
# Extract expected benchmark duration
|
|
@@ -1576,13 +1621,17 @@ def process_self_contained_coordinator_stream(
|
|
|
1576
1621
|
profiling_started = remote_profiler.start_profiling(
|
|
1577
1622
|
redis_conns[0] if redis_conns else None,
|
|
1578
1623
|
test_name,
|
|
1579
|
-
expected_duration
|
|
1624
|
+
expected_duration,
|
|
1580
1625
|
)
|
|
1581
1626
|
|
|
1582
1627
|
if profiling_started:
|
|
1583
|
-
logging.info(
|
|
1628
|
+
logging.info(
|
|
1629
|
+
f"Started remote profiling for test: {test_name}"
|
|
1630
|
+
)
|
|
1584
1631
|
else:
|
|
1585
|
-
logging.warning(
|
|
1632
|
+
logging.warning(
|
|
1633
|
+
f"Failed to start remote profiling for test: {test_name}"
|
|
1634
|
+
)
|
|
1586
1635
|
remote_profiler = None
|
|
1587
1636
|
|
|
1588
1637
|
except Exception as e:
|
|
@@ -1634,14 +1683,22 @@ def process_self_contained_coordinator_stream(
|
|
|
1634
1683
|
)
|
|
1635
1684
|
|
|
1636
1685
|
# Calculate timeout for local process
|
|
1637
|
-
buffer_timeout = getattr(
|
|
1638
|
-
|
|
1686
|
+
buffer_timeout = getattr(
|
|
1687
|
+
args,
|
|
1688
|
+
"timeout_buffer",
|
|
1689
|
+
getattr(args, "container_timeout_buffer", 60),
|
|
1690
|
+
)
|
|
1691
|
+
process_timeout = calculate_process_timeout(
|
|
1692
|
+
benchmark_command_str, buffer_timeout
|
|
1693
|
+
)
|
|
1639
1694
|
|
|
1640
1695
|
# Run with timeout
|
|
1641
|
-
success, client_container_stdout, stderr =
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1696
|
+
success, client_container_stdout, stderr = (
|
|
1697
|
+
run_local_command_with_timeout(
|
|
1698
|
+
benchmark_command_str,
|
|
1699
|
+
process_timeout,
|
|
1700
|
+
"memtier benchmark",
|
|
1701
|
+
)
|
|
1645
1702
|
)
|
|
1646
1703
|
|
|
1647
1704
|
if not success:
|
|
@@ -1666,7 +1723,9 @@ def process_self_contained_coordinator_stream(
|
|
|
1666
1723
|
# Set working directory based on tool
|
|
1667
1724
|
working_dir = benchmark_tool_workdir
|
|
1668
1725
|
if "vector-db-benchmark" in benchmark_tool:
|
|
1669
|
-
working_dir =
|
|
1726
|
+
working_dir = (
|
|
1727
|
+
"/app" # vector-db-benchmark needs to run from /app
|
|
1728
|
+
)
|
|
1670
1729
|
|
|
1671
1730
|
# Prepare volumes
|
|
1672
1731
|
volumes = {
|
|
@@ -1697,7 +1756,9 @@ def process_self_contained_coordinator_stream(
|
|
|
1697
1756
|
|
|
1698
1757
|
# Only add user for non-vector-db-benchmark tools to avoid permission issues
|
|
1699
1758
|
if "vector-db-benchmark" not in benchmark_tool:
|
|
1700
|
-
container_kwargs["user"] =
|
|
1759
|
+
container_kwargs["user"] = (
|
|
1760
|
+
f"{os.getuid()}:{os.getgid()}"
|
|
1761
|
+
)
|
|
1701
1762
|
|
|
1702
1763
|
# Add environment variables for vector-db-benchmark
|
|
1703
1764
|
if "vector-db-benchmark" in benchmark_tool:
|
|
@@ -1761,13 +1822,19 @@ def process_self_contained_coordinator_stream(
|
|
|
1761
1822
|
if remote_profiler is not None:
|
|
1762
1823
|
try:
|
|
1763
1824
|
logging.info("Waiting for remote profiling to complete...")
|
|
1764
|
-
profiling_success = remote_profiler.wait_for_completion(
|
|
1825
|
+
profiling_success = remote_profiler.wait_for_completion(
|
|
1826
|
+
timeout=60
|
|
1827
|
+
)
|
|
1765
1828
|
if profiling_success:
|
|
1766
1829
|
logging.info("Remote profiling completed successfully")
|
|
1767
1830
|
else:
|
|
1768
|
-
logging.warning(
|
|
1831
|
+
logging.warning(
|
|
1832
|
+
"Remote profiling did not complete successfully"
|
|
1833
|
+
)
|
|
1769
1834
|
except Exception as e:
|
|
1770
|
-
logging.error(
|
|
1835
|
+
logging.error(
|
|
1836
|
+
f"Error waiting for remote profiling completion: {e}"
|
|
1837
|
+
)
|
|
1771
1838
|
|
|
1772
1839
|
logging.info("Printing client tool stdout output")
|
|
1773
1840
|
if client_container_stdout:
|
|
@@ -1835,21 +1902,36 @@ def process_self_contained_coordinator_stream(
|
|
|
1835
1902
|
)
|
|
1836
1903
|
elif "vector-db-benchmark" in benchmark_tool:
|
|
1837
1904
|
# For vector-db-benchmark, look for summary JSON file
|
|
1838
|
-
summary_files = [
|
|
1905
|
+
summary_files = [
|
|
1906
|
+
f
|
|
1907
|
+
for f in os.listdir(temporary_dir_client)
|
|
1908
|
+
if f.endswith("-summary.json")
|
|
1909
|
+
]
|
|
1839
1910
|
if summary_files:
|
|
1840
|
-
full_result_path = os.path.join(
|
|
1841
|
-
|
|
1911
|
+
full_result_path = os.path.join(
|
|
1912
|
+
temporary_dir_client, summary_files[0]
|
|
1913
|
+
)
|
|
1914
|
+
logging.info(
|
|
1915
|
+
f"Found vector-db-benchmark summary file: {summary_files[0]}"
|
|
1916
|
+
)
|
|
1842
1917
|
else:
|
|
1843
|
-
logging.warning(
|
|
1918
|
+
logging.warning(
|
|
1919
|
+
"No vector-db-benchmark summary JSON file found"
|
|
1920
|
+
)
|
|
1844
1921
|
# Create empty results dict to avoid crash
|
|
1845
1922
|
results_dict = {}
|
|
1846
1923
|
|
|
1847
1924
|
logging.info(f"Reading results json from {full_result_path}")
|
|
1848
1925
|
|
|
1849
|
-
if
|
|
1926
|
+
if (
|
|
1927
|
+
"vector-db-benchmark" in benchmark_tool
|
|
1928
|
+
and not os.path.exists(full_result_path)
|
|
1929
|
+
):
|
|
1850
1930
|
# Handle case where vector-db-benchmark didn't produce results
|
|
1851
1931
|
results_dict = {}
|
|
1852
|
-
logging.warning(
|
|
1932
|
+
logging.warning(
|
|
1933
|
+
"Vector-db-benchmark did not produce results file"
|
|
1934
|
+
)
|
|
1853
1935
|
else:
|
|
1854
1936
|
with open(
|
|
1855
1937
|
full_result_path,
|
|
@@ -1990,7 +2072,9 @@ def get_maxmemory(r):
|
|
|
1990
2072
|
|
|
1991
2073
|
# Check if maxmemory key exists in Redis memory info
|
|
1992
2074
|
if "maxmemory" not in memory_info:
|
|
1993
|
-
logging.warning(
|
|
2075
|
+
logging.warning(
|
|
2076
|
+
"maxmemory not present in Redis memory info. Cannot enforce memory checks."
|
|
2077
|
+
)
|
|
1994
2078
|
return 0
|
|
1995
2079
|
|
|
1996
2080
|
maxmemory = int(memory_info["maxmemory"])
|
|
@@ -2085,10 +2169,12 @@ def print_results_table_stdout(
|
|
|
2085
2169
|
# Use resolved metric name for precision_summary metrics, otherwise use original path
|
|
2086
2170
|
def get_display_name(x):
|
|
2087
2171
|
# For precision_summary metrics with wildcards, construct the resolved path
|
|
2088
|
-
if (
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
-
"
|
|
2172
|
+
if (
|
|
2173
|
+
len(x) > 1
|
|
2174
|
+
and isinstance(x[0], str)
|
|
2175
|
+
and "precision_summary" in x[0]
|
|
2176
|
+
and "*" in x[0]
|
|
2177
|
+
):
|
|
2092
2178
|
|
|
2093
2179
|
# Look for the precision level in the cleaned metrics logs
|
|
2094
2180
|
# We need to find the corresponding cleaned metric to get the precision level
|
|
@@ -2097,17 +2183,19 @@ def print_results_table_stdout(
|
|
|
2097
2183
|
|
|
2098
2184
|
# Since we know from logs that the precision level is available,
|
|
2099
2185
|
# let's reconstruct it from the metric context path (x[1]) if available
|
|
2100
|
-
if
|
|
2186
|
+
if (
|
|
2187
|
+
len(x) > 1
|
|
2188
|
+
and isinstance(x[1], str)
|
|
2189
|
+
and x[1].startswith("'")
|
|
2190
|
+
and x[1].endswith("'")
|
|
2191
|
+
):
|
|
2101
2192
|
precision_level = x[1] # This should be something like "'1.0000'"
|
|
2102
2193
|
resolved_path = x[0].replace("*", precision_level)
|
|
2103
2194
|
return resolved_path
|
|
2104
2195
|
|
|
2105
2196
|
return x[0] # Use original path
|
|
2106
2197
|
|
|
2107
|
-
results_matrix = [
|
|
2108
|
-
[get_display_name(x), f"{x[3]:.3f}"]
|
|
2109
|
-
for x in results_matrix
|
|
2110
|
-
]
|
|
2198
|
+
results_matrix = [[get_display_name(x), f"{x[3]:.3f}"] for x in results_matrix]
|
|
2111
2199
|
writer = MarkdownTableWriter(
|
|
2112
2200
|
table_name=table_name,
|
|
2113
2201
|
headers=results_matrix_headers,
|
|
@@ -2123,16 +2211,28 @@ def print_redis_info_section(redis_conns):
|
|
|
2123
2211
|
redis_info = redis_conns[0].info()
|
|
2124
2212
|
server_name = "redis"
|
|
2125
2213
|
if "server_name" in redis_info:
|
|
2126
|
-
server_name = redis_info[
|
|
2214
|
+
server_name = redis_info["server_name"]
|
|
2127
2215
|
|
|
2128
2216
|
print("\n# Redis Server Information")
|
|
2129
2217
|
redis_info_data = [
|
|
2130
|
-
[
|
|
2218
|
+
[
|
|
2219
|
+
f"{server_name} version",
|
|
2220
|
+
redis_info.get(f"{server_name}_version", "unknown"),
|
|
2221
|
+
],
|
|
2131
2222
|
["redis version", redis_info.get("redis_version", "unknown")],
|
|
2132
2223
|
["io_threads_active", redis_info.get("io_threads_active", "unknown")],
|
|
2133
|
-
[
|
|
2134
|
-
|
|
2135
|
-
|
|
2224
|
+
[
|
|
2225
|
+
f"{server_name} Git SHA1",
|
|
2226
|
+
redis_info.get("redis_git_sha1", "unknown"),
|
|
2227
|
+
],
|
|
2228
|
+
[
|
|
2229
|
+
f"{server_name} Git Dirty",
|
|
2230
|
+
str(redis_info.get("redis_git_dirty", "unknown")),
|
|
2231
|
+
],
|
|
2232
|
+
[
|
|
2233
|
+
f"{server_name} Build ID",
|
|
2234
|
+
redis_info.get("redis_build_id", "unknown"),
|
|
2235
|
+
],
|
|
2136
2236
|
[f"{server_name} Mode", redis_info.get("redis_mode", "unknown")],
|
|
2137
2237
|
["OS", redis_info.get("os", "unknown")],
|
|
2138
2238
|
["Arch Bits", str(redis_info.get("arch_bits", "unknown"))],
|
|
@@ -2167,7 +2267,9 @@ def get_supported_redis_commands(redis_conns):
|
|
|
2167
2267
|
try:
|
|
2168
2268
|
# Execute COMMAND to get all supported commands
|
|
2169
2269
|
commands_info = redis_conns[0].execute_command("COMMAND")
|
|
2170
|
-
logging.info(
|
|
2270
|
+
logging.info(
|
|
2271
|
+
f"COMMAND response type: {type(commands_info)}, length: {len(commands_info) if hasattr(commands_info, '__len__') else 'N/A'}"
|
|
2272
|
+
)
|
|
2171
2273
|
|
|
2172
2274
|
# Extract command names
|
|
2173
2275
|
supported_commands = set()
|
|
@@ -2176,7 +2278,7 @@ def get_supported_redis_commands(redis_conns):
|
|
|
2176
2278
|
# COMMAND response is a dict with command names as keys
|
|
2177
2279
|
for cmd_name in commands_info.keys():
|
|
2178
2280
|
if isinstance(cmd_name, bytes):
|
|
2179
|
-
cmd_name = cmd_name.decode(
|
|
2281
|
+
cmd_name = cmd_name.decode("utf-8")
|
|
2180
2282
|
supported_commands.add(str(cmd_name).upper())
|
|
2181
2283
|
elif isinstance(commands_info, (list, tuple)):
|
|
2182
2284
|
# Fallback for list format (first element of each command info array)
|
|
@@ -2184,10 +2286,12 @@ def get_supported_redis_commands(redis_conns):
|
|
|
2184
2286
|
if isinstance(cmd_info, (list, tuple)) and len(cmd_info) > 0:
|
|
2185
2287
|
cmd_name = cmd_info[0]
|
|
2186
2288
|
if isinstance(cmd_name, bytes):
|
|
2187
|
-
cmd_name = cmd_name.decode(
|
|
2289
|
+
cmd_name = cmd_name.decode("utf-8")
|
|
2188
2290
|
supported_commands.add(str(cmd_name).upper())
|
|
2189
2291
|
|
|
2190
|
-
logging.info(
|
|
2292
|
+
logging.info(
|
|
2293
|
+
f"Retrieved {len(supported_commands)} supported Redis commands"
|
|
2294
|
+
)
|
|
2191
2295
|
|
|
2192
2296
|
# Log some sample commands for debugging
|
|
2193
2297
|
if supported_commands:
|
|
@@ -2195,7 +2299,9 @@ def get_supported_redis_commands(redis_conns):
|
|
|
2195
2299
|
logging.info(f"Sample commands: {sample_commands}")
|
|
2196
2300
|
|
|
2197
2301
|
# Check specifically for vector commands
|
|
2198
|
-
vector_commands = [
|
|
2302
|
+
vector_commands = [
|
|
2303
|
+
cmd for cmd in supported_commands if cmd.startswith("V")
|
|
2304
|
+
]
|
|
2199
2305
|
if vector_commands:
|
|
2200
2306
|
logging.info(f"Vector commands found: {sorted(vector_commands)}")
|
|
2201
2307
|
|
|
@@ -2255,13 +2361,20 @@ def prepare_overall_total_test_results(
|
|
|
2255
2361
|
# Use the same display name logic as in the individual test results
|
|
2256
2362
|
def get_overall_display_name(x):
|
|
2257
2363
|
# For precision_summary metrics with wildcards, construct the resolved path
|
|
2258
|
-
if (
|
|
2259
|
-
|
|
2260
|
-
|
|
2261
|
-
"
|
|
2364
|
+
if (
|
|
2365
|
+
len(x) > 1
|
|
2366
|
+
and isinstance(x[0], str)
|
|
2367
|
+
and "precision_summary" in x[0]
|
|
2368
|
+
and "*" in x[0]
|
|
2369
|
+
):
|
|
2262
2370
|
|
|
2263
2371
|
# Reconstruct resolved path from metric context path (x[1]) if available
|
|
2264
|
-
if
|
|
2372
|
+
if (
|
|
2373
|
+
len(x) > 1
|
|
2374
|
+
and isinstance(x[1], str)
|
|
2375
|
+
and x[1].startswith("'")
|
|
2376
|
+
and x[1].endswith("'")
|
|
2377
|
+
):
|
|
2265
2378
|
precision_level = x[1] # This should be something like "'1.0000'"
|
|
2266
2379
|
resolved_path = x[0].replace("*", precision_level)
|
|
2267
2380
|
return resolved_path
|
|
@@ -2269,7 +2382,8 @@ def prepare_overall_total_test_results(
|
|
|
2269
2382
|
return x[0] # Use original path
|
|
2270
2383
|
|
|
2271
2384
|
current_test_results_matrix = [
|
|
2272
|
-
[test_name, get_overall_display_name(x), f"{x[3]:.3f}"]
|
|
2385
|
+
[test_name, get_overall_display_name(x), f"{x[3]:.3f}"]
|
|
2386
|
+
for x in current_test_results_matrix
|
|
2273
2387
|
]
|
|
2274
2388
|
overall_results_matrix.extend(current_test_results_matrix)
|
|
2275
2389
|
|
|
@@ -2317,7 +2431,7 @@ def data_prepopulation_step(
|
|
|
2317
2431
|
|
|
2318
2432
|
# Set preload tool path based on local install option
|
|
2319
2433
|
if benchmark_local_install and "memtier_benchmark" in preload_tool and args:
|
|
2320
|
-
full_benchmark_path = getattr(args,
|
|
2434
|
+
full_benchmark_path = getattr(args, "memtier_bin_path", "memtier_benchmark")
|
|
2321
2435
|
else:
|
|
2322
2436
|
full_benchmark_path = f"/usr/local/bin/{preload_tool}"
|
|
2323
2437
|
client_mnt_point = "/mnt/client/"
|
|
@@ -2364,13 +2478,13 @@ def data_prepopulation_step(
|
|
|
2364
2478
|
)
|
|
2365
2479
|
|
|
2366
2480
|
# Calculate timeout for preload process
|
|
2367
|
-
process_timeout = calculate_process_timeout(
|
|
2481
|
+
process_timeout = calculate_process_timeout(
|
|
2482
|
+
preload_command_str, timeout_buffer
|
|
2483
|
+
)
|
|
2368
2484
|
|
|
2369
2485
|
# Run with timeout
|
|
2370
2486
|
success, client_container_stdout, stderr = run_local_command_with_timeout(
|
|
2371
|
-
preload_command_str,
|
|
2372
|
-
process_timeout,
|
|
2373
|
-
"memtier preload"
|
|
2487
|
+
preload_command_str, process_timeout, "memtier preload"
|
|
2374
2488
|
)
|
|
2375
2489
|
|
|
2376
2490
|
if not success:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: redis-benchmarks-specification
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.282
|
|
4
4
|
Summary: The Redis benchmarks specification describes the cross-language/tools requirements and expectations to foster performance and observability standards around redis related technologies. Members from both industry and academia, including organizations and individuals are encouraged to contribute.
|
|
5
5
|
Author: filipecosta90
|
|
6
6
|
Author-email: filipecosta.90@gmail.com
|
|
@@ -17,15 +17,15 @@ redis_benchmarks_specification/__common__/github.py,sha256=9TZtnISsSgXTSAN_VQejo
|
|
|
17
17
|
redis_benchmarks_specification/__common__/package.py,sha256=4uVt1BAZ999LV2rZkq--Tk6otAVIf9YR3g3KGeUpiW4,834
|
|
18
18
|
redis_benchmarks_specification/__common__/runner.py,sha256=2IpMl0IEHi2IZvfLc4_h0e-E3ZfnlB8EkCA_SE8VDCY,7033
|
|
19
19
|
redis_benchmarks_specification/__common__/spec.py,sha256=D_SN48wg6NMthW_-OS1H5bydSDiuZpfd4WPPj7Vfwmc,5760
|
|
20
|
-
redis_benchmarks_specification/__common__/timeseries.py,sha256=
|
|
20
|
+
redis_benchmarks_specification/__common__/timeseries.py,sha256=dae3YF4cX2Css8i5VnOGxAk3DOu8tHfZt-Vy-uiWQDQ,52917
|
|
21
21
|
redis_benchmarks_specification/__compare__/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
|
|
22
|
-
redis_benchmarks_specification/__compare__/args.py,sha256=
|
|
23
|
-
redis_benchmarks_specification/__compare__/compare.py,sha256=
|
|
22
|
+
redis_benchmarks_specification/__compare__/args.py,sha256=shER83ddBRBMAlbgxGXJ5H5XziKe-sP_Nyx7t5aLOo8,7650
|
|
23
|
+
redis_benchmarks_specification/__compare__/compare.py,sha256=8mtvlwQRYR4c4oOji2qP_fOgtOQCKBL3caHplgTEB2M,62214
|
|
24
24
|
redis_benchmarks_specification/__init__.py,sha256=YQIEx2sLPPA0JR9OuCuMNMNtm-f_gqDKgzvNJnkGNKY,491
|
|
25
25
|
redis_benchmarks_specification/__runner__/__init__.py,sha256=l-G1z-t6twUgi8QLueqoTQLvJmv3hJoEYskGm6H7L6M,83
|
|
26
|
-
redis_benchmarks_specification/__runner__/args.py,sha256=
|
|
27
|
-
redis_benchmarks_specification/__runner__/remote_profiling.py,sha256=
|
|
28
|
-
redis_benchmarks_specification/__runner__/runner.py,sha256=
|
|
26
|
+
redis_benchmarks_specification/__runner__/args.py,sha256=4NaHTfT3FB0wGrYslWb_DKHGf9Za963TjXKk648cjqw,9679
|
|
27
|
+
redis_benchmarks_specification/__runner__/remote_profiling.py,sha256=oTcV_GbtduUE2jnodkLBmnyO53Kgralvi08peLKMXYk,12030
|
|
28
|
+
redis_benchmarks_specification/__runner__/runner.py,sha256=l0h2uCEtQkkzlP8fHlY4BwnBTm1ysu0u52OgiHOsLNo,102241
|
|
29
29
|
redis_benchmarks_specification/__self_contained_coordinator__/__init__.py,sha256=l-G1z-t6twUgi8QLueqoTQLvJmv3hJoEYskGm6H7L6M,83
|
|
30
30
|
redis_benchmarks_specification/__self_contained_coordinator__/args.py,sha256=uxBjdQ78klvsVi6lOfGYQVaWIxc8OI-DwYKY16SgvCY,5952
|
|
31
31
|
redis_benchmarks_specification/__self_contained_coordinator__/artifacts.py,sha256=OVHqJzDgeSSRfUSiKp1ZTAVv14PvSbk-5yJsAAoUfpw,936
|
|
@@ -273,8 +273,8 @@ redis_benchmarks_specification/test-suites/memtier_benchmark-nokeys-pubsub-publi
|
|
|
273
273
|
redis_benchmarks_specification/test-suites/memtier_benchmark-nokeys-server-time-pipeline-10.yml,sha256=rJuWWXubUeRKQ2GSfHlbPMLeOyM9Eu_MzvN2vgKcAhA,672
|
|
274
274
|
redis_benchmarks_specification/test-suites/template.txt,sha256=d_edIE7Sxa5X7I2yG-Io0bPdbDIHR0oWFoCA3XUt_EU,435
|
|
275
275
|
redis_benchmarks_specification/vector-search-test-suites/vector_db_benchmark_test.yml,sha256=uhaSP6YUVmPvZU-qMtPPGdvNEUgUBqOfveUbeJ9WsbI,972
|
|
276
|
-
redis_benchmarks_specification-0.1.
|
|
277
|
-
redis_benchmarks_specification-0.1.
|
|
278
|
-
redis_benchmarks_specification-0.1.
|
|
279
|
-
redis_benchmarks_specification-0.1.
|
|
280
|
-
redis_benchmarks_specification-0.1.
|
|
276
|
+
redis_benchmarks_specification-0.1.282.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
277
|
+
redis_benchmarks_specification-0.1.282.dist-info/METADATA,sha256=iPeWrG4jBoFKIZ3uGvr_lNUA4w6MgexW1sk8jCKhzjc,22726
|
|
278
|
+
redis_benchmarks_specification-0.1.282.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
279
|
+
redis_benchmarks_specification-0.1.282.dist-info/entry_points.txt,sha256=x5WBXCZsnDRTZxV7SBGmC65L2k-ygdDOxV8vuKN00Nk,715
|
|
280
|
+
redis_benchmarks_specification-0.1.282.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|