From 025d8bcc7686ce83a5e3c171ba5289d54bdc292b Mon Sep 17 00:00:00 2001 From: nikhitha malkapuram <nmalkapuram@microsoft.com> Date: Mon, 11 Sep 2023 10:43:05 +0530 Subject: [PATCH 1/7] metrics aggregation starting --- .../VirtualClient.Actions/HPLinpack/HPLinpackExecutor.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/VirtualClient/VirtualClient.Actions/HPLinpack/HPLinpackExecutor.cs b/src/VirtualClient/VirtualClient.Actions/HPLinpack/HPLinpackExecutor.cs index 8e374347b3..8a40201326 100644 --- a/src/VirtualClient/VirtualClient.Actions/HPLinpack/HPLinpackExecutor.cs +++ b/src/VirtualClient/VirtualClient.Actions/HPLinpack/HPLinpackExecutor.cs @@ -386,6 +386,8 @@ await this.fileSystem.File.ReplaceInFileAsync( await this.fileSystem.File.ReplaceInFileAsync( makeFilePath, @"MPlib *=", $"MPlib = /usr/lib/{architecture}-linux-gnu/openmpi/lib/libmpi.so", cancellationToken); + // /usr/lib/x86_64-linux-gnu/openmpi + await this.fileSystem.File.ReplaceInFileAsync( makeFilePath, @"LAinc *=", $"LAinc = -I/usr/lib/{architecture}-linux-gnu", cancellationToken); } From cff5d59f2639df886cac3cfc53d68516415c7dd4 Mon Sep 17 00:00:00 2001 From: nikhitha malkapuram <nmalkapuram@microsoft.com> Date: Thu, 26 Oct 2023 10:09:09 +0530 Subject: [PATCH 2/7] Adding aggregate metrics logic --- .../Memtier/MemtierBenchmarkClientExecutor.cs | 117 +++++++++++++++++- .../profiles/PERF-REDIS.json | 12 +- 2 files changed, 119 insertions(+), 10 deletions(-) diff --git a/src/VirtualClient/VirtualClient.Actions/Memtier/MemtierBenchmarkClientExecutor.cs b/src/VirtualClient/VirtualClient.Actions/Memtier/MemtierBenchmarkClientExecutor.cs index fc36496ea6..f46a148355 100644 --- a/src/VirtualClient/VirtualClient.Actions/Memtier/MemtierBenchmarkClientExecutor.cs +++ b/src/VirtualClient/VirtualClient.Actions/Memtier/MemtierBenchmarkClientExecutor.cs @@ -6,6 +6,7 @@ namespace VirtualClient.Actions using System; using System.Collections.Generic; using System.Diagnostics; + using System.Linq; using System.Net; using System.Runtime.InteropServices; using System.Text.RegularExpressions; @@ -13,6 +14,7 @@ namespace VirtualClient.Actions using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; + using Microsoft.Identity.Client; using Polly; using VirtualClient.Common; using VirtualClient.Common.Contracts; @@ -20,6 +22,7 @@ namespace VirtualClient.Actions using VirtualClient.Common.Telemetry; using VirtualClient.Contracts; using VirtualClient.Contracts.Metadata; + using LogLevel = Microsoft.Extensions.Logging.LogLevel; /// <summary> /// Redis/Memcached Memtier Client Executor. @@ -34,6 +37,8 @@ public class MemtierBenchmarkClientExecutor : MemcachedExecutor new Regex(@"connection\s+refused", RegexOptions.IgnoreCase | RegexOptions.Compiled) }; + private List<Metric> aggregatedMetrics = new List<Metric>(); + /// <summary> /// Initializes a new instance of the <see cref="MemtierBenchmarkClientExecutor"/> class. /// </summary> @@ -57,7 +62,7 @@ public MemtierBenchmarkClientExecutor(IServiceCollection dependencies, IDictiona /// <summary> /// Parameter defines the number of Memtier benchmark instances to execute against - /// each server instance. Default = # of logical cores/vCPUs on system. + /// each server instance. Default = 1. /// </summary> public int ClientInstances { @@ -104,6 +109,18 @@ public bool WarmUp } } + /// <summary> + /// Parameter defines true/false whether the client action should also emit metric per each server process separately. + /// Default value is false and collects only aggregate metrics across all the redis/memcached server processes running in the system. + /// </summary> + public bool PerProcessMetric + { + get + { + return this.Parameters.GetValue<bool>(nameof(this.PerProcessMetric), false); + } + } + /// <summary> /// yes if TLS is enabled. /// </summary> @@ -304,8 +321,8 @@ protected override bool IsSupported() return isSupported; } - - private void CaptureMetrics(string results, string commandArguments, DateTime startTime, DateTime endTime, EventContext telemetryContext, CancellationToken cancellationToken) + + private void AggregateAndCapturePerProcessMetrics(string results, string commandArguments, DateTime startTime, DateTime endTime, EventContext telemetryContext, CancellationToken cancellationToken) { if (!cancellationToken.IsCancellationRequested) { @@ -326,8 +343,11 @@ private void CaptureMetrics(string results, string commandArguments, DateTime st { MemtierMetricsParser resultsParser = new MemtierMetricsParser(results); IList<Metric> workloadMetrics = resultsParser.Parse(); + this.aggregatedMetrics.AddRange(workloadMetrics); - this.Logger.LogMetrics( + if (this.PerProcessMetric) + { + this.Logger.LogMetrics( $"Memtier-{this.Benchmark}", this.Scenario, startTime, @@ -337,6 +357,8 @@ private void CaptureMetrics(string results, string commandArguments, DateTime st commandArguments, this.Tags, telemetryContext); + } + } } catch (SchemaException exc) @@ -346,6 +368,85 @@ private void CaptureMetrics(string results, string commandArguments, DateTime st } } + private void CaptureAggregateMetrics(string commandArguments, DateTime startTime, DateTime endTime, EventContext telemetryContext, CancellationToken cancellationToken) + { + if (!cancellationToken.IsCancellationRequested) + { + try + { + this.MetadataContract.AddForScenario( + "Memtier", + commandArguments, + toolVersion: null); + + this.MetadataContract.Apply(telemetryContext); + + Dictionary<string, List<double>> metricNameValueListDict = new Dictionary<string, List<double>>(); + Dictionary<string, List<Metric>> metricNameMetricsListDict = new Dictionary<string, List<Metric>>(); + + foreach (var metric in this.aggregatedMetrics) + { + if (metricNameMetricsListDict.ContainsKey(metric.Name)) + { + metricNameValueListDict[metric.Name].Add(metric.Value); + } + else + { + metricNameValueListDict.Add(metric.Name, new List<double>() { metric.Value }); + } + + if (metricNameMetricsListDict.ContainsKey(metric.Name)) + { + metricNameMetricsListDict[metric.Name].Add(metric); + } + else + { + metricNameMetricsListDict.Add(metric.Name, new List<Metric>() { metric }); + } + } + + List<Metric> newAggregateListOfMetrics = new List<Metric>(); + + foreach (var metricKeyValuePair in metricNameValueListDict) + { + double avgValue = metricKeyValuePair.Value.Average(); + double minValue = metricKeyValuePair.Value.Min(); + double maxValue = metricKeyValuePair.Value.Max(); + double stdevValue = Math.Sqrt(metricKeyValuePair.Value.Select(x => Math.Pow(x - avgValue, 2)).Average()); + List<double> sortedValues = metricKeyValuePair.Value.OrderBy(x => x).ToList(); + double p80Value = sortedValues[(int)Math.Ceiling(sortedValues.Count * 0.8) - 1]; + + newAggregateListOfMetrics.Add(new Metric($"{metricKeyValuePair.Key}_Avg", avgValue, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Unit, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Relativity)); + newAggregateListOfMetrics.Add(new Metric($"{metricKeyValuePair.Key}_Min", minValue, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Unit, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Relativity)); + newAggregateListOfMetrics.Add(new Metric($"{metricKeyValuePair.Key}_Max", maxValue, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Unit, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Relativity)); + newAggregateListOfMetrics.Add(new Metric($"{metricKeyValuePair.Key}_Stdev", stdevValue, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Unit, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Relativity)); + newAggregateListOfMetrics.Add(new Metric($"{metricKeyValuePair.Key}_P80", p80Value, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Unit, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Relativity)); + if (metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Unit != MetricUnit.Milliseconds) + { + // For throughput and bandwidth related metrics only. + double sumValue = metricKeyValuePair.Value.Sum(); + newAggregateListOfMetrics.Add(new Metric($"{metricKeyValuePair.Key}_Sum", sumValue, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Unit, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Relativity)); + } + } + + this.Logger.LogMetrics( + $"Memtier-{this.Benchmark}", + this.Scenario, + startTime, + endTime, + newAggregateListOfMetrics, + null, + commandArguments, + this.Tags, + telemetryContext); + } + catch (SchemaException exc) + { + throw new WorkloadResultsException($"Failed to aggregate workload results.", exc, ErrorReason.WorkloadResultsParsingFailed); + } + } + } + private Task ExecuteWorkloadsAsync(IPAddress serverIPAddress, ServerState serverState, EventContext telemetryContext, CancellationToken cancellationToken) { EventContext relatedContext = telemetryContext.Clone() @@ -366,6 +467,9 @@ private Task ExecuteWorkloadsAsync(IPAddress serverIPAddress, ServerState server relatedContext.AddContext("workingDirectory", workingDirectory); List<Task> workloadProcesses = new List<Task>(); + + DateTime startTime = DateTime.UtcNow; + foreach (int serverPort in serverState.Ports) { for (int i = 0; i < this.ClientInstances; i++) @@ -394,6 +498,9 @@ private Task ExecuteWorkloadsAsync(IPAddress serverIPAddress, ServerState server } await Task.WhenAll(workloadProcesses); + DateTime endTime = DateTime.UtcNow; + + this.CaptureAggregateMetrics(commandArguments, startTime, endTime, telemetryContext, cancellationToken); } }); } @@ -432,7 +539,7 @@ private async Task ExecuteWorkloadAsync(int serverPort, string command, string c { string output = process.StandardOutput.ToString(); string parsedCommandArguments = this.ParseCommand(process.FullCommand()); - this.CaptureMetrics(output, parsedCommandArguments, startTime, DateTime.UtcNow, telemetryContext, cancellationToken); + this.AggregateAndCapturePerProcessMetrics(output, parsedCommandArguments, startTime, DateTime.UtcNow, telemetryContext, cancellationToken); } } } diff --git a/src/VirtualClient/VirtualClient.Main/profiles/PERF-REDIS.json b/src/VirtualClient/VirtualClient.Main/profiles/PERF-REDIS.json index 3d2b5df887..66211b6e1f 100644 --- a/src/VirtualClient/VirtualClient.Main/profiles/PERF-REDIS.json +++ b/src/VirtualClient/VirtualClient.Main/profiles/PERF-REDIS.json @@ -11,8 +11,9 @@ "ServerThreadCount": 4, "ServerInstances": "{LogicalCoreCount}", "ClientInstances": 1, - "IsTLSEnabled": "no", - "Duration": "00:02:00" + "IsTLSEnabled": "no", + "Duration": "00:02:00", + "PerProcessMetric": false }, "Actions": [ { @@ -36,10 +37,11 @@ "Scenario": "warmup_32b_pool", "PackageName": "memtier", "CommandLine": "--protocol redis --threads 1 --clients 1 --ratio 1:0 --data-size 32 --pipeline 32 --key-minimum 1 --key-maximum 10000000 --key-prefix sm --key-pattern S:S --run-count 1 --requests=allkeys", - "ClientInstances": 1, + "ClientInstances": "$.Parameters.ClientInstances", "WarmUp": true, "IsTLSEnabled": "$.Parameters.IsTLSEnabled", "RedisResourcesPackageName": "redisresources", + "PerProcessMetric": "$.Parameters.PerProcessMetric", "Role": "Client" } }, @@ -49,7 +51,7 @@ "Scenario": "warmup_1kb_pool", "PackageName": "memtier", "CommandLine": "--protocol redis --threads 1 --clients 1 --ratio 1:0 --data-size 1024 --pipeline 32 --key-minimum 1 --key-maximum 500000 --key-prefix med --key-pattern S:S --run-count 1 --requests=allkeys", - "ClientInstances": 1, + "ClientInstances": "$.Parameters.ClientInstances", "WarmUp": true, "IsTLSEnabled": "$.Parameters.IsTLSEnabled", "RedisResourcesPackageName": "redisresources", @@ -62,7 +64,7 @@ "Scenario": "warmup_10kb_pool", "PackageName": "memtier", "CommandLine": "--protocol redis --threads 1 --clients 1 --ratio 1:0 --data-size 10240 --pipeline 32 --key-minimum 1 --key-maximum 50000 --key-prefix lg --key-pattern S:S --run-count 1 --requests=allkeys", - "ClientInstances": 1, + "ClientInstances": "$.Parameters.ClientInstances", "WarmUp": true, "IsTLSEnabled": "$.Parameters.IsTLSEnabled", "RedisResourcesPackageName": "redisresources", From 02c3803c5cbb64d1ee8c9bc1a1b03260ecb28503 Mon Sep 17 00:00:00 2001 From: nikhitha malkapuram <nmalkapuram@microsoft.com> Date: Thu, 2 Nov 2023 10:23:57 +0530 Subject: [PATCH 3/7] Updating aggregation logic and adding vpuid for each process in metricsmetadata as part of commandline --- .../Memtier/MemtierMetricsParserTests.cs | 396 +++++++++++++++--- .../Redis/RedisExecutorTests.cs | 20 + .../HPLinpack/HPLinpackExecutor.cs | 2 - .../Memcached/MemcachedExecutor.cs | 19 +- .../Memtier/MemtierBenchmarkClientExecutor.cs | 153 ++----- .../Memtier/MemtierMetricsParser.cs | 136 ++++-- .../Redis/RedisExecutor.cs | 18 +- .../profiles/PERF-MEMCACHED.json | 219 +++++----- .../profiles/PERF-REDIS.json | 11 + 9 files changed, 648 insertions(+), 326 deletions(-) diff --git a/src/VirtualClient/VirtualClient.Actions.UnitTests/Memtier/MemtierMetricsParserTests.cs b/src/VirtualClient/VirtualClient.Actions.UnitTests/Memtier/MemtierMetricsParserTests.cs index a405165d86..f94494a18b 100644 --- a/src/VirtualClient/VirtualClient.Actions.UnitTests/Memtier/MemtierMetricsParserTests.cs +++ b/src/VirtualClient/VirtualClient.Actions.UnitTests/Memtier/MemtierMetricsParserTests.cs @@ -7,6 +7,7 @@ namespace VirtualClient.Actions using System.IO; using System.Linq; using System.Reflection; + using System.Runtime.Intrinsics.X86; using NUnit.Framework; using VirtualClient.Contracts; @@ -15,16 +16,148 @@ namespace VirtualClient.Actions public class MemtierMetricsParserTests { [Test] - public void MemtierMetricsParserParsesTheExpectedMetricsFromMemtierResultsCorrectly_1() + public void MemtierMetricsParserParsesTheExpectedMetricsFromMemtierResultsCorrectlyWithoutPerProcessMetric_1() { + List<string> resultsList = new List<string>(); string results = File.ReadAllText(Path.Combine(MockFixture.ExamplesDirectory, @"Memtier\MemcachedResults_1.txt")); - var parser = new MemtierMetricsParser(results); + resultsList.Add(results); + var parser = new MemtierMetricsParser(false, resultsList); IList<Metric> metrics = parser.Parse(); - Assert.AreEqual(26, metrics.Count); + Assert.AreEqual(138, metrics.Count); + MetricAssert.Exists(metrics, "Throughput_Avg", 48271.29, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "Throughput_Min", 48271.29, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "Throughput_Max", 48271.29, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "Throughput_Stdev", 0, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "Throughput_P80", 48271.29, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "Throughput_Sum", 48271.29, MetricUnit.RequestsPerSec); + + MetricAssert.Exists(metrics, "Hits/sec_Avg", 43444.12); + MetricAssert.Exists(metrics, "Hits/sec_Min", 43444.12); + MetricAssert.Exists(metrics, "Hits/sec_Max", 43444.12); + MetricAssert.Exists(metrics, "Hits/sec_Stdev", 0); + MetricAssert.Exists(metrics, "Hits/sec_P80", 43444.12); + MetricAssert.Exists(metrics, "Hits/sec_Sum", 43444.12); + + MetricAssert.Exists(metrics, "Misses/sec_Avg", 0); + MetricAssert.Exists(metrics, "Misses/sec_Min", 0); + MetricAssert.Exists(metrics, "Misses/sec_Max", 0); + MetricAssert.Exists(metrics, "Misses/sec_Stdev", 0); + MetricAssert.Exists(metrics, "Misses/sec_P80", 0); + MetricAssert.Exists(metrics, "Misses/sec_Sum", 0); + + MetricAssert.Exists(metrics, "Latency-Avg_Avg", 2.62213, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-Avg_Min", 2.62213, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-Avg_Max", 2.62213, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-Avg_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-Avg_P80", 2.62213, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "Latency-P50_Avg", 2.75100, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P50_Min", 2.75100, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P50_Max", 2.75100, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P50_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P50_P80", 2.75100, MetricUnit.Milliseconds); + + + MetricAssert.Exists(metrics, "Latency-P90_Avg", 3.90300, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P90_Min", 3.90300, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P90_Max", 3.90300, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P90_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P90_P80", 3.90300, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "Latency-P95_Avg", 4.41500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P95_Min", 4.41500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P95_Max", 4.41500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P95_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P95_P80", 4.41500, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "Latency-P99_Avg", 7.42300, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99_Min", 7.42300, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99_Max", 7.42300, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99_P80", 7.42300, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "Latency-P99.9_Avg", 29.31100, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99.9_Min", 29.31100, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99.9_Max", 29.31100, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99.9_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99.9_P80", 29.31100, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "GET_Throughput_Avg", 43444.12, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "GET_Throughput_Min", 43444.12, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "GET_Throughput_Max", 43444.12, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "GET_Throughput_Stdev", 0, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "GET_Throughput_P80", 43444.12, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "GET_Throughput_Sum", 43444.12, MetricUnit.RequestsPerSec); + + MetricAssert.Exists(metrics, "GET_Bandwidth_Avg", 3724.01, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "GET_Bandwidth_Min", 3724.01, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "GET_Bandwidth_Max", 3724.01, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "GET_Bandwidth_Stdev", 0, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "GET_Bandwidth_P80", 3724.01, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "GET_Bandwidth_Sum", 3724.01, MetricUnit.KilobytesPerSecond); + + MetricAssert.Exists(metrics, "GET_Latency-Avg_Avg", 2.61979, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-Avg_Min", 2.61979, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-Avg_Max", 2.61979, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-Avg_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-Avg_P80", 2.61979, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "GET_Latency-P50_Avg", 2.73500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P50_Min", 2.73500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P50_Max", 2.73500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P50_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P50_P80", 2.73500, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "GET_Latency-P90_Avg", 3.88700, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P90_Min", 3.88700, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P90_Max", 3.88700, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P90_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P90_P80", 3.88700, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "GET_Latency-P95_Avg", 4.41500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P95_Min", 4.41500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P95_Max", 4.41500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P95_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P95_P80", 4.41500, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "GET_Latency-P99_Avg", 7.42300, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99_Min", 7.42300, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99_Max", 7.42300, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99_P80", 7.42300, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "GET_Latency-P99.9_Avg", 29.31100, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99.9_Min", 29.31100, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99.9_Max", 29.31100, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99.9_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99.9_P80", 29.31100, MetricUnit.Milliseconds); + + + MetricAssert.Exists(metrics, "SET_Throughput_Avg", 4827.17, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "SET_Bandwidth_Avg", 329.45, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "SET_Latency-Avg_Avg", 2.64323, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P50_Avg", 2.83100, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P90_Avg", 3.93500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P95_Avg", 4.47900, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P99_Avg", 7.45500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P99.9_Avg", 29.56700, MetricUnit.Milliseconds); + } + + [Test] + public void MemtierMetricsParserParsesTheExpectedMetricsFromMemtierResultsCorrectlyWithPerProcessMetric_1() + { + List<string> resultsList = new List<string>(); + string results = File.ReadAllText(Path.Combine(MockFixture.ExamplesDirectory, @"Memtier\MemcachedResults_1.txt")); + resultsList.Add(results); + var parser = new MemtierMetricsParser(true, resultsList); + + IList<Metric> metrics = parser.Parse(); + + Assert.AreEqual(164, metrics.Count); + MetricAssert.Exists(metrics, "Throughput", 48271.29, MetricUnit.RequestsPerSec); - MetricAssert.Exists(metrics, "Bandwidth", 4053.46, MetricUnit.KilobytesPerSecond); MetricAssert.Exists(metrics, "Hits/sec", 43444.12); MetricAssert.Exists(metrics, "Misses/sec", 0); MetricAssert.Exists(metrics, "Latency-Avg", 2.62213, MetricUnit.Milliseconds); @@ -51,108 +184,233 @@ public void MemtierMetricsParserParsesTheExpectedMetricsFromMemtierResultsCorrec MetricAssert.Exists(metrics, "SET_Latency-P95", 4.47900, MetricUnit.Milliseconds); MetricAssert.Exists(metrics, "SET_Latency-P99", 7.45500, MetricUnit.Milliseconds); MetricAssert.Exists(metrics, "SET_Latency-P99.9", 29.56700, MetricUnit.Milliseconds); - } + MetricAssert.Exists(metrics, "Throughput_Avg", 48271.29, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "Throughput_Min", 48271.29, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "Throughput_Max", 48271.29, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "Throughput_Stdev", 0, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "Throughput_P80", 48271.29, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "Throughput_Sum", 48271.29, MetricUnit.RequestsPerSec); + + MetricAssert.Exists(metrics, "Hits/sec_Avg", 43444.12); + MetricAssert.Exists(metrics, "Hits/sec_Min", 43444.12); + MetricAssert.Exists(metrics, "Hits/sec_Max", 43444.12); + MetricAssert.Exists(metrics, "Hits/sec_Stdev", 0); + MetricAssert.Exists(metrics, "Hits/sec_P80", 43444.12); + MetricAssert.Exists(metrics, "Hits/sec_Sum", 43444.12); + + MetricAssert.Exists(metrics, "Misses/sec_Avg", 0); + MetricAssert.Exists(metrics, "Misses/sec_Min", 0); + MetricAssert.Exists(metrics, "Misses/sec_Max", 0); + MetricAssert.Exists(metrics, "Misses/sec_Stdev", 0); + MetricAssert.Exists(metrics, "Misses/sec_P80", 0); + MetricAssert.Exists(metrics, "Misses/sec_Sum", 0); + + MetricAssert.Exists(metrics, "Latency-Avg_Avg", 2.62213, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-Avg_Min", 2.62213, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-Avg_Max", 2.62213, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-Avg_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-Avg_P80", 2.62213, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "Latency-P50_Avg", 2.75100, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P50_Min", 2.75100, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P50_Max", 2.75100, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P50_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P50_P80", 2.75100, MetricUnit.Milliseconds); + + + MetricAssert.Exists(metrics, "Latency-P90_Avg", 3.90300, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P90_Min", 3.90300, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P90_Max", 3.90300, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P90_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P90_P80", 3.90300, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "Latency-P95_Avg", 4.41500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P95_Min", 4.41500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P95_Max", 4.41500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P95_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P95_P80", 4.41500, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "Latency-P99_Avg", 7.42300, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99_Min", 7.42300, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99_Max", 7.42300, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99_P80", 7.42300, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "Latency-P99.9_Avg", 29.31100, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99.9_Min", 29.31100, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99.9_Max", 29.31100, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99.9_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99.9_P80", 29.31100, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "GET_Throughput_Avg", 43444.12, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "GET_Throughput_Min", 43444.12, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "GET_Throughput_Max", 43444.12, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "GET_Throughput_Stdev", 0, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "GET_Throughput_P80", 43444.12, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "GET_Throughput_Sum", 43444.12, MetricUnit.RequestsPerSec); + + MetricAssert.Exists(metrics, "GET_Bandwidth_Avg", 3724.01, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "GET_Bandwidth_Min", 3724.01, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "GET_Bandwidth_Max", 3724.01, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "GET_Bandwidth_Stdev", 0, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "GET_Bandwidth_P80", 3724.01, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "GET_Bandwidth_Sum", 3724.01, MetricUnit.KilobytesPerSecond); + + MetricAssert.Exists(metrics, "GET_Latency-Avg_Avg", 2.61979, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-Avg_Min", 2.61979, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-Avg_Max", 2.61979, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-Avg_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-Avg_P80", 2.61979, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "GET_Latency-P50_Avg", 2.73500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P50_Min", 2.73500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P50_Max", 2.73500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P50_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P50_P80", 2.73500, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "GET_Latency-P90_Avg", 3.88700, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P90_Min", 3.88700, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P90_Max", 3.88700, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P90_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P90_P80", 3.88700, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "GET_Latency-P95_Avg", 4.41500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P95_Min", 4.41500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P95_Max", 4.41500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P95_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P95_P80", 4.41500, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "GET_Latency-P99_Avg", 7.42300, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99_Min", 7.42300, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99_Max", 7.42300, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99_P80", 7.42300, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "GET_Latency-P99.9_Avg", 29.31100, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99.9_Min", 29.31100, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99.9_Max", 29.31100, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99.9_Stdev", 0, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99.9_P80", 29.31100, MetricUnit.Milliseconds); + + + MetricAssert.Exists(metrics, "SET_Throughput_Avg", 4827.17, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "SET_Bandwidth_Avg", 329.45, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "SET_Latency-Avg_Avg", 2.64323, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P50_Avg", 2.83100, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P90_Avg", 3.93500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P95_Avg", 4.47900, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P99_Avg", 7.45500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P99.9_Avg", 29.56700, MetricUnit.Milliseconds); + } [Test] public void MemtierMetricsParserParsesTheExpectedMetricsFromMemtierResultsCorrectly_2() { + List<string> resultsList = new List<string>(); string results = File.ReadAllText(Path.Combine(MockFixture.ExamplesDirectory, @"Memtier\MemcachedResults_2.txt")); - var parser = new MemtierMetricsParser(results); + resultsList.Add(results); + var parser = new MemtierMetricsParser(false, resultsList); IList<Metric> metrics = parser.Parse(); - Assert.AreEqual(26, metrics.Count); - MetricAssert.Exists(metrics, "Throughput", 48041.840000000004, MetricUnit.RequestsPerSec); - MetricAssert.Exists(metrics, "Bandwidth", 4034.1975, MetricUnit.KilobytesPerSecond); - MetricAssert.Exists(metrics, "Hits/sec", 43237.6225); - MetricAssert.Exists(metrics, "Misses/sec", 0); - MetricAssert.Exists(metrics, "Latency-Avg", 2.636375, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P50", 2.763, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P90", 3.931, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P95", 4.439, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P99", 7.423, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P99.9", 29.278999999999996, MetricUnit.Milliseconds); - - MetricAssert.Exists(metrics, "GET_Throughput", 43237.6225, MetricUnit.RequestsPerSec); - MetricAssert.Exists(metrics, "GET_Bandwidth", 3706.31, MetricUnit.KilobytesPerSecond); - MetricAssert.Exists(metrics, "GET_Latency-Avg", 2.6338675, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P50", 2.759, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P90", 3.919, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P95", 4.439, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P99", 7.4149999999999991, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P99.9", 29.214999999999996, MetricUnit.Milliseconds); - - MetricAssert.Exists(metrics, "SET_Throughput", 4804.2175000000007, MetricUnit.RequestsPerSec); - MetricAssert.Exists(metrics, "SET_Bandwidth", 327.885, MetricUnit.KilobytesPerSecond); - MetricAssert.Exists(metrics, "SET_Latency-Avg", 2.6589324999999997, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "SET_Latency-P50", 2.831, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "SET_Latency-P90", 3.959, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "SET_Latency-P95", 4.495, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "SET_Latency-P99", 7.551, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "SET_Latency-P99.9", 29.598999999999997, MetricUnit.Milliseconds); + Assert.AreEqual(138, metrics.Count); + MetricAssert.Exists(metrics, "Throughput_Avg", 48041.840000000004, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "Bandwidth_Avg", 4034.1975, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "Hits/sec_Avg", 43237.6225); + MetricAssert.Exists(metrics, "Misses/sec_Avg", 0); + MetricAssert.Exists(metrics, "Latency-Avg_Avg", 2.636375, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P50_Avg", 2.763, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P90_Avg", 3.931, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P95_Avg", 4.439, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99_Avg", 7.423, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99.9_Avg", 29.278999999999996, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "GET_Throughput_Avg", 43237.6225, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "GET_Bandwidth_Avg", 3706.31, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "GET_Latency-Avg_Avg", 2.6338675, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P50_Avg", 2.759, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P90_Avg", 3.919, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P95_Avg", 4.439, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99_Avg", 7.4149999999999991, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99.9_Avg", 29.214999999999996, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "SET_Throughput_Avg", 4804.2175000000007, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "SET_Bandwidth_Avg", 327.885, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "SET_Latency-Avg_Avg", 2.6589324999999997, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P50_Avg", 2.831, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P90_Avg", 3.959, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P95_Avg", 4.495, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P99_Avg", 7.551, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P99.9_Avg", 29.598999999999997, MetricUnit.Milliseconds); } [Test] public void MemtierMetricsParserParsesTheExpectedMetricsFromRedisResultsCorrectly_1() { + List<string> resultsList = new List<string>(); string results = File.ReadAllText(Path.Combine(MockFixture.ExamplesDirectory, @"Memtier\RedisResults_1.txt")); - var parser = new MemtierMetricsParser(results); + resultsList.Add(results); + var parser = new MemtierMetricsParser(false, resultsList); IList<Metric> metrics = parser.Parse(); - Assert.AreEqual(26, metrics.Count); - MetricAssert.Exists(metrics, "Throughput", 355987.03, MetricUnit.RequestsPerSec); - MetricAssert.Exists(metrics, "Bandwidth", 25860.83, MetricUnit.KilobytesPerSecond); - MetricAssert.Exists(metrics, "Hits/sec", 320388.28); - MetricAssert.Exists(metrics, "Misses/sec", 0); - MetricAssert.Exists(metrics, "Latency-Avg", 0.34301, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P50", 0.33500, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P90", 0.47900, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P95", 0.55900, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P99", 0.83900, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P99.9", 1.54300, MetricUnit.Milliseconds); - - MetricAssert.Exists(metrics, "GET_Throughput", 320388.28, MetricUnit.RequestsPerSec); - MetricAssert.Exists(metrics, "GET_Bandwidth", 23118.30, MetricUnit.KilobytesPerSecond); - MetricAssert.Exists(metrics, "GET_Latency-Avg", 0.34300, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P50", 0.33500, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P90", 0.47900, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P95", 0.55900, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P99", 0.83900, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P99.9", 1.54300, MetricUnit.Milliseconds); - - MetricAssert.Exists(metrics, "SET_Throughput", 35598.74, MetricUnit.RequestsPerSec); - MetricAssert.Exists(metrics, "SET_Bandwidth", 2742.53, MetricUnit.KilobytesPerSecond); - MetricAssert.Exists(metrics, "SET_Latency-Avg", 0.34304, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "SET_Latency-P50", 0.33500, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "SET_Latency-P90", 0.47900, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "SET_Latency-P95", 0.55900, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "SET_Latency-P99", 0.83900, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "SET_Latency-P99.9", 1.54300, MetricUnit.Milliseconds); + Assert.AreEqual(138, metrics.Count); + MetricAssert.Exists(metrics, "Throughput_Avg", 355987.03, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "Bandwidth_Avg", 25860.83, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "Hits/sec_Avg", 320388.28); + MetricAssert.Exists(metrics, "Misses/sec_Avg", 0); + MetricAssert.Exists(metrics, "Latency-Avg_Avg", 0.34301, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P50_Avg", 0.33500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P90_Avg", 0.47900, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P95_Avg", 0.55900, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99_Avg", 0.83900, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99.9_Avg", 1.54300, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "GET_Throughput_Avg", 320388.28, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "GET_Bandwidth_Avg", 23118.30, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "GET_Latency-Avg_Avg", 0.34300, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P50_Avg", 0.33500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P90_Avg", 0.47900, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P95_Avg", 0.55900, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99_Avg", 0.83900, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99.9_Avg", 1.54300, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "SET_Throughput_Avg", 35598.74, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "SET_Bandwidth_Avg", 2742.53, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "SET_Latency-Avg_Avg", 0.34304, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P50_Avg", 0.33500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P90_Avg", 0.47900, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P95_Avg", 0.55900, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P99_Avg", 0.83900, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P99.9_Avg", 1.54300, MetricUnit.Milliseconds); } [Test] public void MemtierMetricsParserAssociatesTheCorrectRelativityToTheMetrics() { + List<string> resultsList = new List<string>(); string results = File.ReadAllText(Path.Combine(MockFixture.ExamplesDirectory, @"Memtier\RedisResults_1.txt")); - var parser = new MemtierMetricsParser(results); + resultsList.Add(results); + var parser = new MemtierMetricsParser(false, resultsList); IList<Metric> metrics = parser.Parse(); - if (metrics.Count != 26) + if (metrics.Count != 138) { Assert.Inconclusive(); } - Assert.IsTrue(metrics.Where(m => m.Name.EndsWith("Throughput") || m.Name.EndsWith("Bandwidth")).All(m => m.Relativity == MetricRelativity.HigherIsBetter)); + Assert.IsTrue(metrics.Where(m => m.Name.Contains("Throughput") || m.Name.Contains("Bandwidth")).All(m => m.Relativity == MetricRelativity.HigherIsBetter)); Assert.IsTrue(metrics.Where(m => m.Name.Contains("Latency")).All(m => m.Relativity == MetricRelativity.LowerIsBetter)); } [Test] public void MemtierMetricsParserThrowIfInvalidResultsAreProvided() { + List<string> resultsList = new List<string>(); string results = File.ReadAllText(Path.Combine(MockFixture.ExamplesDirectory, @"Memtier\MemcachedInvalidResults_1.txt")); - var parser = new MemtierMetricsParser(results); + resultsList.Add(results); + var parser = new MemtierMetricsParser(false, resultsList); WorkloadResultsException exception = Assert.Throws<WorkloadResultsException>(() => parser.Parse()); Assert.AreEqual(ErrorReason.InvalidResults, exception.Reason); diff --git a/src/VirtualClient/VirtualClient.Actions.UnitTests/Redis/RedisExecutorTests.cs b/src/VirtualClient/VirtualClient.Actions.UnitTests/Redis/RedisExecutorTests.cs index 0d46056cc0..7e6c913217 100644 --- a/src/VirtualClient/VirtualClient.Actions.UnitTests/Redis/RedisExecutorTests.cs +++ b/src/VirtualClient/VirtualClient.Actions.UnitTests/Redis/RedisExecutorTests.cs @@ -5,6 +5,7 @@ namespace VirtualClient.Actions { using System; using System.Collections.Generic; + using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -66,12 +67,31 @@ public void RedisExecutorThrowsOnUnsupportedDistroAsync() } } + [Test] + [TestCase(PlatformID.Unix, Architecture.X64)] + public void RedisExecutorDoesnotThrowOnSupportedPLatform(PlatformID platform, Architecture architecture) + { + this.SetupDefaultMockBehavior(platform, architecture); + using (TestRedisExecutorExecutor executor = new TestRedisExecutorExecutor(this.fixture.Dependencies, this.fixture.Parameters)) + { + Exception exception = Assert.ThrowsAsync<Exception>( + () => executor.ExecuteAsync(CancellationToken.None)); + } + } + private void SetupDefaultMockBehavior(PlatformID platformID) { this.fixture.Setup(platformID); this.fixture.File.Setup(f => f.Exists(It.IsAny<string>())).Returns(true); this.fixture.ProcessManager.OnCreateProcess = (cmd, args, wd) => this.fixture.Process; } + private void SetupDefaultMockBehavior(PlatformID platformID, Architecture architecture) + { + this.fixture.Setup(platformID, architecture); + this.fixture.File.Setup(f => f.Exists(It.IsAny<string>())).Returns(true); + this.fixture.ProcessManager.OnCreateProcess = (cmd, args, wd) => this.fixture.Process; + } + private class TestRedisExecutorExecutor : RedisExecutor { diff --git a/src/VirtualClient/VirtualClient.Actions/HPLinpack/HPLinpackExecutor.cs b/src/VirtualClient/VirtualClient.Actions/HPLinpack/HPLinpackExecutor.cs index 8a40201326..8e374347b3 100644 --- a/src/VirtualClient/VirtualClient.Actions/HPLinpack/HPLinpackExecutor.cs +++ b/src/VirtualClient/VirtualClient.Actions/HPLinpack/HPLinpackExecutor.cs @@ -386,8 +386,6 @@ await this.fileSystem.File.ReplaceInFileAsync( await this.fileSystem.File.ReplaceInFileAsync( makeFilePath, @"MPlib *=", $"MPlib = /usr/lib/{architecture}-linux-gnu/openmpi/lib/libmpi.so", cancellationToken); - // /usr/lib/x86_64-linux-gnu/openmpi - await this.fileSystem.File.ReplaceInFileAsync( makeFilePath, @"LAinc *=", $"LAinc = -I/usr/lib/{architecture}-linux-gnu", cancellationToken); } diff --git a/src/VirtualClient/VirtualClient.Actions/Memcached/MemcachedExecutor.cs b/src/VirtualClient/VirtualClient.Actions/Memcached/MemcachedExecutor.cs index 07b8bfc3ac..657e8c0de4 100644 --- a/src/VirtualClient/VirtualClient.Actions/Memcached/MemcachedExecutor.cs +++ b/src/VirtualClient/VirtualClient.Actions/Memcached/MemcachedExecutor.cs @@ -213,16 +213,23 @@ protected void InitializeApiClients() /// </summary> protected override bool IsSupported() { - bool isSupported = base.IsSupported() - && (this.Platform == PlatformID.Unix) + if (base.IsSupported()) + { + bool isSupported = (this.Platform == PlatformID.Unix) && (this.CpuArchitecture == Architecture.X64 || this.CpuArchitecture == Architecture.Arm64); - if (!isSupported) + if (!isSupported) + { + this.Logger.LogNotSupported("Memcached", this.Platform, this.CpuArchitecture, EventContext.Persisted()); + } + + return isSupported; + } + else { - this.Logger.LogNotSupported("Memcached", this.Platform, this.CpuArchitecture, EventContext.Persisted()); + return false; } - - return isSupported; + } private async Task ValidatePlatformSupportAsync(CancellationToken cancellationToken) diff --git a/src/VirtualClient/VirtualClient.Actions/Memtier/MemtierBenchmarkClientExecutor.cs b/src/VirtualClient/VirtualClient.Actions/Memtier/MemtierBenchmarkClientExecutor.cs index f46a148355..85734806a3 100644 --- a/src/VirtualClient/VirtualClient.Actions/Memtier/MemtierBenchmarkClientExecutor.cs +++ b/src/VirtualClient/VirtualClient.Actions/Memtier/MemtierBenchmarkClientExecutor.cs @@ -12,9 +12,8 @@ namespace VirtualClient.Actions using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; + using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; - using Microsoft.Extensions.Logging; - using Microsoft.Identity.Client; using Polly; using VirtualClient.Common; using VirtualClient.Common.Contracts; @@ -38,6 +37,9 @@ public class MemtierBenchmarkClientExecutor : MemcachedExecutor }; private List<Metric> aggregatedMetrics = new List<Metric>(); + private List<string> perProcessOutputList = new List<string>(); + private List<string> perProcessCommandList = new List<string>(); + private int startingServerPort; /// <summary> /// Initializes a new instance of the <see cref="MemtierBenchmarkClientExecutor"/> class. @@ -310,137 +312,60 @@ protected override void Validate() /// </summary> protected override bool IsSupported() { - bool isSupported = base.IsSupported() - && (this.Platform == PlatformID.Unix) + if (base.IsSupported()) + { + bool isSupported = (this.Platform == PlatformID.Unix) && (this.CpuArchitecture == Architecture.X64 || this.CpuArchitecture == Architecture.Arm64); - if (!isSupported) + if (!isSupported) + { + this.Logger.LogNotSupported("MemtierBenchmark", this.Platform, this.CpuArchitecture, EventContext.Persisted()); + } + + return isSupported; + } + else { - this.Logger.LogNotSupported("MemtierBenchmark", this.Platform, this.CpuArchitecture, EventContext.Persisted()); + return false; } - - return isSupported; + } - - private void AggregateAndCapturePerProcessMetrics(string results, string commandArguments, DateTime startTime, DateTime endTime, EventContext telemetryContext, CancellationToken cancellationToken) + + private void CaptureMetrics(DateTime startTime, DateTime endTime, EventContext telemetryContext, CancellationToken cancellationToken) { if (!cancellationToken.IsCancellationRequested) { - results.ThrowIfNullOrWhiteSpace(nameof(results)); - try { this.MetadataContract.AddForScenario( "Memtier", - commandArguments, + null, toolVersion: null); this.MetadataContract.Apply(telemetryContext); - // The Memtier workloads run multi-threaded. The lock is meant to ensure we do not have - // race conditions that affect the parsing of the results. - lock (this.lockObject) - { - MemtierMetricsParser resultsParser = new MemtierMetricsParser(results); - IList<Metric> workloadMetrics = resultsParser.Parse(); - this.aggregatedMetrics.AddRange(workloadMetrics); + MemtierMetricsParser memtierMetricsAggregateParser = new MemtierMetricsParser(this.PerProcessMetric, this.perProcessOutputList, this.perProcessCommandList); + IList<Metric> metrics = memtierMetricsAggregateParser.Parse(); + string commandline = "commandline"; - if (this.PerProcessMetric) - { - this.Logger.LogMetrics( + foreach (Metric metric in metrics) + { + this.Logger.LogMetrics( $"Memtier-{this.Benchmark}", this.Scenario, startTime, endTime, - workloadMetrics, + metric.Name, + metric.Value, + metric.Unit, null, - commandArguments, + (string)metric.Metadata[commandline], this.Tags, - telemetryContext); - } - + telemetryContext, + metric.Relativity); } } catch (SchemaException exc) - { - throw new WorkloadResultsException($"Failed to parse workload results file.", exc, ErrorReason.WorkloadResultsParsingFailed); - } - } - } - - private void CaptureAggregateMetrics(string commandArguments, DateTime startTime, DateTime endTime, EventContext telemetryContext, CancellationToken cancellationToken) - { - if (!cancellationToken.IsCancellationRequested) - { - try - { - this.MetadataContract.AddForScenario( - "Memtier", - commandArguments, - toolVersion: null); - - this.MetadataContract.Apply(telemetryContext); - - Dictionary<string, List<double>> metricNameValueListDict = new Dictionary<string, List<double>>(); - Dictionary<string, List<Metric>> metricNameMetricsListDict = new Dictionary<string, List<Metric>>(); - - foreach (var metric in this.aggregatedMetrics) - { - if (metricNameMetricsListDict.ContainsKey(metric.Name)) - { - metricNameValueListDict[metric.Name].Add(metric.Value); - } - else - { - metricNameValueListDict.Add(metric.Name, new List<double>() { metric.Value }); - } - - if (metricNameMetricsListDict.ContainsKey(metric.Name)) - { - metricNameMetricsListDict[metric.Name].Add(metric); - } - else - { - metricNameMetricsListDict.Add(metric.Name, new List<Metric>() { metric }); - } - } - - List<Metric> newAggregateListOfMetrics = new List<Metric>(); - - foreach (var metricKeyValuePair in metricNameValueListDict) - { - double avgValue = metricKeyValuePair.Value.Average(); - double minValue = metricKeyValuePair.Value.Min(); - double maxValue = metricKeyValuePair.Value.Max(); - double stdevValue = Math.Sqrt(metricKeyValuePair.Value.Select(x => Math.Pow(x - avgValue, 2)).Average()); - List<double> sortedValues = metricKeyValuePair.Value.OrderBy(x => x).ToList(); - double p80Value = sortedValues[(int)Math.Ceiling(sortedValues.Count * 0.8) - 1]; - - newAggregateListOfMetrics.Add(new Metric($"{metricKeyValuePair.Key}_Avg", avgValue, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Unit, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Relativity)); - newAggregateListOfMetrics.Add(new Metric($"{metricKeyValuePair.Key}_Min", minValue, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Unit, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Relativity)); - newAggregateListOfMetrics.Add(new Metric($"{metricKeyValuePair.Key}_Max", maxValue, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Unit, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Relativity)); - newAggregateListOfMetrics.Add(new Metric($"{metricKeyValuePair.Key}_Stdev", stdevValue, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Unit, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Relativity)); - newAggregateListOfMetrics.Add(new Metric($"{metricKeyValuePair.Key}_P80", p80Value, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Unit, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Relativity)); - if (metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Unit != MetricUnit.Milliseconds) - { - // For throughput and bandwidth related metrics only. - double sumValue = metricKeyValuePair.Value.Sum(); - newAggregateListOfMetrics.Add(new Metric($"{metricKeyValuePair.Key}_Sum", sumValue, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Unit, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Relativity)); - } - } - - this.Logger.LogMetrics( - $"Memtier-{this.Benchmark}", - this.Scenario, - startTime, - endTime, - newAggregateListOfMetrics, - null, - commandArguments, - this.Tags, - telemetryContext); - } - catch (SchemaException exc) { throw new WorkloadResultsException($"Failed to aggregate workload results.", exc, ErrorReason.WorkloadResultsParsingFailed); } @@ -470,8 +395,9 @@ private Task ExecuteWorkloadsAsync(IPAddress serverIPAddress, ServerState server DateTime startTime = DateTime.UtcNow; + this.startingServerPort = serverState.Ports.First(); foreach (int serverPort in serverState.Ports) - { + { for (int i = 0; i < this.ClientInstances; i++) { // memtier_benchmark Documentation: @@ -500,7 +426,7 @@ private Task ExecuteWorkloadsAsync(IPAddress serverIPAddress, ServerState server await Task.WhenAll(workloadProcesses); DateTime endTime = DateTime.UtcNow; - this.CaptureAggregateMetrics(commandArguments, startTime, endTime, telemetryContext, cancellationToken); + this.CaptureMetrics(startTime, endTime, telemetryContext, cancellationToken); } }); } @@ -538,8 +464,9 @@ private async Task ExecuteWorkloadAsync(int serverPort, string command, string c if (!this.WarmUp) { string output = process.StandardOutput.ToString(); - string parsedCommandArguments = this.ParseCommand(process.FullCommand()); - this.AggregateAndCapturePerProcessMetrics(output, parsedCommandArguments, startTime, DateTime.UtcNow, telemetryContext, cancellationToken); + string parsedCommandArguments = this.ParseCommand(process.FullCommand(), serverPort); + this.perProcessOutputList.Add(output); + this.perProcessCommandList.Add(parsedCommandArguments); } } } @@ -586,7 +513,7 @@ private async Task<ServerState> GetServerStateAsync(IApiClient serverApiClient, return state.Definition; } - private string ParseCommand(string command) + private string ParseCommand(string command, int serverPort) { List<string> excludingRegexList = new List<string> { @@ -607,6 +534,8 @@ private string ParseCommand(string command) command = Regex.Replace(command, @"\s+", " "); // Removes extra spaces + // get the port on which this command is running and + command += @$"--VCpuID {serverPort - this.startingServerPort}"; return command.Trim(); } } diff --git a/src/VirtualClient/VirtualClient.Actions/Memtier/MemtierMetricsParser.cs b/src/VirtualClient/VirtualClient.Actions/Memtier/MemtierMetricsParser.cs index 36c5b1a8eb..4f77c16ad7 100644 --- a/src/VirtualClient/VirtualClient.Actions/Memtier/MemtierMetricsParser.cs +++ b/src/VirtualClient/VirtualClient.Actions/Memtier/MemtierMetricsParser.cs @@ -7,7 +7,9 @@ namespace VirtualClient.Actions using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; + using System.Threading; using VirtualClient; + using VirtualClient.Common.Telemetry; using VirtualClient.Contracts; /// <summary> @@ -16,6 +18,7 @@ namespace VirtualClient.Actions public class MemtierMetricsParser : MetricsParser { private const string SplitAtSpace = @"\s{1,}"; + private const string ProcessResultSectionDelimiter = @"*{6}"; // ============================================================================================================================================================ // Type Ops/sec Hits/sec Misses/sec Avg.Latency p50 Latency p90 Latency p95 Latency p99 Latency p99.9 Latency KB/sec @@ -28,15 +31,17 @@ public class MemtierMetricsParser : MetricsParser private static readonly Regex SetsExpression = new Regex(@"(?<=Sets).*(?=\n)", RegexOptions.IgnoreCase); private static readonly Regex TotalsExpression = new Regex(@"(?<=Totals).*(?=\n)", RegexOptions.IgnoreCase); - private string memtierCommandLine; + private bool perProcessMetric = false; + private List<string> memtierCommandLines = new List<string>(); /// <summary> /// Initializes a new instance of the <see cref="MemtierMetricsParser"/> class. /// </summary> - public MemtierMetricsParser(string rawText, string commandLine = null) - : base(rawText) + public MemtierMetricsParser(bool perProcessMetric, List<string> rawText, List<string> commandLines = null) + : base(string.Join(ProcessResultSectionDelimiter, rawText)) { - this.memtierCommandLine = commandLine; + this.perProcessMetric = perProcessMetric; + this.memtierCommandLines = commandLines; } /// <inheritdoc/> @@ -45,35 +50,52 @@ public override IList<Metric> Parse() try { this.ThrowIfInvalidOutputFormat(); + List<Metric> aggregateMetrics = new List<Metric>(); + List<Metric> combinedMetrics = new List<Metric>(); + List<string> rawTextList = this.RawText.Split(ProcessResultSectionDelimiter).Select(s => s.Trim()).ToList(); - // Example Format: - // - // ALL STATS - // ============================================================================================================================================================ - // Type Ops/sec Hits/sec Misses/sec Avg. Latency p50 Latency p90 Latency p95 Latency p99 Latency p99.9 Latency KB/sec - // ------------------------------------------------------------------------------------------------------------------------------------------------------------ - // Sets 4827.17 --- --- 2.64323 2.83100 3.93500 4.47900 7.45500 29.56700 329.45 - // Gets 43444.12 43444.12 0.00 2.61979 2.73500 3.88700 4.41500 7.42300 29.31100 3724.01 - // Waits 0.00 --- --- --- --- --- --- --- --- --- - // Totals 48271.29 43444.12 0.00 2.62213 2.75100 3.90300 4.41500 7.42300 29.31100 4053.46 - - List<Metric> metrics = new List<Metric>(); - - var totals = MemtierMetricsParser.TotalsExpression.Matches(this.RawText); - MemtierMetricsParser.AddMetrics(metrics, totals); - - var getsResults = MemtierMetricsParser.GetsExpression.Matches(this.RawText); - MemtierMetricsParser.AddMetrics(metrics, getsResults, "GET"); + for (int i = 0; i < rawTextList.Count; i++) + { + string rawText = rawTextList[i]; + // Example Format: + // + // ALL STATS + // ============================================================================================================================================================ + // Type Ops/sec Hits/sec Misses/sec Avg. Latency p50 Latency p90 Latency p95 Latency p99 Latency p99.9 Latency KB/sec + // ------------------------------------------------------------------------------------------------------------------------------------------------------------ + // Sets 4827.17 --- --- 2.64323 2.83100 3.93500 4.47900 7.45500 29.56700 329.45 + // Gets 43444.12 43444.12 0.00 2.61979 2.73500 3.88700 4.41500 7.42300 29.31100 3724.01 + // Waits 0.00 --- --- --- --- --- --- --- --- --- + // Totals 48271.29 43444.12 0.00 2.62213 2.75100 3.90300 4.41500 7.42300 29.31100 4053.46 + + List<Metric> perProcessMetrics = new List<Metric>(); + + var totals = MemtierMetricsParser.TotalsExpression.Matches(rawText); + MemtierMetricsParser.AddMetrics(perProcessMetrics, totals); + + var getsResults = MemtierMetricsParser.GetsExpression.Matches(rawText); + MemtierMetricsParser.AddMetrics(perProcessMetrics, getsResults, "GET"); + + var setsResults = MemtierMetricsParser.SetsExpression.Matches(rawText); + MemtierMetricsParser.AddMetrics(perProcessMetrics, setsResults, "SET"); + + if (this.memtierCommandLines != null) + { + string memtiercommandLine = this.memtierCommandLines[i]; + perProcessMetrics.AddMetadata(MemtierMetricsParser.GetMetadata(memtiercommandLine)); + } - var setsResults = MemtierMetricsParser.SetsExpression.Matches(this.RawText); - MemtierMetricsParser.AddMetrics(metrics, setsResults, "SET"); + combinedMetrics.AddRange(perProcessMetrics); - if (!string.IsNullOrWhiteSpace(this.memtierCommandLine)) - { - metrics.AddMetadata(MemtierMetricsParser.GetMetadata(this.memtierCommandLine)); + if (this.perProcessMetric) + { + aggregateMetrics.AddRange(perProcessMetrics); + } } - return metrics; + aggregateMetrics.AddRange(MemtierMetricsParser.AggregateMetrics(combinedMetrics)); + + return aggregateMetrics; } catch (Exception exc) { @@ -262,6 +284,11 @@ private static IDictionary<string, IConvertible> GetMetadata(string commandLine) { IDictionary<string, IConvertible> metadata = new Dictionary<string, IConvertible>(); + if (!string.IsNullOrWhiteSpace(commandLine)) + { + metadata["commandline"] = commandLine; + } + Match protocol = Regex.Match(commandLine, @"--protocol\s*=*([a-z0-9_-]+)", RegexOptions.IgnoreCase); if (protocol.Success) { @@ -319,6 +346,59 @@ private static IDictionary<string, IConvertible> GetMetadata(string commandLine) return metadata; } + private static List<Metric> AggregateMetrics(List<Metric> combinedMetrics) + { + Dictionary<string, List<double>> metricNameValueListDict = new Dictionary<string, List<double>>(); + Dictionary<string, List<Metric>> metricNameMetricsListDict = new Dictionary<string, List<Metric>>(); + + foreach (var metric in combinedMetrics) + { + if (metricNameMetricsListDict.ContainsKey(metric.Name)) + { + metricNameValueListDict[metric.Name].Add(metric.Value); + } + else + { + metricNameValueListDict.Add(metric.Name, new List<double>() { metric.Value }); + } + + if (metricNameMetricsListDict.ContainsKey(metric.Name)) + { + metricNameMetricsListDict[metric.Name].Add(metric); + } + else + { + metricNameMetricsListDict.Add(metric.Name, new List<Metric>() { metric }); + } + } + + List<Metric> newAggregateListOfMetrics = new List<Metric>(); + + foreach (var metricKeyValuePair in metricNameValueListDict) + { + double avgValue = metricKeyValuePair.Value.Average(); + double minValue = metricKeyValuePair.Value.Min(); + double maxValue = metricKeyValuePair.Value.Max(); + double stdevValue = Math.Sqrt(metricKeyValuePair.Value.Select(x => Math.Pow(x - avgValue, 2)).Average()); + List<double> sortedValues = metricKeyValuePair.Value.OrderBy(x => x).ToList(); + double p80Value = sortedValues[(int)Math.Ceiling(sortedValues.Count * 0.8) - 1]; + + newAggregateListOfMetrics.Add(new Metric($"{metricKeyValuePair.Key}_Avg", avgValue, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Unit, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Relativity)); + newAggregateListOfMetrics.Add(new Metric($"{metricKeyValuePair.Key}_Min", minValue, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Unit, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Relativity)); + newAggregateListOfMetrics.Add(new Metric($"{metricKeyValuePair.Key}_Max", maxValue, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Unit, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Relativity)); + newAggregateListOfMetrics.Add(new Metric($"{metricKeyValuePair.Key}_Stdev", stdevValue, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Unit, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Relativity)); + newAggregateListOfMetrics.Add(new Metric($"{metricKeyValuePair.Key}_P80", p80Value, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Unit, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Relativity)); + if (metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Unit != MetricUnit.Milliseconds) + { + // For throughput and bandwidth related metrics only. + double sumValue = metricKeyValuePair.Value.Sum(); + newAggregateListOfMetrics.Add(new Metric($"{metricKeyValuePair.Key}_Sum", sumValue, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Unit, metricNameMetricsListDict[metricKeyValuePair.Key].ElementAt(0).Relativity)); + } + } + + return newAggregateListOfMetrics; + } + private void ThrowIfInvalidOutputFormat() { if (this.RawText == string.Empty || this.RawText == null || !this.RawText.Contains("Totals")) diff --git a/src/VirtualClient/VirtualClient.Actions/Redis/RedisExecutor.cs b/src/VirtualClient/VirtualClient.Actions/Redis/RedisExecutor.cs index 4c4fb99eda..9746bab5cd 100644 --- a/src/VirtualClient/VirtualClient.Actions/Redis/RedisExecutor.cs +++ b/src/VirtualClient/VirtualClient.Actions/Redis/RedisExecutor.cs @@ -145,16 +145,22 @@ protected override async Task InitializeAsync(EventContext telemetryContext, Can /// </summary> protected override bool IsSupported() { - bool isSupported = base.IsSupported() - && (this.Platform == PlatformID.Unix) + if (base.IsSupported()) + { + bool isSupported = (this.Platform == PlatformID.Unix) && (this.CpuArchitecture == Architecture.X64 || this.CpuArchitecture == Architecture.Arm64); - if (!isSupported) + if (!isSupported) + { + this.Logger.LogNotSupported("Redis", this.Platform, this.CpuArchitecture, EventContext.Persisted()); + } + + return isSupported; + } + else { - this.Logger.LogNotSupported("Redis", this.Platform, this.CpuArchitecture, EventContext.Persisted()); + return false; } - - return isSupported; } /// <summary> diff --git a/src/VirtualClient/VirtualClient.Main/profiles/PERF-MEMCACHED.json b/src/VirtualClient/VirtualClient.Main/profiles/PERF-MEMCACHED.json index 088d57cb57..4c22909ae5 100644 --- a/src/VirtualClient/VirtualClient.Main/profiles/PERF-MEMCACHED.json +++ b/src/VirtualClient/VirtualClient.Main/profiles/PERF-MEMCACHED.json @@ -6,13 +6,14 @@ "SupportedOperatingSystems": "Ubuntu", "Notes_ConnectionLimits": "Each Memtier benchmark action will establish (--threads x --clients) connections against the Memcached server for each client instance/process. Ensure that the server-side OS does not place a limit on connections that might exceed this (e.g. ulimit -Sn on Linux)." }, - "Parameters": { - "ServerPort": 6379, - "ServerMaxConnections": 16384, - "ClientInstances": 8, - "Duration": "00:02:00", - "Username": null - }, + "Parameters": { + "ServerPort": 6379, + "ServerMaxConnections": 16384, + "ClientInstances": 8, + "Duration": "00:02:00", + "Username": null, + "PerProcessMetric": false + }, "Actions": [ { "Type": "MemcachedServerExecutor", @@ -30,135 +31,147 @@ }, { "Type": "MemtierBenchmarkClientExecutor", - "Parameters": { - "Scenario": "warmup_32b_pool", - "PackageName": "memtier", - "CommandLine": "--protocol memcache_text --threads 1 --clients 1 --ratio 1:0 --data-size 32 --pipeline 32 --key-minimum 1 --key-maximum 10000000 --key-prefix sm --key-pattern S:S --run-count 1 --requests=allkeys", - "ClientInstances": 1, - "WarmUp": true, - "Role": "Client" - } + "Parameters": { + "Scenario": "warmup_32b_pool", + "PackageName": "memtier", + "CommandLine": "--protocol memcache_text --threads 1 --clients 1 --ratio 1:0 --data-size 32 --pipeline 32 --key-minimum 1 --key-maximum 10000000 --key-prefix sm --key-pattern S:S --run-count 1 --requests=allkeys", + "ClientInstances": 1, + "WarmUp": true, + "PerProcessMetric": "$.Parameters.PerProcessMetric", + "Role": "Client" + } }, { "Type": "MemtierBenchmarkClientExecutor", - "Parameters": { - "Scenario": "warmup_1kb_pool", - "PackageName": "memtier", - "CommandLine": "--protocol memcache_text --threads 1 --clients 1 --ratio 1:0 --data-size 1024 --pipeline 32 --key-minimum 1 --key-maximum 1000000 --key-prefix med --key-pattern S:S --run-count 1 --requests=allkeys", - "ClientInstances": 1, - "WarmUp": true, - "Role": "Client" - } + "Parameters": { + "Scenario": "warmup_1kb_pool", + "PackageName": "memtier", + "CommandLine": "--protocol memcache_text --threads 1 --clients 1 --ratio 1:0 --data-size 1024 --pipeline 32 --key-minimum 1 --key-maximum 1000000 --key-prefix med --key-pattern S:S --run-count 1 --requests=allkeys", + "ClientInstances": 1, + "WarmUp": true, + "PerProcessMetric": "$.Parameters.PerProcessMetric", + "Role": "Client" + } }, { "Type": "MemtierBenchmarkClientExecutor", - "Parameters": { - "Scenario": "warmup_10kb_pool", - "PackageName": "memtier", - "CommandLine": "--protocol memcache_text --threads 1 --clients 1 --ratio 1:0 --data-size 10240 --pipeline 32 --key-minimum 1 --key-maximum 100000 --key-prefix lg --key-pattern S:S --run-count 1 --requests=allkeys", - "ClientInstances": 1, - "WarmUp": true, - "Role": "Client" - } + "Parameters": { + "Scenario": "warmup_10kb_pool", + "PackageName": "memtier", + "CommandLine": "--protocol memcache_text --threads 1 --clients 1 --ratio 1:0 --data-size 10240 --pipeline 32 --key-minimum 1 --key-maximum 100000 --key-prefix lg --key-pattern S:S --run-count 1 --requests=allkeys", + "ClientInstances": 1, + "WarmUp": true, + "PerProcessMetric": "$.Parameters.PerProcessMetric", + "Role": "Client" + } }, { "Type": "MemtierBenchmarkClientExecutor", - "Parameters": { - "Scenario": "memtier_8t_16c_32b_r1:1", - "PackageName": "memtier", - "CommandLine": "--protocol memcache_text --threads 8 --clients 16 --ratio 1:1 --data-size 32 --pipeline 100 --key-minimum 1 --key-maximum 10000000 --key-prefix sm --key-pattern R:R --run-count 1 --print-percentiles 50,90,95,99,99.9 --random-data --test-time {Duration}", - "ClientInstances": "$.Parameters.ClientInstances", - "Duration": "$.Parameters.Duration", - "Role": "Client" - } + "Parameters": { + "Scenario": "memtier_8t_16c_32b_r1:1", + "PackageName": "memtier", + "CommandLine": "--protocol memcache_text --threads 8 --clients 16 --ratio 1:1 --data-size 32 --pipeline 100 --key-minimum 1 --key-maximum 10000000 --key-prefix sm --key-pattern R:R --run-count 1 --print-percentiles 50,90,95,99,99.9 --random-data --test-time {Duration}", + "ClientInstances": "$.Parameters.ClientInstances", + "Duration": "$.Parameters.Duration", + "PerProcessMetric": "$.Parameters.PerProcessMetric", + "Role": "Client" + } }, { "Type": "MemtierBenchmarkClientExecutor", - "Parameters": { - "Scenario": "memtier_8t_16c_1kb_r1:1", - "PackageName": "memtier", - "CommandLine": "--protocol memcache_text --threads 8 --clients 16 --ratio 1:1 --data-size 1024 --pipeline 100 --key-minimum 1 --key-maximum 1000000 --key-prefix med --key-pattern R:R --run-count 1 --print-percentiles 50,90,95,99,99.9 --random-data --test-time {Duration}", - "ClientInstances": "$.Parameters.ClientInstances", - "Duration": "$.Parameters.Duration", - "Role": "Client" - } + "Parameters": { + "Scenario": "memtier_8t_16c_1kb_r1:1", + "PackageName": "memtier", + "CommandLine": "--protocol memcache_text --threads 8 --clients 16 --ratio 1:1 --data-size 1024 --pipeline 100 --key-minimum 1 --key-maximum 1000000 --key-prefix med --key-pattern R:R --run-count 1 --print-percentiles 50,90,95,99,99.9 --random-data --test-time {Duration}", + "ClientInstances": "$.Parameters.ClientInstances", + "Duration": "$.Parameters.Duration", + "PerProcessMetric": "$.Parameters.PerProcessMetric", + "Role": "Client" + } }, { "Type": "MemtierBenchmarkClientExecutor", - "Parameters": { - "Scenario": "memtier_8t_16c_10kb_r1:1", - "PackageName": "memtier", - "CommandLine": "--protocol memcache_text --threads 8 --clients 16 --ratio 1:1 --data-size 10240 --pipeline 100 --key-minimum 1 --key-maximum 100000 --key-prefix lg --key-pattern R:R --run-count 1 --print-percentiles 50,90,95,99,99.9 --random-data --test-time {Duration}", - "ClientInstances": "$.Parameters.ClientInstances", - "Duration": "$.Parameters.Duration", - "Role": "Client" - } + "Parameters": { + "Scenario": "memtier_8t_16c_10kb_r1:1", + "PackageName": "memtier", + "CommandLine": "--protocol memcache_text --threads 8 --clients 16 --ratio 1:1 --data-size 10240 --pipeline 100 --key-minimum 1 --key-maximum 100000 --key-prefix lg --key-pattern R:R --run-count 1 --print-percentiles 50,90,95,99,99.9 --random-data --test-time {Duration}", + "ClientInstances": "$.Parameters.ClientInstances", + "Duration": "$.Parameters.Duration", + "PerProcessMetric": "$.Parameters.PerProcessMetric", + "Role": "Client" + } }, { "Type": "MemtierBenchmarkClientExecutor", - "Parameters": { - "Scenario": "memtier_16t_16c_32b_r1:1", - "PackageName": "memtier", - "CommandLine": "--protocol memcache_text --threads 16 --clients 16 --ratio 1:1 --data-size 32 --pipeline 100 --key-minimum 1 --key-maximum 10000000 --key-prefix sm --key-pattern R:R --run-count 1 --print-percentiles 50,90,95,99,99.9 --random-data --test-time {Duration}", - "ClientInstances": "$.Parameters.ClientInstances", - "Duration": "$.Parameters.Duration", - "Role": "Client" - } + "Parameters": { + "Scenario": "memtier_16t_16c_32b_r1:1", + "PackageName": "memtier", + "CommandLine": "--protocol memcache_text --threads 16 --clients 16 --ratio 1:1 --data-size 32 --pipeline 100 --key-minimum 1 --key-maximum 10000000 --key-prefix sm --key-pattern R:R --run-count 1 --print-percentiles 50,90,95,99,99.9 --random-data --test-time {Duration}", + "ClientInstances": "$.Parameters.ClientInstances", + "Duration": "$.Parameters.Duration", + "PerProcessMetric": "$.Parameters.PerProcessMetric", + "Role": "Client" + } }, { "Type": "MemtierBenchmarkClientExecutor", - "Parameters": { - "Scenario": "memtier_16t_16c_1kb_r1:1", - "PackageName": "memtier", - "CommandLine": "--protocol memcache_text --threads 16 --clients 16 --ratio 1:1 --data-size 1024 --pipeline 100 --key-minimum 1 --key-maximum 1000000 --key-prefix med --key-pattern R:R --run-count 1 --print-percentiles 50,90,95,99,99.9 --random-data --test-time {Duration}", - "ClientInstances": "$.Parameters.ClientInstances", - "Duration": "$.Parameters.Duration", - "Role": "Client" - } + "Parameters": { + "Scenario": "memtier_16t_16c_1kb_r1:1", + "PackageName": "memtier", + "CommandLine": "--protocol memcache_text --threads 16 --clients 16 --ratio 1:1 --data-size 1024 --pipeline 100 --key-minimum 1 --key-maximum 1000000 --key-prefix med --key-pattern R:R --run-count 1 --print-percentiles 50,90,95,99,99.9 --random-data --test-time {Duration}", + "ClientInstances": "$.Parameters.ClientInstances", + "Duration": "$.Parameters.Duration", + "PerProcessMetric": "$.Parameters.PerProcessMetric", + "Role": "Client" + } }, { "Type": "MemtierBenchmarkClientExecutor", - "Parameters": { - "Scenario": "memtier_16t_16c_10kb_r1:1", - "PackageName": "memtier", - "CommandLine": "--protocol memcache_text --threads 16 --clients 16 --ratio 1:1 --data-size 10240 --pipeline 100 --key-minimum 1 --key-maximum 100000 --key-prefix lg --key-pattern R:R --run-count 1 --print-percentiles 50,90,95,99,99.9 --random-data --test-time {Duration}", - "ClientInstances": "$.Parameters.ClientInstances", - "Duration": "$.Parameters.Duration", - "Role": "Client" - } + "Parameters": { + "Scenario": "memtier_16t_16c_10kb_r1:1", + "PackageName": "memtier", + "CommandLine": "--protocol memcache_text --threads 16 --clients 16 --ratio 1:1 --data-size 10240 --pipeline 100 --key-minimum 1 --key-maximum 100000 --key-prefix lg --key-pattern R:R --run-count 1 --print-percentiles 50,90,95,99,99.9 --random-data --test-time {Duration}", + "ClientInstances": "$.Parameters.ClientInstances", + "Duration": "$.Parameters.Duration", + "PerProcessMetric": "$.Parameters.PerProcessMetric", + "Role": "Client" + } }, { "Type": "MemtierBenchmarkClientExecutor", - "Parameters": { - "Scenario": "memtier_32t_16c_32b_r1:1", - "PackageName": "memtier", - "CommandLine": "--protocol memcache_text --threads 32 --clients 16 --ratio 1:1 --data-size 32 --pipeline 100 --key-minimum 1 --key-maximum 10000000 --key-prefix sm --key-pattern R:R --run-count 1 --print-percentiles 50,90,95,99,99.9 --random-data --test-time {Duration}", - "ClientInstances": "$.Parameters.ClientInstances", - "Duration": "$.Parameters.Duration", - "Role": "Client" - } + "Parameters": { + "Scenario": "memtier_32t_16c_32b_r1:1", + "PackageName": "memtier", + "CommandLine": "--protocol memcache_text --threads 32 --clients 16 --ratio 1:1 --data-size 32 --pipeline 100 --key-minimum 1 --key-maximum 10000000 --key-prefix sm --key-pattern R:R --run-count 1 --print-percentiles 50,90,95,99,99.9 --random-data --test-time {Duration}", + "ClientInstances": "$.Parameters.ClientInstances", + "Duration": "$.Parameters.Duration", + "PerProcessMetric": "$.Parameters.PerProcessMetric", + "Role": "Client" + } }, { "Type": "MemtierBenchmarkClientExecutor", - "Parameters": { - "Scenario": "memtier_32t_16c_1kb_r1:1", - "PackageName": "memtier", - "CommandLine": "--protocol memcache_text --threads 32 --clients 16 --ratio 1:1 --data-size 1024 --pipeline 100 --key-minimum 1 --key-maximum 1000000 --key-prefix med --key-pattern R:R --run-count 1 --print-percentiles 50,90,95,99,99.9 --random-data --test-time {Duration}", - "ClientInstances": "$.Parameters.ClientInstances", - "Duration": "$.Parameters.Duration", - "Role": "Client" - } + "Parameters": { + "Scenario": "memtier_32t_16c_1kb_r1:1", + "PackageName": "memtier", + "CommandLine": "--protocol memcache_text --threads 32 --clients 16 --ratio 1:1 --data-size 1024 --pipeline 100 --key-minimum 1 --key-maximum 1000000 --key-prefix med --key-pattern R:R --run-count 1 --print-percentiles 50,90,95,99,99.9 --random-data --test-time {Duration}", + "ClientInstances": "$.Parameters.ClientInstances", + "Duration": "$.Parameters.Duration", + "PerProcessMetric": "$.Parameters.PerProcessMetric", + "Role": "Client" + } }, { "Type": "MemtierBenchmarkClientExecutor", - "Parameters": { - "Scenario": "memtier_32t_16c_10kb_r1:1", - "PackageName": "memtier", - "CommandLine": "--protocol memcache_text --threads 32 --clients 16 --ratio 1:1 --data-size 10240 --pipeline 100 --key-minimum 1 --key-maximum 100000 --key-prefix lg --key-pattern R:R --run-count 1 --print-percentiles 50,90,95,99,99.9 --random-data --test-time {Duration}", - "ClientInstances": "$.Parameters.ClientInstances", - "Duration": "$.Parameters.Duration", - "Role": "Client" - } + "Parameters": { + "Scenario": "memtier_32t_16c_10kb_r1:1", + "PackageName": "memtier", + "CommandLine": "--protocol memcache_text --threads 32 --clients 16 --ratio 1:1 --data-size 10240 --pipeline 100 --key-minimum 1 --key-maximum 100000 --key-prefix lg --key-pattern R:R --run-count 1 --print-percentiles 50,90,95,99,99.9 --random-data --test-time {Duration}", + "ClientInstances": "$.Parameters.ClientInstances", + "Duration": "$.Parameters.Duration", + "PerProcessMetric": "$.Parameters.PerProcessMetric", + "Role": "Client" + } } ], "Dependencies": [ diff --git a/src/VirtualClient/VirtualClient.Main/profiles/PERF-REDIS.json b/src/VirtualClient/VirtualClient.Main/profiles/PERF-REDIS.json index 66211b6e1f..08fd79a206 100644 --- a/src/VirtualClient/VirtualClient.Main/profiles/PERF-REDIS.json +++ b/src/VirtualClient/VirtualClient.Main/profiles/PERF-REDIS.json @@ -55,6 +55,7 @@ "WarmUp": true, "IsTLSEnabled": "$.Parameters.IsTLSEnabled", "RedisResourcesPackageName": "redisresources", + "PerProcessMetric": "$.Parameters.PerProcessMetric", "Role": "Client" } }, @@ -68,6 +69,7 @@ "WarmUp": true, "IsTLSEnabled": "$.Parameters.IsTLSEnabled", "RedisResourcesPackageName": "redisresources", + "PerProcessMetric": "$.Parameters.PerProcessMetric", "Role": "Client" } }, @@ -81,6 +83,7 @@ "Duration": "$.Parameters.Duration", "IsTLSEnabled": "$.Parameters.IsTLSEnabled", "RedisResourcesPackageName": "redisresources", + "PerProcessMetric": "$.Parameters.PerProcessMetric", "Role": "Client" } }, @@ -94,6 +97,7 @@ "Duration": "$.Parameters.Duration", "IsTLSEnabled": "$.Parameters.IsTLSEnabled", "RedisResourcesPackageName": "redisresources", + "PerProcessMetric": "$.Parameters.PerProcessMetric", "Role": "Client" } }, @@ -107,6 +111,7 @@ "Duration": "$.Parameters.Duration", "IsTLSEnabled": "$.Parameters.IsTLSEnabled", "RedisResourcesPackageName": "redisresources", + "PerProcessMetric": "$.Parameters.PerProcessMetric", "Role": "Client" } }, @@ -120,6 +125,7 @@ "Duration": "$.Parameters.Duration", "IsTLSEnabled": "$.Parameters.IsTLSEnabled", "RedisResourcesPackageName": "redisresources", + "PerProcessMetric": "$.Parameters.PerProcessMetric", "Role": "Client" } }, @@ -133,6 +139,7 @@ "Duration": "$.Parameters.Duration", "IsTLSEnabled": "$.Parameters.IsTLSEnabled", "RedisResourcesPackageName": "redisresources", + "PerProcessMetric": "$.Parameters.PerProcessMetric", "Role": "Client" } }, @@ -146,6 +153,7 @@ "Duration": "$.Parameters.Duration", "IsTLSEnabled": "$.Parameters.IsTLSEnabled", "RedisResourcesPackageName": "redisresources", + "PerProcessMetric": "$.Parameters.PerProcessMetric", "Role": "Client" } }, @@ -159,6 +167,7 @@ "Duration": "$.Parameters.Duration", "IsTLSEnabled": "$.Parameters.IsTLSEnabled", "RedisResourcesPackageName": "redisresources", + "PerProcessMetric": "$.Parameters.PerProcessMetric", "Role": "Client" } }, @@ -172,6 +181,7 @@ "Duration": "$.Parameters.Duration", "IsTLSEnabled": "$.Parameters.IsTLSEnabled", "RedisResourcesPackageName": "redisresources", + "PerProcessMetric": "$.Parameters.PerProcessMetric", "Role": "Client" } }, @@ -185,6 +195,7 @@ "Duration": "$.Parameters.Duration", "IsTLSEnabled": "$.Parameters.IsTLSEnabled", "RedisResourcesPackageName": "redisresources", + "PerProcessMetric": "$.Parameters.PerProcessMetric", "Role": "Client" } } From 407e6df942be70fce9123b72dc53fe09d0e52faf Mon Sep 17 00:00:00 2001 From: nikhitha malkapuram <nmalkapuram@microsoft.com> Date: Fri, 3 Nov 2023 02:49:49 +0530 Subject: [PATCH 4/7] resolving functional testing, adding documentation, resolving issue with transient error at server side --- .../Examples/Memtier/RedisResults_3.txt | 392 ++++++++++++++++++ .../Memtier/MemtierMetricsParserTests.cs | 43 ++ .../Memcached/MemcachedServerExecutor.cs | 2 + .../Memtier/MemtierBenchmarkClientExecutor.cs | 26 +- .../Memtier/MemtierMetricsParser.cs | 8 +- .../Redis/RedisServerExecutor.cs | 2 + website/docs/workloads/memcached/memcached.md | 233 +++++++---- .../docs/workloads/redis/redis-profiles.md | 2 + website/docs/workloads/redis/redis.md | 320 +++++++------- 9 files changed, 744 insertions(+), 284 deletions(-) create mode 100644 src/VirtualClient/VirtualClient.Actions.UnitTests/Examples/Memtier/RedisResults_3.txt diff --git a/src/VirtualClient/VirtualClient.Actions.UnitTests/Examples/Memtier/RedisResults_3.txt b/src/VirtualClient/VirtualClient.Actions.UnitTests/Examples/Memtier/RedisResults_3.txt new file mode 100644 index 0000000000..68e21c1e3f --- /dev/null +++ b/src/VirtualClient/VirtualClient.Actions.UnitTests/Examples/Memtier/RedisResults_3.txt @@ -0,0 +1,392 @@ +6379 +4 Threads +1 Connections per thread +30 Seconds + + +ALL STATS +============================================================================================================================================================ +Type Ops/sec Hits/sec Misses/sec Avg. Latency p50 Latency p90 Latency p95 Latency p99 Latency p99.9 Latency KB/sec +------------------------------------------------------------------------------------------------------------------------------------------------------------ +Sets 35598.74 --- --- 0.34304 0.33500 0.47900 0.55900 0.83900 1.54300 2742.53 +Gets 320388.28 320388.28 0.00 0.34300 0.33500 0.47900 0.55900 0.83900 1.54300 23118.30 +Waits 0.00 --- --- --- --- --- --- --- --- --- +Totals 355987.03 320388.28 0.00 0.34301 0.33500 0.47900 0.55900 0.83900 1.54300 25860.83 + + +Request Latency Distribution +Type <= msec Percent +------------------------------------------------------------------------ +SET 0.119 0.000 +SET 0.207 5.000 +SET 0.215 10.000 +SET 0.231 15.000 +SET 0.239 20.000 +SET 0.255 25.000 +SET 0.263 30.000 +SET 0.271 35.000 +SET 0.287 40.000 +SET 0.295 45.000 +SET 0.335 50.000 +SET 0.343 52.500 +SET 0.351 55.000 +SET 0.351 57.500 +SET 0.359 60.000 +SET 0.359 62.500 +SET 0.367 65.000 +SET 0.367 67.500 +SET 0.375 70.000 +SET 0.375 72.500 +SET 0.383 75.000 +SET 0.399 76.250 +SET 0.423 77.500 +SET 0.439 78.750 +SET 0.447 80.000 +SET 0.447 81.250 +SET 0.455 82.500 +SET 0.455 83.750 +SET 0.463 85.000 +SET 0.463 86.250 +SET 0.463 87.500 +SET 0.471 88.125 +SET 0.471 88.750 +SET 0.471 89.375 +SET 0.479 90.000 +SET 0.487 90.625 +SET 0.511 91.250 +SET 0.527 91.875 +SET 0.535 92.500 +SET 0.543 93.125 +SET 0.543 93.750 +SET 0.551 94.062 +SET 0.551 94.375 +SET 0.551 94.688 +SET 0.559 95.000 +SET 0.559 95.312 +SET 0.567 95.625 +SET 0.583 95.938 +SET 0.599 96.250 +SET 0.607 96.562 +SET 0.615 96.875 +SET 0.615 97.031 +SET 0.623 97.188 +SET 0.623 97.344 +SET 0.631 97.500 +SET 0.639 97.656 +SET 0.655 97.812 +SET 0.671 97.969 +SET 0.695 98.125 +SET 0.719 98.281 +SET 0.743 98.438 +SET 0.751 98.516 +SET 0.759 98.594 +SET 0.767 98.672 +SET 0.783 98.750 +SET 0.799 98.828 +SET 0.823 98.906 +SET 0.839 98.984 +SET 0.855 99.062 +SET 0.863 99.141 +SET 0.887 99.219 +SET 0.895 99.258 +SET 0.911 99.297 +SET 0.919 99.336 +SET 0.927 99.375 +SET 0.935 99.414 +SET 0.943 99.453 +SET 0.951 99.492 +SET 0.959 99.531 +SET 0.975 99.570 +SET 0.991 99.609 +SET 0.999 99.629 +SET 1.007 99.648 +SET 1.015 99.668 +SET 1.023 99.688 +SET 1.039 99.707 +SET 1.047 99.727 +SET 1.055 99.746 +SET 1.071 99.766 +SET 1.087 99.785 +SET 1.111 99.805 +SET 1.119 99.814 +SET 1.127 99.824 +SET 1.143 99.834 +SET 1.167 99.844 +SET 1.199 99.854 +SET 1.223 99.863 +SET 1.271 99.873 +SET 1.335 99.883 +SET 1.415 99.893 +SET 1.575 99.902 +SET 1.671 99.907 +SET 1.743 99.912 +SET 1.815 99.917 +SET 1.887 99.922 +SET 1.935 99.927 +SET 2.031 99.932 +SET 2.095 99.937 +SET 2.207 99.941 +SET 2.303 99.946 +SET 2.399 99.951 +SET 2.431 99.954 +SET 2.463 99.956 +SET 2.511 99.958 +SET 2.543 99.961 +SET 2.575 99.963 +SET 2.655 99.966 +SET 2.831 99.968 +SET 2.911 99.971 +SET 3.103 99.973 +SET 3.215 99.976 +SET 3.455 99.977 +SET 3.727 99.978 +SET 3.903 99.979 +SET 4.031 99.980 +SET 4.191 99.982 +SET 4.255 99.983 +SET 4.287 99.984 +SET 4.319 99.985 +SET 4.351 99.987 +SET 4.383 99.988 +SET 4.479 99.988 +SET 4.767 99.989 +SET 4.863 99.990 +SET 5.087 99.990 +SET 5.151 99.991 +SET 5.247 99.991 +SET 5.343 99.992 +SET 5.503 99.993 +SET 5.567 99.993 +SET 5.599 99.994 +SET 5.759 99.994 +SET 5.791 99.995 +SET 6.079 99.995 +SET 6.111 99.995 +SET 6.143 99.995 +SET 6.335 99.996 +SET 6.463 99.996 +SET 6.463 99.996 +SET 6.527 99.997 +SET 7.231 99.997 +SET 7.231 99.997 +SET 7.263 99.997 +SET 7.263 99.997 +SET 7.263 99.998 +SET 7.743 99.998 +SET 7.775 99.998 +SET 7.775 99.998 +SET 7.935 99.998 +SET 7.935 99.998 +SET 7.935 99.998 +SET 8.255 99.999 +SET 8.255 99.999 +SET 8.255 99.999 +SET 8.255 99.999 +SET 8.319 99.999 +SET 8.319 99.999 +SET 8.319 99.999 +SET 8.319 99.999 +SET 8.319 99.999 +SET 8.319 99.999 +SET 8.319 99.999 +SET 8.319 99.999 +SET 10.943 99.999 +SET 10.943 99.999 +SET 10.943 99.999 +SET 10.943 99.999 +SET 10.943 100.000 +SET 10.943 100.000 +SET 10.943 100.000 +SET 10.943 100.000 +SET 11.327 100.000 +SET 11.327 100.000 +--- +GET 0.119 0.000 +GET 0.207 5.000 +GET 0.215 10.000 +GET 0.231 15.000 +GET 0.239 20.000 +GET 0.255 25.000 +GET 0.263 30.000 +GET 0.271 35.000 +GET 0.287 40.000 +GET 0.295 45.000 +GET 0.335 50.000 +GET 0.343 52.500 +GET 0.351 55.000 +GET 0.351 57.500 +GET 0.359 60.000 +GET 0.359 62.500 +GET 0.367 65.000 +GET 0.367 67.500 +GET 0.375 70.000 +GET 0.375 72.500 +GET 0.383 75.000 +GET 0.399 76.250 +GET 0.423 77.500 +GET 0.439 78.750 +GET 0.447 80.000 +GET 0.447 81.250 +GET 0.455 82.500 +GET 0.455 83.750 +GET 0.463 85.000 +GET 0.463 86.250 +GET 0.463 87.500 +GET 0.471 88.125 +GET 0.471 88.750 +GET 0.471 89.375 +GET 0.479 90.000 +GET 0.487 90.625 +GET 0.511 91.250 +GET 0.527 91.875 +GET 0.535 92.500 +GET 0.543 93.125 +GET 0.543 93.750 +GET 0.551 94.062 +GET 0.551 94.375 +GET 0.551 94.688 +GET 0.559 95.000 +GET 0.559 95.312 +GET 0.567 95.625 +GET 0.583 95.938 +GET 0.599 96.250 +GET 0.607 96.562 +GET 0.615 96.875 +GET 0.615 97.031 +GET 0.623 97.188 +GET 0.623 97.344 +GET 0.631 97.500 +GET 0.647 97.656 +GET 0.655 97.812 +GET 0.671 97.969 +GET 0.695 98.125 +GET 0.719 98.281 +GET 0.743 98.438 +GET 0.751 98.516 +GET 0.759 98.594 +GET 0.767 98.672 +GET 0.783 98.750 +GET 0.799 98.828 +GET 0.823 98.906 +GET 0.839 98.984 +GET 0.855 99.062 +GET 0.863 99.141 +GET 0.887 99.219 +GET 0.895 99.258 +GET 0.911 99.297 +GET 0.919 99.336 +GET 0.927 99.375 +GET 0.935 99.414 +GET 0.943 99.453 +GET 0.951 99.492 +GET 0.959 99.531 +GET 0.975 99.570 +GET 0.991 99.609 +GET 0.999 99.629 +GET 1.007 99.648 +GET 1.015 99.668 +GET 1.023 99.688 +GET 1.039 99.707 +GET 1.047 99.727 +GET 1.055 99.746 +GET 1.071 99.766 +GET 1.087 99.785 +GET 1.111 99.805 +GET 1.119 99.814 +GET 1.127 99.824 +GET 1.143 99.834 +GET 1.167 99.844 +GET 1.199 99.854 +GET 1.223 99.863 +GET 1.271 99.873 +GET 1.335 99.883 +GET 1.415 99.893 +GET 1.575 99.902 +GET 1.679 99.907 +GET 1.743 99.912 +GET 1.831 99.917 +GET 1.895 99.922 +GET 1.935 99.927 +GET 2.039 99.932 +GET 2.127 99.937 +GET 2.207 99.941 +GET 2.303 99.946 +GET 2.399 99.951 +GET 2.447 99.954 +GET 2.479 99.956 +GET 2.527 99.958 +GET 2.543 99.961 +GET 2.607 99.963 +GET 2.687 99.966 +GET 2.847 99.968 +GET 2.943 99.971 +GET 3.135 99.973 +GET 3.295 99.976 +GET 3.503 99.977 +GET 3.823 99.978 +GET 3.919 99.979 +GET 4.031 99.980 +GET 4.223 99.982 +GET 4.287 99.983 +GET 4.319 99.984 +GET 4.319 99.985 +GET 4.351 99.987 +GET 4.383 99.988 +GET 4.479 99.988 +GET 4.767 99.989 +GET 4.863 99.990 +GET 5.087 99.990 +GET 5.151 99.991 +GET 5.247 99.991 +GET 5.343 99.992 +GET 5.503 99.993 +GET 5.567 99.993 +GET 5.599 99.994 +GET 5.759 99.994 +GET 5.791 99.995 +GET 6.079 99.995 +GET 6.111 99.995 +GET 6.143 99.995 +GET 6.335 99.996 +GET 6.463 99.996 +GET 6.463 99.996 +GET 6.495 99.997 +GET 6.527 99.997 +GET 7.231 99.997 +GET 7.231 99.997 +GET 7.263 99.997 +GET 7.263 99.998 +GET 7.743 99.998 +GET 7.743 99.998 +GET 7.775 99.998 +GET 7.775 99.998 +GET 7.935 99.998 +GET 7.935 99.998 +GET 8.255 99.999 +GET 8.255 99.999 +GET 8.255 99.999 +GET 8.255 99.999 +GET 8.319 99.999 +GET 8.319 99.999 +GET 8.319 99.999 +GET 8.319 99.999 +GET 8.319 99.999 +GET 8.319 99.999 +GET 8.319 99.999 +GET 8.319 99.999 +GET 8.319 99.999 +GET 8.319 99.999 +GET 10.943 99.999 +GET 10.943 99.999 +GET 10.943 100.000 +GET 10.943 100.000 +GET 10.943 100.000 +GET 10.943 100.000 +GET 10.943 100.000 +GET 10.943 100.000 +GET 10.943 100.000 +GET 10.943 100.000 +GET 11.327 100.000 +GET 11.327 100.000 +--- +WAIT 0.000 100.000 \ No newline at end of file diff --git a/src/VirtualClient/VirtualClient.Actions.UnitTests/Memtier/MemtierMetricsParserTests.cs b/src/VirtualClient/VirtualClient.Actions.UnitTests/Memtier/MemtierMetricsParserTests.cs index f94494a18b..382d1d8582 100644 --- a/src/VirtualClient/VirtualClient.Actions.UnitTests/Memtier/MemtierMetricsParserTests.cs +++ b/src/VirtualClient/VirtualClient.Actions.UnitTests/Memtier/MemtierMetricsParserTests.cs @@ -385,6 +385,49 @@ public void MemtierMetricsParserParsesTheExpectedMetricsFromRedisResultsCorrectl MetricAssert.Exists(metrics, "SET_Latency-P99.9_Avg", 1.54300, MetricUnit.Milliseconds); } + [Test] + public void MemtierMetricsParserParsesTheExpectedMetricsFromRedisForMoreThan1RedisServerInstancesResultsCorrectly_1() + { + List<string> resultsList = new List<string>(); + string results1 = File.ReadAllText(Path.Combine(MockFixture.ExamplesDirectory, @"Memtier\RedisResults_1.txt")); + resultsList.Add(results1); + string results2 = File.ReadAllText(Path.Combine(MockFixture.ExamplesDirectory, @"Memtier\RedisResults_3.txt")); + resultsList.Add(results2); + var parser = new MemtierMetricsParser(false, resultsList); + + IList<Metric> metrics = parser.Parse(); + + Assert.AreEqual(138, metrics.Count); + MetricAssert.Exists(metrics, "Throughput_Avg", 355987.03, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "Bandwidth_Avg", 25860.83, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "Hits/sec_Avg", 320388.28); + MetricAssert.Exists(metrics, "Misses/sec_Avg", 0); + MetricAssert.Exists(metrics, "Latency-Avg_Avg", 0.34301, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P50_Avg", 0.33500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P90_Avg", 0.47900, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P95_Avg", 0.55900, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99_Avg", 0.83900, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99.9_Avg", 1.54300, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "GET_Throughput_Avg", 320388.28, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "GET_Bandwidth_Avg", 23118.30, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "GET_Latency-Avg_Avg", 0.34300, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P50_Avg", 0.33500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P90_Avg", 0.47900, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P95_Avg", 0.55900, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99_Avg", 0.83900, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99.9_Avg", 1.54300, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "SET_Throughput_Avg", 35598.74, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "SET_Bandwidth_Avg", 2742.53, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "SET_Latency-Avg_Avg", 0.34304, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P50_Avg", 0.33500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P90_Avg", 0.47900, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P95_Avg", 0.55900, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P99_Avg", 0.83900, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P99.9_Avg", 1.54300, MetricUnit.Milliseconds); + } + [Test] public void MemtierMetricsParserAssociatesTheCorrectRelativityToTheMetrics() { diff --git a/src/VirtualClient/VirtualClient.Actions/Memcached/MemcachedServerExecutor.cs b/src/VirtualClient/VirtualClient.Actions/Memcached/MemcachedServerExecutor.cs index d8452f1f70..dd94bdd871 100644 --- a/src/VirtualClient/VirtualClient.Actions/Memcached/MemcachedServerExecutor.cs +++ b/src/VirtualClient/VirtualClient.Actions/Memcached/MemcachedServerExecutor.cs @@ -170,6 +170,8 @@ protected override Task ExecuteAsync(EventContext telemetryContext, Cancellation { this.SetServerOnline(false); + await this.ServerApiClient.PollForHeartbeatAsync(TimeSpan.FromMinutes(5), cancellationToken); + if (this.ResetServer(telemetryContext)) { await this.DeleteStateAsync(telemetryContext, cancellationToken); diff --git a/src/VirtualClient/VirtualClient.Actions/Memtier/MemtierBenchmarkClientExecutor.cs b/src/VirtualClient/VirtualClient.Actions/Memtier/MemtierBenchmarkClientExecutor.cs index 85734806a3..8ab841e406 100644 --- a/src/VirtualClient/VirtualClient.Actions/Memtier/MemtierBenchmarkClientExecutor.cs +++ b/src/VirtualClient/VirtualClient.Actions/Memtier/MemtierBenchmarkClientExecutor.cs @@ -5,14 +5,12 @@ namespace VirtualClient.Actions { using System; using System.Collections.Generic; - using System.Diagnostics; using System.Linq; using System.Net; using System.Runtime.InteropServices; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; - using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using Polly; using VirtualClient.Common; @@ -36,9 +34,9 @@ public class MemtierBenchmarkClientExecutor : MemcachedExecutor new Regex(@"connection\s+refused", RegexOptions.IgnoreCase | RegexOptions.Compiled) }; - private List<Metric> aggregatedMetrics = new List<Metric>(); - private List<string> perProcessOutputList = new List<string>(); - private List<string> perProcessCommandList = new List<string>(); + private List<Metric> aggregatedMetrics; + private List<string> perProcessOutputList; + private List<string> perProcessCommandList; private int startingServerPort; /// <summary> @@ -60,6 +58,9 @@ public MemtierBenchmarkClientExecutor(IServiceCollection dependencies, IDictiona // Ensure the duration is in integer (seconds) form. int duration = this.Duration; this.Parameters[nameof(this.Duration)] = duration; + this.aggregatedMetrics = new List<Metric>(); + this.perProcessOutputList = new List<string>(); + this.perProcessCommandList = new List<string>(); } /// <summary> @@ -359,7 +360,7 @@ private void CaptureMetrics(DateTime startTime, DateTime endTime, EventContext t metric.Value, metric.Unit, null, - (string)metric.Metadata[commandline], + metric.Metadata.ContainsKey(commandline) ? (string)metric.Metadata[commandline] : null, this.Tags, telemetryContext, metric.Relativity); @@ -426,7 +427,15 @@ private Task ExecuteWorkloadsAsync(IPAddress serverIPAddress, ServerState server await Task.WhenAll(workloadProcesses); DateTime endTime = DateTime.UtcNow; - this.CaptureMetrics(startTime, endTime, telemetryContext, cancellationToken); + if (!this.WarmUp) + { + foreach (string output in this.perProcessOutputList) + { + Console.WriteLine($"output is : {output}"); + } + + this.CaptureMetrics(startTime, endTime, telemetryContext, cancellationToken); + } } }); } @@ -534,8 +543,7 @@ private string ParseCommand(string command, int serverPort) command = Regex.Replace(command, @"\s+", " "); // Removes extra spaces - // get the port on which this command is running and - command += @$"--VCpuID {serverPort - this.startingServerPort}"; + command += @$" --VCpuID {serverPort - this.startingServerPort}"; return command.Trim(); } } diff --git a/src/VirtualClient/VirtualClient.Actions/Memtier/MemtierMetricsParser.cs b/src/VirtualClient/VirtualClient.Actions/Memtier/MemtierMetricsParser.cs index 4f77c16ad7..aad3a8ca91 100644 --- a/src/VirtualClient/VirtualClient.Actions/Memtier/MemtierMetricsParser.cs +++ b/src/VirtualClient/VirtualClient.Actions/Memtier/MemtierMetricsParser.cs @@ -18,7 +18,7 @@ namespace VirtualClient.Actions public class MemtierMetricsParser : MetricsParser { private const string SplitAtSpace = @"\s{1,}"; - private const string ProcessResultSectionDelimiter = @"*{6}"; + private const string ProcessResultSectionDelimiter = @"^\*{6}$"; // ============================================================================================================================================================ // Type Ops/sec Hits/sec Misses/sec Avg.Latency p50 Latency p90 Latency p95 Latency p99 Latency p99.9 Latency KB/sec @@ -37,8 +37,8 @@ public class MemtierMetricsParser : MetricsParser /// <summary> /// Initializes a new instance of the <see cref="MemtierMetricsParser"/> class. /// </summary> - public MemtierMetricsParser(bool perProcessMetric, List<string> rawText, List<string> commandLines = null) - : base(string.Join(ProcessResultSectionDelimiter, rawText)) + public MemtierMetricsParser(bool perProcessMetric, List<string> rawTextList, List<string> commandLines = null) + : base(string.Join(ProcessResultSectionDelimiter, rawTextList)) { this.perProcessMetric = perProcessMetric; this.memtierCommandLines = commandLines; @@ -54,9 +54,11 @@ public override IList<Metric> Parse() List<Metric> combinedMetrics = new List<Metric>(); List<string> rawTextList = this.RawText.Split(ProcessResultSectionDelimiter).Select(s => s.Trim()).ToList(); + Console.WriteLine($"rawTextListLength: {rawTextList.Count}"); for (int i = 0; i < rawTextList.Count; i++) { string rawText = rawTextList[i]; + Console.WriteLine($"rawText {i}: {rawText}"); // Example Format: // // ALL STATS diff --git a/src/VirtualClient/VirtualClient.Actions/Redis/RedisServerExecutor.cs b/src/VirtualClient/VirtualClient.Actions/Redis/RedisServerExecutor.cs index 6d458d0cfb..7fa0cadc07 100644 --- a/src/VirtualClient/VirtualClient.Actions/Redis/RedisServerExecutor.cs +++ b/src/VirtualClient/VirtualClient.Actions/Redis/RedisServerExecutor.cs @@ -184,6 +184,8 @@ protected override Task ExecuteAsync(EventContext telemetryContext, Cancellation { this.SetServerOnline(false); + await this.ServerApiClient.PollForHeartbeatAsync(TimeSpan.FromMinutes(5), cancellationToken); + if (this.ResetServer(telemetryContext)) { await this.DeleteStateAsync(telemetryContext, cancellationToken); diff --git a/website/docs/workloads/memcached/memcached.md b/website/docs/workloads/memcached/memcached.md index 83d6aab0ec..2b773a5a6d 100644 --- a/website/docs/workloads/memcached/memcached.md +++ b/website/docs/workloads/memcached/memcached.md @@ -19,95 +19,144 @@ and gives percentile latency distributions and throughput. The following metrics are examples of those captured by the Virtual Client when running the Memtier workload against a Memcached server. -| Scenario Name | Metric Name | Example Value (min) | Example Value (max) | Example Value (avg) | Unit | -|-----------------|-------------|---------------------|---------------------|---------------------|------| -| Memtier_4t_1c | p50lat | 0.159 | 4.095 | 0.2965735294117649 | milliseconds | -| Memtier_4t_1c | p90lat | 2.799 | 7.807 | 3.6170735294117639 | milliseconds | -| Memtier_4t_1c | p95lat | 3.743 | 9.535 | 4.346150735294118 | milliseconds | -| Memtier_4t_1c | p99.9lat | 11.519 | 61.951 | 16.81158823529412 | milliseconds | -| Memtier_4t_1c | p99lat | 5.023 | 16.319 | 6.137676470588234 | milliseconds | -| Memtier_4t_1c | throughput | 58417.19 | 815710.22 | 235439.3486305147 | operations/sec | -| Memtier_4t_1c | throughput_1 | 29092.65 | 203673.3 | 111331.60009650735 | operations/sec | -| Memtier_4t_1c | throughput_2 | 29315.66 | 206249.97 | 113622.22872585096 | operations/sec | -| Memtier_4t_1c | throughput_3 | 176794.47 | 206504.79 | 193725.01733333333 | operations/sec | -| Memtier_4t_1c | throughput_4 | 179516.37 | 203843.86 | 190337.24200000004 | operations/sec | -| Memtier_4t_2c | p50lat | 0.335 | 4.415 | 1.52554930875576 | milliseconds | -| Memtier_4t_2c | p90lat | 3.951 | 18.943 | 4.581628571428574 | milliseconds | -| Memtier_4t_2c | p95lat | 4.223 | 21.759 | 5.332559447004607 | milliseconds | -| Memtier_4t_2c | p99.9lat | 12.671 | 72.703 | 19.31950875576037 | milliseconds | -| Memtier_4t_2c | p99lat | 5.439 | 29.439 | 7.0393244239631349 | milliseconds | -| Memtier_4t_2c | throughput | 65999.11 | 797961.14 | 245532.84887788018 | operations/sec | -| Memtier_4t_2c | throughput_1 | 32380.33 | 202134.5 | 119005.53673041475 | operations/sec | -| Memtier_4t_2c | throughput_2 | 33331.74 | 204258.16 | 117608.7032130384 | operations/sec | -| Memtier_4t_2c | throughput_3 | 169854.02 | 200916.3 | 185826.25166666663 | operations/sec | -| Memtier_4t_2c | throughput_4 | 167405.91 | 194783.81 | 180833.36850000005 | operations/sec | -| Memtier_4t_4c | p50lat | 1.183 | 15.359 | 2.7599138090824835 | milliseconds | -| Memtier_4t_4c | p90lat | 4.799 | 26.367 | 11.749524559777568 | milliseconds | -| Memtier_4t_4c | p95lat | 5.215 | 30.719 | 13.026113994439293 | milliseconds | -| Memtier_4t_4c | p99.9lat | 20.735 | 83.967 | 33.21849953660797 | milliseconds | -| Memtier_4t_4c | p99lat | 6.335 | 41.471 | 18.379381835032434 | milliseconds | -| Memtier_4t_4c | throughput | 68264.98 | 817778.44 | 255551.02398053756 | operations/sec | -| Memtier_4t_4c | throughput_1 | 32987.04 | 210675.5 | 122982.00023864689 | operations/sec | -| Memtier_4t_4c | throughput_2 | 34447.69 | 206027.13 | 121898.65999073001 | operations/sec | -| Memtier_4t_4c | throughput_3 | 176203.54 | 209177.93 | 193846.44791666664 | operations/sec | -| Memtier_4t_4c | throughput_4 | 172918.81 | 203408.28 | 190946.7905 | operations/sec | -| Memtier_8t_2c | p50lat | 0.631 | 15.487 | 1.052861552853134 | milliseconds | -| Memtier_8t_2c | p90lat | 5.503 | 50.943 | 13.044298409728715 | milliseconds | -| Memtier_8t_2c | p95lat | 13.055 | 59.647 | 14.339385406922359 | milliseconds | -| Memtier_8t_2c | p99.9lat | 28.671 | 180.223 | 36.93806339181287 | milliseconds | -| Memtier_8t_2c | p99lat | 17.535 | 91.135 | 22.5084705332086 | milliseconds | -| Memtier_8t_2c | throughput | 57703.76 | 827385.88 | 257429.3466534144 | operations/sec | -| Memtier_8t_2c | throughput_1 | 32527.37 | 209887.17 | 124380.40026426566 | operations/sec | -| Memtier_8t_2c | throughput_2 | 23625.1 | 212309.54 | 122170.78199344877 | operations/sec | -| Memtier_8t_2c | throughput_3 | 181544.04 | 212802.62 | 197401.76108333336 | operations/sec | -| Memtier_8t_2c | throughput_4 | 179479.72 | 207057.14 | 192259.67658333336 | operations/sec | -| Memtier_8t_4c | p50lat | 1.231 | 30.463 | 7.030075523202911 | milliseconds | -| Memtier_8t_4c | p90lat | 14.143 | 59.391 | 16.208703366697 | milliseconds | -| Memtier_8t_4c | p95lat | 17.791 | 101.375 | 19.43780133454656 | milliseconds | -| Memtier_8t_4c | p99.9lat | 32.767 | 251.903 | 43.959487716105559 | milliseconds | -| Memtier_8t_4c | p99lat | 25.727 | 160.767 | 28.69444919623901 | milliseconds | -| Memtier_8t_4c | throughput | 60685.85 | 842329.67 | 265907.298343949 | operations/sec | -| Memtier_8t_4c | throughput_1 | 28006.45 | 215109.34 | 127300.9799454049 | operations/sec | -| Memtier_8t_4c | throughput_2 | 32502.93 | 217147.87 | 124150.41247801029 | operations/sec | -| Memtier_8t_4c | throughput_3 | 184452.87 | 211285.71 | 197710.7305 | operations/sec | -| Memtier_8t_4c | throughput_4 | 186077.54 | 213718.07 | 199465.28466666668 | operations/sec | -| Memtier_8t_8c | p50lat | 2.383 | 57.343 | 15.538551766138858 | milliseconds | -| Memtier_8t_8c | p90lat | 19.455 | 96.255 | 24.308904993909864 | milliseconds | -| Memtier_8t_8c | p95lat | 23.039 | 132.095 | 29.86248355663824 | milliseconds | -| Memtier_8t_8c | p99.9lat | 38.399 | 258.047 | 60.335019488428759 | milliseconds | -| Memtier_8t_8c | p99lat | 31.743 | 186.367 | 43.09107308160779 | milliseconds | -| Memtier_8t_8c | throughput | 64212.8 | 888657.03 | 270229.023270402 | operations/sec | -| Memtier_8t_8c | throughput_1 | 31641.23 | 230826.34 | 127721.14527405605 | operations/sec | -| Memtier_8t_8c | throughput_2 | 32303.92 | 227859.12 | 127505.81609584858 | operations/sec | -| Memtier_8t_8c | throughput_3 | 194345.26 | 221087.21 | 207721.54641666666 | operations/sec | -| Memtier_8t_8c | throughput_4 | 195513.22 | 224525.73 | 211335.26866666668 | operations/sec | -| Memtier_16t_4c | p50lat | 2.479 | 63.999 | 15.867709396390792 | milliseconds | -| Memtier_16t_4c | p90lat | 19.583 | 109.055 | 25.70262663347853 | milliseconds | -| Memtier_16t_4c | p95lat | 23.807 | 128.511 | 29.745658369632858 | milliseconds | -| Memtier_16t_4c | p99.9lat | 38.655 | 309.247 | 62.71748662103298 | milliseconds | -| Memtier_16t_4c | p99lat | 31.871 | 179.199 | 43.3985668948351 | milliseconds | -| Memtier_16t_4c | throughput | 58580.34 | 845621.72 | 253393.12167081517 | operations/sec | -| Memtier_16t_4c | throughput_1 | 28743.1 | 215014.62 | 121465.76731176104 | operations/sec | -| Memtier_16t_4c | throughput_2 | 29794.02 | 216446.78 | 124715.36404115996 | operations/sec | -| Memtier_16t_4c | throughput_3 | 183022.18 | 215183.61 | 199985.7881666667 | operations/sec | -| Memtier_16t_4c | throughput_4 | 188305.88 | 214475.28 | 200886.619 | operations/sec | -| Memtier_16t_8c | p50lat | 20.607 | 133.119 | 32.126001871490959 | milliseconds | -| Memtier_16t_8c | p90lat | 32.767 | 233.471 | 47.07609045539612 | milliseconds | -| Memtier_16t_8c | p95lat | 33.279 | 268.287 | 55.38091890205864 | milliseconds | -| Memtier_16t_8c | p99.9lat | 49.407 | 622.591 | 112.8486868371803 | milliseconds | -| Memtier_16t_8c | p99lat | 42.239 | 317.439 | 78.94473674360575 | milliseconds | -| Memtier_16t_8c | throughput | 55016.71 | 887996.49 | 250613.5241048035 | operations/sec | -| Memtier_16t_8c | throughput_1 | 27740.86 | 224915.68 | 122564.99112913289 | operations/sec | -| Memtier_16t_8c | throughput_2 | 27275.85 | 224914.49 | 120324.29177756951 | operations/sec | -| Memtier_16t_8c | throughput_3 | 199133.29 | 220958.03 | 209582.30199999998 | operations/sec | -| Memtier_16t_8c | throughput_4 | 198042.78 | 224867.07 | 213176.67700000006 | operations/sec | -| Memtier_16t_16c | p50lat | 33.535 | 344.063 | 64.34645722344094 | milliseconds | -| Memtier_16t_16c | p90lat | 52.991 | 518.143 | 91.89321247257914 | milliseconds | -| Memtier_16t_16c | p95lat | 57.343 | 557.055 | 111.11832309620807 | milliseconds | -| Memtier_16t_16c | p99.9lat | 69.631 | 978.943 | 204.75744312127865 | milliseconds | -| Memtier_16t_16c | p99lat | 62.975 | 724.991 | 151.58678063303038 | milliseconds | -| Memtier_16t_16c | throughput | 45402.08 | 903296.37 | 248871.23561892825 | operations/sec | -| Memtier_16t_16c | throughput_1 | 22297.41 | 230097.93 | 120755.43762770292 | operations/sec | -| Memtier_16t_16c | throughput_2 | 23104.67 | 231646.96 | 120205.79481632651 | operations/sec | -| Memtier_16t_16c | throughput_3 | 204582.28 | 230185.17 | 217630.71233333337 | operations/sec | -| Memtier_16t_16c | throughput_4 | 200293.43 | 232077.36 | 215070.2026666667 | operations/sec | \ No newline at end of file + +| ScenarioName | Metric Name | Example Value | Unit | +|-------------------------|--------------|---------------|-------| +|memtier_16t_16c_1kb_r1:1|Throughput_Avg | 96143.676666666681| requests/sec| +|memtier_16t_16c_1kb_r1:1|Throughput_Max |99310.66 | requests/sec| +|memtier_16t_16c_1kb_r1:1|Throughput_Min |93126.7 |requests/sec| +|memtier_16t_16c_1kb_r1:1|Throughput_Stdev| 1756.3137622699699| requests/sec| +|memtier_16t_16c_1kb_r1:1|Throughput_P80 |98123.77 |requests/sec| +|memtier_16t_16c_1kb_r1:1|Throughput_Sum |1153724.12 |requests/sec| +|memtier_16t_16c_1kb_r1:1|Hits/sec_Avg |48070.774999999994 | | +|memtier_16t_16c_1kb_r1:1|Hits/sec_Max |49654.27 | | +|memtier_16t_16c_1kb_r1:1|Hits/sec_Min |46562.29 | | +|memtier_16t_16c_1kb_r1:1|Hits/sec_Stdev |878.156472669686 | | +|memtier_16t_16c_1kb_r1:1|Hits/sec_P80 |49060.82 | | +|memtier_16t_16c_1kb_r1:1|Hits/sec_Sum |576849.29999999993 | | +|memtier_16t_16c_1kb_r1:1|Misses/sec_Avg |0 | | +|memtier_16t_16c_1kb_r1:1|Misses/sec_Min |0 | | +|memtier_16t_16c_1kb_r1:1|Misses/sec_Max |0 | | +|memtier_16t_16c_1kb_r1:1|Misses/sec_Stdev| 0 | | +|memtier_16t_16c_1kb_r1:1|Misses/sec_P80 |0 | | +|memtier_16t_16c_1kb_r1:1|Misses/sec_Sum |0 | | +|memtier_16t_16c_1kb_r1:1|Latency-Avg_Avg |265.929245 |milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-Avg_Min |257.37339 |milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-Avg_Max |274.49494 |milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-Avg_Stdev| 4.8649509314371953 |milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-Avg_P80 |268.37573 |milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P50_Avg |258.4736666666667 |milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P50_Min |252.927 |milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P50_Max |266.239 |milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P50_Stdev| 3.9095334191634046| milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P50_P80 |260.095 |milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P90_Min |331.775 |milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P90_Avg |337.74833333333333| milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P90_P80 |339.967 |milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P90_Max |348.159 |milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P90_Stdev| 4.6894529413236388| milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P95_Min |346.111 |milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P95_Avg |354.4736666666667 |milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P95_Max |364.543 |milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P95_Stdev| 4.6894529413236388| milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P95_P80 |356.351 |milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P99_Avg |385.36433333333338| milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P99_Min |376.831 |milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P99_Max |397.311 |milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P99_Stdev| 5.3427117542394855| milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P99_P80 |389.119 |milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P99.9_Avg| 442.02566666666667| milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P99.9_Min| 411.647 |milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P99.9_Max| 532.479 |milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P99.9_Stdev |32.01080706400402| milliseconds| +|memtier_16t_16c_1kb_r1:1|Latency-P99.9_P80 |452.607 |milliseconds| +|memtier_16t_16c_1kb_r1:1|Bandwidth_Avg |99831.145833333328| kilobytes/sec| +|memtier_16t_16c_1kb_r1:1|Bandwidth_Min |96698.49 | kilobytes/sec| +|memtier_16t_16c_1kb_r1:1|Bandwidth_Stdev |1823.6575402628735| kilobytes/sec| +|memtier_16t_16c_1kb_r1:1|Bandwidth_Max |103119.55 |kilobytes/sec| +|memtier_16t_16c_1kb_r1:1|Bandwidth_P80 |101887.18 |kilobytes/sec| +|memtier_16t_16c_1kb_r1:1|GET_Throughput_Avg| 48070.774999999994| requests/sec| +|memtier_16t_16c_1kb_r1:1|Bandwidth_Sum |1197973.75 |kilobytes/sec| +|memtier_16t_16c_1kb_r1:1|GET_Throughput_Min| 46562.29 |requests/sec| +|memtier_16t_16c_1kb_r1:1|GET_Throughput_Max| 49654.27 |requests/sec| +|memtier_16t_16c_1kb_r1:1|GET_Throughput_P80| 49060.82 |requests/sec| +|memtier_16t_16c_1kb_r1:1|GET_Throughput_Stdev| 878.156472669686 |requests/sec| +|memtier_16t_16c_1kb_r1:1|GET_Throughput_Sum |576849.29999999993 |requests/sec| +|memtier_16t_16c_1kb_r1:1|GET_Latency-Avg_Avg |265.9334425 |milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-Avg_Min |257.37776 |milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-Avg_P80 |268.38027 |milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-Avg_Max |274.49896 |milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-Avg_Stdev| 4.8649389483855519| milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P50_Avg |258.4736666666667 |milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P50_Min |252.927 |milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P50_Max |266.239 |milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P90_Avg |337.74833333333333| milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P90_Stdev| 4.6894529413236388| milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P90_Min |331.775 |milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P90_Max |348.159 |milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P50_Stdev| 3.9095334191634046| milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P50_P80 |260.095 |milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P90_P80 |339.967 |milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P95_Avg |354.81500000000005| milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P95_Min |346.111 |milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P95_Max |364.543 |milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P95_Stdev| 5.0252567430265076| milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P95_P80 |356.351 |milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P99_Avg |386.047 |milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P99_Min |376.831 |milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P99_Max |397.311 |milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P99_Stdev| 5.3208600808515767| milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P99_P80 |391.167 |milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P99.9_Avg| 442.87900000000008| milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P99.9_Min| 411.647 |milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P99.9_Max| 532.479 |milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P99.9_Stdev| 31.706816932640848| milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Latency-P99.9_P80 |454.655 |milliseconds| +|memtier_16t_16c_1kb_r1:1|GET_Bandwidth_Avg |49797.129166666673| kilobytes/sec| +|memtier_16t_16c_1kb_r1:1|GET_Bandwidth_Stdev |909.68510072129129| kilobytes/sec| +|memtier_16t_16c_1kb_r1:1|GET_Bandwidth_Min |48234.48 |kilobytes/sec| +|memtier_16t_16c_1kb_r1:1|GET_Bandwidth_Max |51437.47 |kilobytes/sec| +|memtier_16t_16c_1kb_r1:1|GET_Bandwidth_P80 |50822.73 |kilobytes/sec| +|memtier_16t_16c_1kb_r1:1|SET_Throughput_Avg |48072.902499999989| requests/sec| +|memtier_16t_16c_1kb_r1:1|GET_Bandwidth_Sum |597565.55 |kilobytes/sec| +|memtier_16t_16c_1kb_r1:1|SET_Throughput_Min |46564.42 |requests/sec| +|memtier_16t_16c_1kb_r1:1|SET_Throughput_Max |49656.39 |requests/sec| +|memtier_16t_16c_1kb_r1:1|SET_Throughput_P80 |49062.95 |requests/sec| +|memtier_16t_16c_1kb_r1:1|SET_Throughput_Stdev |878.15536932182385| requests/sec| +|memtier_16t_16c_1kb_r1:1|SET_Throughput_Sum |576874.82999999984| requests/sec| +|memtier_16t_16c_1kb_r1:1|SET_Latency-Avg_Avg |265.92504749999995| milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-Avg_Min |257.36902 |milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-Avg_Max |274.49091 |milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-Avg_P80 |268.37118 |milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P50_Avg |258.4736666666667| milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-Avg_Stdev| 4.8649615272924267| milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P50_Min |252.927 |milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P50_Max |266.239 |milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P50_P80 |260.095 |milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P90_Avg |337.74833333333333| milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P50_Stdev| 3.9095334191634046| milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P90_Min |331.775 |milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P90_Max |348.159 |milli0seconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P90_Stdev| 4.6894529413236388| milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P90_P80 |339.967 |milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P95_Avg |354.30299999999994| milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P95_Min |346.111 |milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P95_Max |364.543 |milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P95_Stdev| 4.8029857380591956| milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P95_P80 |356.351 |milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P99_Stdev| 5.1850095039021333| milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P99_Min |374.783 |milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P99_Avg |384.85233333333332| milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P99_P80 |389.119 |milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P99_Max |395.263 |milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P99.9_Avg| 441.17233333333337| milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P99.9_Min| 409.599 |milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P99.9_Max| 536.575 |milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P99.9_Stdev |33.438038432632723| milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Bandwidth_Avg |50034.015833333331| kilobytes/sec| +|memtier_16t_16c_1kb_r1:1|SET_Latency-P99.9_P80| 450.559 |milliseconds| +|memtier_16t_16c_1kb_r1:1|SET_Bandwidth_Min |48464.01 |kilobytes/sec| +|memtier_16t_16c_1kb_r1:1|SET_Bandwidth_P80 |51064.45 |kilobytes/sec| +|memtier_16t_16c_1kb_r1:1|SET_Bandwidth_Stdev |913.97098802841549| kilobytes/sec| +|memtier_16t_16c_1kb_r1:1|SET_Bandwidth_Sum |600408.19 |kilobytes/sec| +|memtier_16t_16c_1kb_r1:1|SET_Bandwidth_Max |51682.07 |kilobytes/sec| \ No newline at end of file diff --git a/website/docs/workloads/redis/redis-profiles.md b/website/docs/workloads/redis/redis-profiles.md index eb99791d89..a6c4dba06c 100644 --- a/website/docs/workloads/redis/redis-profiles.md +++ b/website/docs/workloads/redis/redis-profiles.md @@ -82,6 +82,7 @@ We have two profiles for Redis.One supports redis with TLS and one without TLS. | ServerThreadCount | Optional. The number of threads to use by the Redis server to handle operations. | 4 | | ServerPort | Optional. The initial port on which the Redis servers will listen for traffic. Additional ports will be used for each 1 server instance defined in a sequential manner (e.g. 6379, 6380, 6381) | 6379 | | IsTLSEnabled | Optional. It defines if Redis server runs with TLS or not. "yes" for TLS, "no" for no TLS| no | + | PerProcessMetric | Optional. "True" if we want to emit telemtry metrics for each client server combination.Aggregated metrics are always collected.| false | * **Component Parameters** The following parameters describe the parameters within the profile components. @@ -107,6 +108,7 @@ We have two profiles for Redis.One supports redis with TLS and one without TLS. | PackageName | The name of the package that contains the Memtier benchmark binaries/scripts. | | | WarmUp | True if the component/action is meant to be used to warmup the Memcached server. Metrics will not be captured in warmup steps. | false | | IsTLSEnabled | It defines if Redis server runs with TLS or not. "yes" for TLS, "no" for no TLS| no | + | PerProcessMetric | Optional. "True" if we want to emit telemtry metrics for each client server combination.Aggregated metrics are always collected.| false | * **Profile Runtimes** diff --git a/website/docs/workloads/redis/redis.md b/website/docs/workloads/redis/redis.md index d192e183fd..b093af2665 100644 --- a/website/docs/workloads/redis/redis.md +++ b/website/docs/workloads/redis/redis.md @@ -18,183 +18,143 @@ the Redis server and provides throughput and latency percentile distributions. The following metrics are examples of those captured by the Virtual Client when running the Memtier workload against a Redis server. -| Metric Name | Example Value (min) | Example Value (max) | Example Value (avg) | Unit | -|--------------|---------------------|---------------------|---------------------|------| -| GET_Average_Latency | 0.04 | 32.005 | 0.48362615964930158 | milliSeconds | -| GET_Max_Latency | 0.087 | 82.815 | 2.9978202671016409 | milliSeconds | -| GET_Min_Latency | 0.016 | 18.512 | 0.06400326231012303 | milliSeconds | -| GET_P50_Latency | 0.039 | 31.983 | 0.43099306759098818 | milliSeconds | -| GET_P95_Latency | 0.055 | 44.031 | 1.0166923233764916 | milliSeconds | -| GET_P99_Latency | 0.063 | 56.287 | 1.711716484860842 | milliSeconds | -| GET_Requests/Sec | 7980.85 | 1515636.38 | 657043.5354113564 | requests/second | -| HSET_Average_Latency | 0.046 | 32.141 | 0.4740447570984351 | milliSeconds | -| HSET_Max_Latency | 0.095 | 77.567 | 2.9574821328439619 | milliSeconds | -| HSET_Min_Latency | 0.024 | 11.952 | 0.06351511444155553 | milliSeconds | -| HSET_P50_Latency | 0.047 | 31.983 | 0.4103505632869458 | milliSeconds | -| HSET_P95_Latency | 0.055 | 36.063 | 0.9638419228220432 | milliSeconds | -| HSET_P99_Latency | 0.079 | 66.559 | 1.612821481368201 | milliSeconds | -| HSET_Requests/Sec | 7849.53 | 1136727.25 | 569987.1470433805 | requests/second | -| INCR_Average_Latency | 0.041 | 32.09 | 0.4909997961056173 | milliSeconds | -| INCR_Max_Latency | 0.087 | 103.935 | 3.1033001325313487 | milliSeconds | -| INCR_Min_Latency | 0.024 | 23.936 | 0.06726842695483709 | milliSeconds | -| INCR_P50_Latency | 0.039 | 31.983 | 0.429000203894383 | milliSeconds | -| INCR_P95_Latency | 0.055 | 42.111 | 1.0510322153124685 | milliSeconds | -| INCR_P99_Latency | 0.071 | 92.095 | 1.7620013253134879 | milliSeconds | -| INCR_Requests/Sec | 7960.53 | 1430857.12 | 631131.4617376895 | requests/second | -| LPOP_Average_Latency | 0.049 | 33.015 | 0.4860578550310941 | milliSeconds | -| LPOP_Max_Latency | 0.103 | 107.199 | 3.0467243207422145 | milliSeconds | -| LPOP_Min_Latency | 0.024 | 25.968 | 0.0682613925986336 | milliSeconds | -| LPOP_P50_Latency | 0.047 | 31.983 | 0.4283811805484766 | milliSeconds | -| LPOP_P95_Latency | 0.063 | 43.935 | 1.0061803445815075 | milliSeconds | -| LPOP_P99_Latency | 0.079 | 62.495 | 1.6812478462557988 | milliSeconds | -| LPOP_Requests/Sec | 7645.8 | 1163162.75 | 554949.0140090728 | requests/second | -| LPUSH (needed to benchmark LRANGE)_Average_Latency | 0.047 | 32.331 | 0.4680763152528547 | milliSeconds | -| LPUSH (needed to benchmark LRANGE)_Max_Latency | 0.103 | 89.151 | 3.0183870309951059 | milliSeconds | -| LPUSH (needed to benchmark LRANGE)_Min_Latency | 0.024 | 23.92 | 0.0674498368678627 | milliSeconds | -| LPUSH (needed to benchmark LRANGE)_P50_Latency | 0.047 | 31.983 | 0.4168964110929859 | milliSeconds | -| LPUSH (needed to benchmark LRANGE)_P95_Latency | 0.063 | 43.935 | 0.9477659053833611 | milliSeconds | -| LPUSH (needed to benchmark LRANGE)_P99_Latency | 0.079 | 62.207 | 1.6001190864600324 | milliSeconds | -| LPUSH (needed to benchmark LRANGE)_Requests/Sec | 7806.7 | 1112888.88 | 552787.2849683929 | requests/second | -| LPUSH_Average_Latency | 0.049 | 32.39 | 0.5174908247527781 | milliSeconds | -| LPUSH_Max_Latency | 0.095 | 80.447 | 3.14175991436436 | milliSeconds | -| LPUSH_Min_Latency | 0.024 | 27.888 | 0.06941176470588206 | milliSeconds | -| LPUSH_P50_Latency | 0.047 | 31.983 | 0.46588184320522027 | milliSeconds | -| LPUSH_P95_Latency | 0.063 | 38.975 | 1.0646764196146397 | milliSeconds | -| LPUSH_P99_Latency | 0.079 | 66.623 | 1.7610980731980833 | milliSeconds | -| LPUSH_Requests/Sec | 7800.62 | 1112888.88 | 546899.8452446729 | requests/second | -| LRANGE_100 (first 100 elements)_Average_Latency | 0.219 | 31.556 | 2.1469685460848288 | milliSeconds | -| LRANGE_100 (first 100 elements)_Max_Latency | 0.319 | 232.959 | 12.235842577487766 | milliSeconds | -| LRANGE_100 (first 100 elements)_Min_Latency | 0.192 | 8.736 | 0.2514208809135396 | milliSeconds | -| LRANGE_100 (first 100 elements)_P50_Latency | 0.207 | 31.567 | 1.8669212887438807 | milliSeconds | -| LRANGE_100 (first 100 elements)_P95_Latency | 0.263 | 56.447 | 4.660227977161501 | milliSeconds | -| LRANGE_100 (first 100 elements)_P99_Latency | 0.295 | 102.527 | 7.441752039151712 | milliSeconds | -| LRANGE_100 (first 100 elements)_Requests/Sec | 7983.4 | 139111.11 | 61537.65344718601 | requests/second | -| LRANGE_300 (first 300 elements)_Average_Latency | 0.657 | 36.091 | 3.5058012846655797 | milliSeconds | -| LRANGE_300 (first 300 elements)_Max_Latency | 0.839 | 144.767 | 21.579035889070146 | milliSeconds | -| LRANGE_300 (first 300 elements)_Min_Latency | 0.592 | 2.752 | 0.6773694942903761 | milliSeconds | -| LRANGE_300 (first 300 elements)_P50_Latency | 0.615 | 33.631 | 3.4033213703099505 | milliSeconds | -| LRANGE_300 (first 300 elements)_P95_Latency | 0.775 | 79.487 | 6.062862561174552 | milliSeconds | -| LRANGE_300 (first 300 elements)_P99_Latency | 0.807 | 105.919 | 12.36377732463295 | milliSeconds | -| LRANGE_300 (first 300 elements)_Requests/Sec | 3586.68 | 31933.59 | 18214.11462530588 | requests/second | -| LRANGE_500 (first 450 elements)_Average_Latency | 0.989 | 41.284 | 4.857378721451877 | milliSeconds | -| LRANGE_500 (first 450 elements)_Max_Latency | 1.199 | 142.975 | 23.548218597063625 | milliSeconds | -| LRANGE_500 (first 450 elements)_Min_Latency | 0.88 | 5.92 | 1.0238686786296896 | milliSeconds | -| LRANGE_500 (first 450 elements)_P50_Latency | 0.911 | 42.111 | 4.821265497553018 | milliSeconds | -| LRANGE_500 (first 450 elements)_P95_Latency | 1.119 | 75.967 | 7.64909665579119 | milliSeconds | -| LRANGE_500 (first 450 elements)_P99_Latency | 1.167 | 110.527 | 13.705281810766719 | milliSeconds | -| LRANGE_500 (first 450 elements)_Requests/Sec | 2631.63 | 21726.68 | 12339.182366435563 | requests/second | -| LRANGE_600 (first 600 elements)_Average_Latency | 1.307 | 47.115 | 5.649815456769985 | milliSeconds | -| LRANGE_600 (first 600 elements)_Max_Latency | 1.567 | 451.839 | 26.307774877650905 | milliSeconds | -| LRANGE_600 (first 600 elements)_Min_Latency | 1.176 | 7.904 | 1.3783254486133792 | milliSeconds | -| LRANGE_600 (first 600 elements)_P50_Latency | 1.231 | 48.735 | 5.666452691680261 | milliSeconds | -| LRANGE_600 (first 600 elements)_P95_Latency | 1.479 | 104.511 | 8.99248735725938 | milliSeconds | -| LRANGE_600 (first 600 elements)_P99_Latency | 1.559 | 133.759 | 15.49082096247961 | milliSeconds | -| LRANGE_600 (first 600 elements)_Requests/Sec | 1844.91 | 16207.12 | 9321.784952589722 | requests/second | -| MSET (10 keys)_Average_Latency | 0.108 | 31.115 | 1.018267536704731 | milliSeconds | -| MSET (10 keys)_Max_Latency | 0.183 | 116.543 | 5.104883768352365 | milliSeconds | -| MSET (10 keys)_Min_Latency | 0.088 | 15.584 | 0.18198939641109289 | milliSeconds | -| MSET (10 keys)_P50_Latency | 0.103 | 31.983 | 0.91268515497553 | milliSeconds | -| MSET (10 keys)_P95_Latency | 0.135 | 44.127 | 1.9114253670473083 | milliSeconds | -| MSET (10 keys)_P99_Latency | 0.151 | 66.367 | 3.06757911908646 | milliSeconds | -| MSET (10 keys)_Requests/Sec | 8211.46 | 333866.69 | 232481.1612709011 | requests/second | -| P50lat | 0.175 | 77.823 | 15.913107353397399 | msec | -| P90lat | 0.223 | 134.143 | 20.048949115730684 | msec | -| P95lat | 0.231 | 179.199 | 24.911873409866585 | msec | -| P99_9lat | 0.311 | 311.295 | 46.154507291343488 | msec | -| P99lat | 0.271 | 239.615 | 34.136540179956579 | msec | -| PING_INLINE_Average_Latency | 0.031 | 32.654 | 0.8576825874197166 | milliSeconds | -| PING_INLINE_Max_Latency | 0.071 | 116.223 | 4.955231624018758 | milliSeconds | -| PING_INLINE_Min_Latency | 0.024 | 31.696 | 0.06140850239575872 | milliSeconds | -| PING_INLINE_P50_Latency | 0.031 | 31.983 | 0.843882454888369 | milliSeconds | -| PING_INLINE_P95_Latency | 0.047 | 43.935 | 1.82383678254664 | milliSeconds | -| PING_INLINE_P99_Latency | 0.063 | 63.967 | 3.040517789784892 | milliSeconds | -| PING_INLINE_Requests/Sec | 7752.32 | 1252000.0 | 581094.6461810576 | requests/second | -| PING_MBULK_Average_Latency | 0.03 | 32.952 | 0.715390049954124 | milliSeconds | -| PING_MBULK_Max_Latency | 0.063 | 151.423 | 4.454256193291875 | milliSeconds | -| PING_MBULK_Min_Latency | 0.016 | 31.728 | 0.06472831073503899 | milliSeconds | -| PING_MBULK_P50_Latency | 0.031 | 31.983 | 0.6089410745233973 | milliSeconds | -| PING_MBULK_P95_Latency | 0.047 | 42.495 | 1.6596985421551618 | milliSeconds | -| PING_MBULK_P99_Latency | 0.047 | 70.143 | 2.810248853094097 | milliSeconds | -| PING_MBULK_Requests/Sec | 7680.98 | 1724689.75 | 693490.7826455291 | requests/second | -| RPOP_Average_Latency | 0.048 | 32.67 | 0.4743477086200745 | milliSeconds | -| RPOP_Max_Latency | 0.087 | 87.359 | 2.9461633787021466 | milliSeconds | -| RPOP_Min_Latency | 0.024 | 31.792 | 0.06490900749350025 | milliSeconds | -| RPOP_P50_Latency | 0.047 | 31.983 | 0.4230913493398589 | milliSeconds | -| RPOP_P95_Latency | 0.063 | 43.903 | 0.9695402457052563 | milliSeconds | -| RPOP_P99_Latency | 0.079 | 68.095 | 1.6080631595045119 | milliSeconds | -| RPOP_Requests/Sec | 7728.4 | 1252000.0 | 574482.0906270068 | requests/second | -| RPUSH_Average_Latency | 0.047 | 32.51 | 0.4755399123254154 | milliSeconds | -| RPUSH_Max_Latency | 0.103 | 80.703 | 3.0799974513202166 | milliSeconds | -| RPUSH_Min_Latency | 0.032 | 19.888 | 0.06624487715363413 | milliSeconds | -| RPUSH_P50_Latency | 0.047 | 31.983 | 0.4171364053420334 | milliSeconds | -| RPUSH_P95_Latency | 0.055 | 42.271 | 1.010727189315935 | milliSeconds | -| RPUSH_P99_Latency | 0.071 | 60.607 | 1.6829286369660515 | milliSeconds | -| RPUSH_Requests/Sec | 7770.36 | 1252000.0 | 571089.7713635434 | requests/second | -| SADD_Average_Latency | 0.041 | 32.461 | 0.4328111332007951 | milliSeconds | -| SADD_Max_Latency | 0.079 | 88.639 | 2.8693630524545035 | milliSeconds | -| SADD_Min_Latency | 0.024 | 19.984 | 0.06152418820410837 | milliSeconds | -| SADD_P50_Latency | 0.039 | 31.967 | 0.38828725085385126 | milliSeconds | -| SADD_P95_Latency | 0.047 | 35.999 | 0.9137253912422898 | milliSeconds | -| SADD_P99_Latency | 0.063 | 70.463 | 1.5430375184788703 | milliSeconds | -| SADD_Requests/Sec | 7776.4 | 1430857.12 | 635851.0720176373 | requests/second | -| SET_Average_Latency | 0.04 | 32.145 | 0.6898151187684778 | milliSeconds | -| SET_Max_Latency | 0.087 | 89.983 | 3.641637169945968 | milliSeconds | -| SET_Min_Latency | 0.024 | 19.968 | 0.06945458252625107 | milliSeconds | -| SET_P50_Latency | 0.039 | 31.983 | 0.6662162299928638 | milliSeconds | -| SET_P95_Latency | 0.055 | 41.823 | 1.3665498012029769 | milliSeconds | -| SET_P99_Latency | 0.071 | 62.399 | 2.2267908043633399 | milliSeconds | -| SET_Requests/Sec | 7945.35 | 1252000.0 | 572498.2329707408 | requests/second | -| SPOP_Average_Latency | 0.037 | 32.491 | 0.3794379364836622 | milliSeconds | -| SPOP_Max_Latency | 0.079 | 97.279 | 2.638165579119087 | milliSeconds | -| SPOP_Min_Latency | 0.016 | 13.544 | 0.054340622929091839 | milliSeconds | -| SPOP_P50_Latency | 0.039 | 31.983 | 0.33848531810766677 | milliSeconds | -| SPOP_P95_Latency | 0.047 | 33.343 | 0.8019090538336049 | milliSeconds | -| SPOP_P99_Latency | 0.063 | 85.247 | 1.3729359706362153 | milliSeconds | -| SPOP_Requests/Sec | 7800.62 | 1669333.38 | 706734.1855013502 | requests/second | -| Throughput | 17241.1 | 17831817.36 | 420260.31174061438 | req/sec | -| Throughput_1 | 7991.8 | 725154.18 | 121838.8537220757 | req/sec | -| Throughput_2 | 7978.87 | 692205.02 | 125506.61857237639 | req/sec | -| Throughput_3 | 7978.82 | 682122.49 | 226745.34571946169 | req/sec | -| Throughput_4 | 7987.6 | 686825.72 | 222295.19148550728 | req/sec | -| Throughput_5 | 7997.75 | 598232.21 | 365697.4250622406 | req/sec | -| Throughput_6 | 8069.37 | 601568.91 | 361309.62545643156 | req/sec | -| Throughput_7 | 7990.86 | 599252.78 | 359559.5156846473 | req/sec | -| Throughput_8 | 7848.25 | 603902.39 | 355645.1763692946 | req/sec | -| Throughput_9 | 7959.36 | 601072.71 | 366984.76313278006 | req/sec | -| Throughput_10 | 8077.92 | 600753.97 | 359649.95155601666 | req/sec | -| Throughput_11 | 11259.51 | 606504.23 | 371196.62074688795 | req/sec | -| Throughput_12 | 12927.96 | 604422.16 | 366911.36591286308 | req/sec | -| Throughput_13 | 15823.17 | 600497.42 | 370432.29354771788 | req/sec | -| Throughput_14 | 9425.41 | 631362.58 | 367812.6839004149 | req/sec | -| Throughput_15 | 7938.37 | 600614.93 | 365751.3786307054 | req/sec | -| Throughput_16 | 8040.45 | 620613.9 | 364617.5147717842 | req/sec | -| Throughput_17 | 24216.81 | 597151.65 | 521581.0625 | req/sec | -| Throughput_18 | 14095.34 | 588297.44 | 503727.2914444444 | req/sec | -| Throughput_19 | 40187.53 | 588862.04 | 510501.55233333338 | req/sec | -| Throughput_20 | 7966.28 | 612374.9 | 516058.48594444445 | req/sec | -| Throughput_21 | 7968.36 | 595201.63 | 507762.146 | req/sec | -| Throughput_22 | 11257.82 | 585266.7 | 513529.0027777778 | req/sec | -| Throughput_23 | 14063.64 | 606528.09 | 500516.64094444448 | req/sec | -| Throughput_24 | 106473.13 | 586454.49 | 519954.47449999998 | req/sec | -| Throughput_25 | 37818.15 | 601838.71 | 525582.0592222222 | req/sec | -| Throughput_26 | 32977.5 | 596654.97 | 524031.9821111111 | req/sec | -| Throughput_27 | 72817.5 | 599946.86 | 540320.1502777778 | req/sec | -| Throughput_28 | 30742.39 | 603668.89 | 525381.3121111111 | req/sec | -| Throughput_29 | 18079.89 | 594704.31 | 527886.6923333333 | req/sec | -| Throughput_30 | 8059.06 | 598590.76 | 536338.2217777777 | req/sec | -| Throughput_31 | 7862.62 | 604166.52 | 526071.3032222221 | req/sec | -| Throughput_32 | 173970.91 | 612097.88 | 545605.0684444446 | req/sec | -| ZADD_Average_Latency | 0.049 | 32.278 | 0.47239202691680268 | milliSeconds | -| ZADD_Max_Latency | 0.095 | 76.287 | 2.975741027732463 | milliSeconds | -| ZADD_Min_Latency | 0.032 | 19.952 | 0.07185685154975509 | milliSeconds | -| ZADD_P50_Latency | 0.047 | 31.983 | 0.4249959216965742 | milliSeconds | -| ZADD_P95_Latency | 0.063 | 41.695 | 0.948325856443719 | milliSeconds | -| ZADD_P99_Latency | 0.079 | 55.935 | 1.5922194127243066 | milliSeconds | -| ZADD_Requests/Sec | 7911.42 | 1112888.88 | 537931.0682534662 | requests/second | -| ZPOPMIN_Average_Latency | 0.036 | 24.386 | 0.3803461969820555 | milliSeconds | -| ZPOPMIN_Max_Latency | 0.079 | 109.695 | 2.6673927406199025 | milliSeconds | -| ZPOPMIN_Min_Latency | 0.016 | 13.448 | 0.05634461663947769 | milliSeconds | -| ZPOPMIN_P50_Latency | 0.039 | 31.935 | 0.33162479608482828 | milliSeconds | -| ZPOPMIN_P95_Latency | 0.047 | 39.935 | 0.8215623980424145 | milliSeconds | -| ZPOPMIN_P99_Latency | 0.063 | 86.527 | 1.403702691680261 | milliSeconds | -| ZPOPMIN_Requests/Sec | 10461.41 | 1669333.38 | 700640.1472772221 | requests/second | +|ToolName | ScenarioName | Metric Name | Example Value | Unit | +|--------------|-------------------------|--------------|---------------|-------| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Throughput_Avg | 96143.676666666681| requests/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Throughput_Max |99310.66 | requests/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Throughput_Min |93126.7 |requests/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Throughput_Stdev| 1756.3137622699699| requests/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Throughput_P80 |98123.77 |requests/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Throughput_Sum |1153724.12 |requests/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Hits/sec_Avg |48070.774999999994 | | +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Hits/sec_Max |49654.27 | | +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Hits/sec_Min |46562.29 | | +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Hits/sec_Stdev |878.156472669686 | | +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Hits/sec_P80 |49060.82 | | +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Hits/sec_Sum |576849.29999999993 | | +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Misses/sec_Avg |0 | | +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Misses/sec_Min |0 | | +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Misses/sec_Max |0 | | +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Misses/sec_Stdev| 0 | | +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Misses/sec_P80 |0 | | +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Misses/sec_Sum |0 | | +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-Avg_Avg |265.929245 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-Avg_Min |257.37339 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-Avg_Max |274.49494 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-Avg_Stdev| 4.8649509314371953 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-Avg_P80 |268.37573 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P50_Avg |258.4736666666667 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P50_Min |252.927 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P50_Max |266.239 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P50_Stdev| 3.9095334191634046| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P50_P80 |260.095 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P90_Min |331.775 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P90_Avg |337.74833333333333| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P90_P80 |339.967 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P90_Max |348.159 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P90_Stdev| 4.6894529413236388| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P95_Min |346.111 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P95_Avg |354.4736666666667 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P95_Max |364.543 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P95_Stdev| 4.6894529413236388| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P95_P80 |356.351 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P99_Avg |385.36433333333338| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P99_Min |376.831 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P99_Max |397.311 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P99_Stdev| 5.3427117542394855| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P99_P80 |389.119 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P99.9_Avg| 442.02566666666667| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P99.9_Min| 411.647 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P99.9_Max| 532.479 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P99.9_Stdev |32.01080706400402| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Latency-P99.9_P80 |452.607 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Bandwidth_Avg |99831.145833333328| kilobytes/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Bandwidth_Min |96698.49 | kilobytes/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Bandwidth_Stdev |1823.6575402628735| kilobytes/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Bandwidth_Max |103119.55 |kilobytes/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1||Bandwidth_P80 |101887.18 |kilobytes/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Throughput_Avg| 48070.774999999994| requests/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|Bandwidth_Sum |1197973.75 |kilobytes/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Throughput_Min| 46562.29 |requests/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Throughput_Max| 49654.27 |requests/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Throughput_P80| 49060.82 |requests/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Throughput_Stdev| 878.156472669686 |requests/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Throughput_Sum |576849.29999999993 |requests/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-Avg_Avg |265.9334425 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-Avg_Min |257.37776 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-Avg_P80 |268.38027 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-Avg_Max |274.49896 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-Avg_Stdev| 4.8649389483855519| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P50_Avg |258.4736666666667 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P50_Min |252.927 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P50_Max |266.239 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P90_Avg |337.74833333333333| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P90_Stdev| 4.6894529413236388| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P90_Min |331.775 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P90_Max |348.159 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P50_Stdev| 3.9095334191634046| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P50_P80 |260.095 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P90_P80 |339.967 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P95_Avg |354.81500000000005| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P95_Min |346.111 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P95_Max |364.543 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P95_Stdev| 5.0252567430265076| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P95_P80 |356.351 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P99_Avg |386.047 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P99_Min |376.831 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P99_Max |397.311 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P99_Stdev| 5.3208600808515767| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P99_P80 |391.167 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P99.9_Avg| 442.87900000000008| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P99.9_Min| 411.647 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P99.9_Max| 532.479 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P99.9_Stdev| 31.706816932640848| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Latency-P99.9_P80 |454.655 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Bandwidth_Avg |49797.129166666673| kilobytes/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Bandwidth_Stdev |909.68510072129129| kilobytes/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Bandwidth_Min |48234.48 |kilobytes/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Bandwidth_Max |51437.47 |kilobytes/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Bandwidth_P80 |50822.73 |kilobytes/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Throughput_Avg |48072.902499999989| requests/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|GET_Bandwidth_Sum |597565.55 |kilobytes/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Throughput_Min |46564.42 |requests/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Throughput_Max |49656.39 |requests/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Throughput_P80 |49062.95 |requests/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Throughput_Stdev |878.15536932182385| requests/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Throughput_Sum |576874.82999999984| requests/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-Avg_Avg |265.92504749999995| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-Avg_Min |257.36902 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-Avg_Max |274.49091 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-Avg_P80 |268.37118 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P50_Avg |258.4736666666667| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-Avg_Stdev| 4.8649615272924267| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P50_Min |252.927 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P50_Max |266.239 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P50_P80 |260.095 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P90_Avg |337.74833333333333| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P50_Stdev| 3.9095334191634046| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P90_Min |331.775 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P90_Max |348.159 |milli0seconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P90_Stdev| 4.6894529413236388| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P90_P80 |339.967 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P95_Avg |354.30299999999994| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P95_Min |346.111 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P95_Max |364.543 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P95_Stdev| 4.8029857380591956| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P95_P80 |356.351 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P99_Stdev| 5.1850095039021333| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P99_Min |374.783 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P99_Avg |384.85233333333332| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P99_P80 |389.119 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P99_Max |395.263 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P99.9_Avg| 441.17233333333337| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P99.9_Min| 409.599 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P99.9_Max| 536.575 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P99.9_Stdev |33.438038432632723| milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Bandwidth_Avg |50034.015833333331| kilobytes/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Latency-P99.9_P80| 450.559 |milliseconds| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Bandwidth_Min |48464.01 |kilobytes/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Bandwidth_P80 |51064.45 |kilobytes/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Bandwidth_Stdev |913.97098802841549| kilobytes/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Bandwidth_Sum |600408.19 |kilobytes/sec| +|Memtier-Redis |memtier_16t_16c_1kb_r1:1|SET_Bandwidth_Max |51682.07 |kilobytes/sec| From 19164fcd8fc4c0b05468d29ca0829a36cf8e3983 Mon Sep 17 00:00:00 2001 From: nikhitha malkapuram <nmalkapuram@microsoft.com> Date: Mon, 6 Nov 2023 21:20:07 +0530 Subject: [PATCH 5/7] resolving UTs --- .../Redis/RedisExecutorTests.cs | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/VirtualClient/VirtualClient.Actions.UnitTests/Redis/RedisExecutorTests.cs b/src/VirtualClient/VirtualClient.Actions.UnitTests/Redis/RedisExecutorTests.cs index 7e6c913217..3c62dc36a0 100644 --- a/src/VirtualClient/VirtualClient.Actions.UnitTests/Redis/RedisExecutorTests.cs +++ b/src/VirtualClient/VirtualClient.Actions.UnitTests/Redis/RedisExecutorTests.cs @@ -67,24 +67,13 @@ public void RedisExecutorThrowsOnUnsupportedDistroAsync() } } - [Test] - [TestCase(PlatformID.Unix, Architecture.X64)] - public void RedisExecutorDoesnotThrowOnSupportedPLatform(PlatformID platform, Architecture architecture) - { - this.SetupDefaultMockBehavior(platform, architecture); - using (TestRedisExecutorExecutor executor = new TestRedisExecutorExecutor(this.fixture.Dependencies, this.fixture.Parameters)) - { - Exception exception = Assert.ThrowsAsync<Exception>( - () => executor.ExecuteAsync(CancellationToken.None)); - } - } - private void SetupDefaultMockBehavior(PlatformID platformID) { this.fixture.Setup(platformID); this.fixture.File.Setup(f => f.Exists(It.IsAny<string>())).Returns(true); this.fixture.ProcessManager.OnCreateProcess = (cmd, args, wd) => this.fixture.Process; } + private void SetupDefaultMockBehavior(PlatformID platformID, Architecture architecture) { this.fixture.Setup(platformID, architecture); From 55c86027a3607cea0b5ea3af36cddc516af6e7ce Mon Sep 17 00:00:00 2001 From: nikhitha malkapuram <nmalkapuram@microsoft.com> Date: Thu, 9 Nov 2023 01:08:19 +0530 Subject: [PATCH 6/7] clean up code --- .../Redis/RedisExecutorTests.cs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/VirtualClient/VirtualClient.Actions.UnitTests/Redis/RedisExecutorTests.cs b/src/VirtualClient/VirtualClient.Actions.UnitTests/Redis/RedisExecutorTests.cs index 3c62dc36a0..0d46056cc0 100644 --- a/src/VirtualClient/VirtualClient.Actions.UnitTests/Redis/RedisExecutorTests.cs +++ b/src/VirtualClient/VirtualClient.Actions.UnitTests/Redis/RedisExecutorTests.cs @@ -5,7 +5,6 @@ namespace VirtualClient.Actions { using System; using System.Collections.Generic; - using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -74,14 +73,6 @@ private void SetupDefaultMockBehavior(PlatformID platformID) this.fixture.ProcessManager.OnCreateProcess = (cmd, args, wd) => this.fixture.Process; } - private void SetupDefaultMockBehavior(PlatformID platformID, Architecture architecture) - { - this.fixture.Setup(platformID, architecture); - this.fixture.File.Setup(f => f.Exists(It.IsAny<string>())).Returns(true); - this.fixture.ProcessManager.OnCreateProcess = (cmd, args, wd) => this.fixture.Process; - } - - private class TestRedisExecutorExecutor : RedisExecutor { public TestRedisExecutorExecutor(IServiceCollection dependencies, IDictionary<string, IConvertible> parameters = null) From 7df089ec3beaed925b799e7aff8f21ebd00d336e Mon Sep 17 00:00:00 2001 From: nikhitha malkapuram <nmalkapuram@microsoft.com> Date: Wed, 15 Nov 2023 10:13:31 +0530 Subject: [PATCH 7/7] updating Unit tests --- .../Memtier/MemtierMetricsParserTests.cs | 185 +++++++++--------- 1 file changed, 93 insertions(+), 92 deletions(-) diff --git a/src/VirtualClient/VirtualClient.Actions.UnitTests/Memtier/MemtierMetricsParserTests.cs b/src/VirtualClient/VirtualClient.Actions.UnitTests/Memtier/MemtierMetricsParserTests.cs index 382d1d8582..b680ecdbf1 100644 --- a/src/VirtualClient/VirtualClient.Actions.UnitTests/Memtier/MemtierMetricsParserTests.cs +++ b/src/VirtualClient/VirtualClient.Actions.UnitTests/Memtier/MemtierMetricsParserTests.cs @@ -20,25 +20,28 @@ public void MemtierMetricsParserParsesTheExpectedMetricsFromMemtierResultsCorrec { List<string> resultsList = new List<string>(); string results = File.ReadAllText(Path.Combine(MockFixture.ExamplesDirectory, @"Memtier\MemcachedResults_1.txt")); + string results1 = File.ReadAllText(Path.Combine(MockFixture.ExamplesDirectory, @"Memtier\MemcachedResults_2.txt")); resultsList.Add(results); + resultsList.Add(results1); var parser = new MemtierMetricsParser(false, resultsList); IList<Metric> metrics = parser.Parse(); Assert.AreEqual(138, metrics.Count); - MetricAssert.Exists(metrics, "Throughput_Avg", 48271.29, MetricUnit.RequestsPerSec); - MetricAssert.Exists(metrics, "Throughput_Min", 48271.29, MetricUnit.RequestsPerSec); + + MetricAssert.Exists(metrics, "Throughput_Avg", 48156.565, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "Throughput_Min", 48041.840000000004, MetricUnit.RequestsPerSec); MetricAssert.Exists(metrics, "Throughput_Max", 48271.29, MetricUnit.RequestsPerSec); - MetricAssert.Exists(metrics, "Throughput_Stdev", 0, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "Throughput_Stdev", 114.72499999999854, MetricUnit.RequestsPerSec); MetricAssert.Exists(metrics, "Throughput_P80", 48271.29, MetricUnit.RequestsPerSec); - MetricAssert.Exists(metrics, "Throughput_Sum", 48271.29, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "Throughput_Sum", 96313.13, MetricUnit.RequestsPerSec); - MetricAssert.Exists(metrics, "Hits/sec_Avg", 43444.12); - MetricAssert.Exists(metrics, "Hits/sec_Min", 43444.12); + MetricAssert.Exists(metrics, "Hits/sec_Avg", 43340.87125); + MetricAssert.Exists(metrics, "Hits/sec_Min", 43237.6225); MetricAssert.Exists(metrics, "Hits/sec_Max", 43444.12); - MetricAssert.Exists(metrics, "Hits/sec_Stdev", 0); + MetricAssert.Exists(metrics, "Hits/sec_Stdev", 103.24875000000247); MetricAssert.Exists(metrics, "Hits/sec_P80", 43444.12); - MetricAssert.Exists(metrics, "Hits/sec_Sum", 43444.12); + MetricAssert.Exists(metrics, "Hits/sec_Sum", 86681.7425); MetricAssert.Exists(metrics, "Misses/sec_Avg", 0); MetricAssert.Exists(metrics, "Misses/sec_Min", 0); @@ -47,102 +50,100 @@ public void MemtierMetricsParserParsesTheExpectedMetricsFromMemtierResultsCorrec MetricAssert.Exists(metrics, "Misses/sec_P80", 0); MetricAssert.Exists(metrics, "Misses/sec_Sum", 0); - MetricAssert.Exists(metrics, "Latency-Avg_Avg", 2.62213, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-Avg_Avg", 2.6292524999999998, MetricUnit.Milliseconds); MetricAssert.Exists(metrics, "Latency-Avg_Min", 2.62213, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-Avg_Max", 2.62213, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-Avg_Stdev", 0, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-Avg_P80", 2.62213, MetricUnit.Milliseconds); - - MetricAssert.Exists(metrics, "Latency-P50_Avg", 2.75100, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P50_Min", 2.75100, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P50_Max", 2.75100, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P50_Stdev", 0, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P50_P80", 2.75100, MetricUnit.Milliseconds); - - - MetricAssert.Exists(metrics, "Latency-P90_Avg", 3.90300, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P90_Min", 3.90300, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P90_Max", 3.90300, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P90_Stdev", 0, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P90_P80", 3.90300, MetricUnit.Milliseconds); - - MetricAssert.Exists(metrics, "Latency-P95_Avg", 4.41500, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P95_Min", 4.41500, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P95_Max", 4.41500, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P95_Stdev", 0, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P95_P80", 4.41500, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-Avg_Max", 2.636375, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-Avg_Stdev", 0.007122500000000143, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-Avg_P80", 2.636375, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "Latency-P50_Avg", 2.7569999999999997, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P50_Min", 2.751, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P50_Max", 2.763, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P50_Stdev", 0.006000000000000005, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P50_P80", 2.763, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "Latency-P90_Avg", 3.917, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P90_Min", 3.903, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P90_Max", 3.931, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P90_Stdev", 0.014000000000000012, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P90_P80", 3.931, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "Latency-P95_Avg", 4.427, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P95_Min", 4.415, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P95_Max", 4.439, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P95_Stdev", 0.01200000000000001, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P95_P80", 4.439, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P99_Avg", 7.42300, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P99_Min", 7.42300, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P99_Max", 7.42300, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99_Avg", 7.423, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99_Min", 7.423, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99_Max", 7.423, MetricUnit.Milliseconds); MetricAssert.Exists(metrics, "Latency-P99_Stdev", 0, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P99_P80", 7.42300, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99_P80", 7.423, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P99.9_Avg", 29.31100, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P99.9_Min", 29.31100, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P99.9_Max", 29.31100, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P99.9_Stdev", 0, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "Latency-P99.9_P80", 29.31100, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99.9_Avg", 29.294999999999998, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99.9_Min", 29.278999999999996, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99.9_Max", 29.311, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99.9_Stdev", 0.01600000000000179, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "Latency-P99.9_P80", 29.311, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Throughput_Avg", 43444.12, MetricUnit.RequestsPerSec); - MetricAssert.Exists(metrics, "GET_Throughput_Min", 43444.12, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "GET_Throughput_Avg", 43340.87125, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "GET_Throughput_Min", 43237.6225, MetricUnit.RequestsPerSec); MetricAssert.Exists(metrics, "GET_Throughput_Max", 43444.12, MetricUnit.RequestsPerSec); - MetricAssert.Exists(metrics, "GET_Throughput_Stdev", 0, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "GET_Throughput_Stdev", 103.24875000000247, MetricUnit.RequestsPerSec); MetricAssert.Exists(metrics, "GET_Throughput_P80", 43444.12, MetricUnit.RequestsPerSec); - MetricAssert.Exists(metrics, "GET_Throughput_Sum", 43444.12, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "GET_Throughput_Sum", 86681.7425, MetricUnit.RequestsPerSec); - MetricAssert.Exists(metrics, "GET_Bandwidth_Avg", 3724.01, MetricUnit.KilobytesPerSecond); - MetricAssert.Exists(metrics, "GET_Bandwidth_Min", 3724.01, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "GET_Bandwidth_Avg", 3715.16, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "GET_Bandwidth_Min", 3706.31, MetricUnit.KilobytesPerSecond); MetricAssert.Exists(metrics, "GET_Bandwidth_Max", 3724.01, MetricUnit.KilobytesPerSecond); - MetricAssert.Exists(metrics, "GET_Bandwidth_Stdev", 0, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "GET_Bandwidth_Stdev", 8.850000000000136, MetricUnit.KilobytesPerSecond); MetricAssert.Exists(metrics, "GET_Bandwidth_P80", 3724.01, MetricUnit.KilobytesPerSecond); - MetricAssert.Exists(metrics, "GET_Bandwidth_Sum", 3724.01, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "GET_Bandwidth_Sum", 7430.32, MetricUnit.KilobytesPerSecond); - MetricAssert.Exists(metrics, "GET_Latency-Avg_Avg", 2.61979, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-Avg_Avg", 2.62682875, MetricUnit.Milliseconds); MetricAssert.Exists(metrics, "GET_Latency-Avg_Min", 2.61979, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-Avg_Max", 2.61979, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-Avg_Stdev", 0, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-Avg_P80", 2.61979, MetricUnit.Milliseconds); - - MetricAssert.Exists(metrics, "GET_Latency-P50_Avg", 2.73500, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P50_Min", 2.73500, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P50_Max", 2.73500, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P50_Stdev", 0, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P50_P80", 2.73500, MetricUnit.Milliseconds); - - MetricAssert.Exists(metrics, "GET_Latency-P90_Avg", 3.88700, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P90_Min", 3.88700, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P90_Max", 3.88700, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P90_Stdev", 0, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P90_P80", 3.88700, MetricUnit.Milliseconds); - - MetricAssert.Exists(metrics, "GET_Latency-P95_Avg", 4.41500, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P95_Min", 4.41500, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P95_Max", 4.41500, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P95_Stdev", 0, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P95_P80", 4.41500, MetricUnit.Milliseconds); - - MetricAssert.Exists(metrics, "GET_Latency-P99_Avg", 7.42300, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P99_Min", 7.42300, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P99_Max", 7.42300, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P99_Stdev", 0, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P99_P80", 7.42300, MetricUnit.Milliseconds); - - MetricAssert.Exists(metrics, "GET_Latency-P99.9_Avg", 29.31100, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P99.9_Min", 29.31100, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P99.9_Max", 29.31100, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P99.9_Stdev", 0, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "GET_Latency-P99.9_P80", 29.31100, MetricUnit.Milliseconds); - - - MetricAssert.Exists(metrics, "SET_Throughput_Avg", 4827.17, MetricUnit.RequestsPerSec); - MetricAssert.Exists(metrics, "SET_Bandwidth_Avg", 329.45, MetricUnit.KilobytesPerSecond); - MetricAssert.Exists(metrics, "SET_Latency-Avg_Avg", 2.64323, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "SET_Latency-P50_Avg", 2.83100, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "SET_Latency-P90_Avg", 3.93500, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "SET_Latency-P95_Avg", 4.47900, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "SET_Latency-P99_Avg", 7.45500, MetricUnit.Milliseconds); - MetricAssert.Exists(metrics, "SET_Latency-P99.9_Avg", 29.56700, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-Avg_Max", 2.6338675, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-Avg_Stdev", 0.0070387499999999825, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-Avg_P80", 2.6338675, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "GET_Latency-P50_Avg", 2.747, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P50_Min", 2.735, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P50_Max", 2.759, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P50_Stdev", 0.01200000000000001, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P50_P80", 2.759, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "GET_Latency-P90_Avg", 3.903, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P90_Min", 3.887, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P90_Max", 3.919, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P90_Stdev", 0.016000000000000014, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P90_P80", 3.919, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "GET_Latency-P95_Avg", 4.427, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P95_Min", 4.415, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P95_Max", 4.439, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P95_Stdev", 0.01200000000000001, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P95_P80", 4.439, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "GET_Latency-P99_Avg", 7.419, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99_Min", 7.414999999999999, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99_Max", 7.423, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99_Stdev", 0.004000000000000448, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99_P80", 7.423, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "GET_Latency-P99.9_Avg", 29.262999999999998, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99.9_Min", 29.214999999999996, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99.9_Max", 29.311, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99.9_Stdev", 0.04800000000000182, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "GET_Latency-P99.9_P80", 29.311, MetricUnit.Milliseconds); + + MetricAssert.Exists(metrics, "SET_Throughput_Avg", 4815.69375, MetricUnit.RequestsPerSec); + MetricAssert.Exists(metrics, "SET_Bandwidth_Avg", 328.6675, MetricUnit.KilobytesPerSecond); + MetricAssert.Exists(metrics, "SET_Latency-Avg_Avg", 2.65108125, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P50_Avg", 2.831, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P90_Avg", 3.947, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P95_Avg", 4.487, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P99_Avg", 7.503, MetricUnit.Milliseconds); + MetricAssert.Exists(metrics, "SET_Latency-P99.9_Avg", 29.583, MetricUnit.Milliseconds); } [Test]