Skip to content

Commit 17e8d69

Browse files
author
rhamlett_microsoft
committed
Updates to load testing to make more aggressive.
1 parent 5dbef58 commit 17e8d69

7 files changed

Lines changed: 328 additions & 56 deletions

File tree

src/PerfProblemSimulator/Controllers/LoadTestController.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,8 @@ public LoadTestController(
150150
/// </summary>
151151
/// <param name="workIterations">Number of SHA256 hash iterations (default: 1000).</param>
152152
/// <param name="bufferSizeKb">Memory buffer size in KB (default: 5).</param>
153-
/// <param name="softLimit">Concurrent request soft limit (default: 50).</param>
154-
/// <param name="degradationFactor">Delay ms per request over limit (default: 5).</param>
153+
/// <param name="softLimit">Concurrent request soft limit (default: 10).</param>
154+
/// <param name="degradationFactor">Delay ms per request over limit (default: 50).</param>
155155
/// <param name="cancellationToken">Cancellation token from the HTTP request pipeline.</param>
156156
/// <returns>Load test result with timing and diagnostic information.</returns>
157157
/// <remarks>
@@ -180,11 +180,11 @@ public LoadTestController(
180180
/// <description>Size of memory buffer to allocate in kilobytes. Released after request.</description>
181181
/// </item>
182182
/// <item>
183-
/// <term>softLimit (default: 50)</term>
183+
/// <term>softLimit (default: 10)</term>
184184
/// <description>Concurrent request count before degradation delays begin.</description>
185185
/// </item>
186186
/// <item>
187-
/// <term>degradationFactor (default: 5)</term>
187+
/// <term>degradationFactor (default: 50)</term>
188188
/// <description>Milliseconds of delay added per concurrent request over the soft limit.</description>
189189
/// </item>
190190
/// </list>
@@ -212,8 +212,8 @@ public LoadTestController(
212212
public async Task<IActionResult> ExecuteLoadTest(
213213
[FromQuery] int workIterations = 1000,
214214
[FromQuery] int bufferSizeKb = 5,
215-
[FromQuery] int softLimit = 50,
216-
[FromQuery] int degradationFactor = 5,
215+
[FromQuery] int softLimit = 10,
216+
[FromQuery] int degradationFactor = 50,
217217
CancellationToken cancellationToken = default)
218218
{
219219
/*
@@ -302,8 +302,8 @@ public async Task<IActionResult> ExecuteLoadTest(
302302
/// </summary>
303303
/// <param name="workIterations">Number of hash iterations (default: 1000).</param>
304304
/// <param name="bufferSizeKb">Memory buffer size in KB (default: 5).</param>
305-
/// <param name="softLimit">Concurrent request soft limit (default: 50).</param>
306-
/// <param name="degradationFactor">Delay ms per request over limit (default: 5).</param>
305+
/// <param name="softLimit">Concurrent request soft limit (default: 10).</param>
306+
/// <param name="degradationFactor">Delay ms per request over limit (default: 50).</param>
307307
/// <param name="cancellationToken">Cancellation token.</param>
308308
/// <returns>Load test result with timing details.</returns>
309309
[HttpGet("probe")]
@@ -312,8 +312,8 @@ public async Task<IActionResult> ExecuteLoadTest(
312312
public async Task<IActionResult> ExecuteLoadTestProbe(
313313
[FromQuery] int workIterations = 1000,
314314
[FromQuery] int bufferSizeKb = 5,
315-
[FromQuery] int softLimit = 50,
316-
[FromQuery] int degradationFactor = 5,
315+
[FromQuery] int softLimit = 10,
316+
[FromQuery] int degradationFactor = 50,
317317
CancellationToken cancellationToken = default)
318318
{
319319
/*

src/PerfProblemSimulator/Hubs/IMetricsClient.cs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,18 @@ public interface IMetricsClient
6767
/// </para>
6868
/// </remarks>
6969
Task ReceiveSlowRequestLatency(SlowRequestLatencyData data);
70+
71+
/// <summary>
72+
/// Receives load test statistics update for event log display.
73+
/// </summary>
74+
/// <param name="data">The load test statistics data.</param>
75+
/// <remarks>
76+
/// <para>
77+
/// This is broadcast every 60 seconds while the load test endpoint is receiving
78+
/// traffic. Shows concurrent requests, average response time, and throughput.
79+
/// </para>
80+
/// </remarks>
81+
Task ReceiveLoadTestStats(LoadTestStatsData data);
7082
}
7183

7284
/// <summary>
@@ -109,3 +121,50 @@ public class SlowRequestLatencyData
109121
/// </summary>
110122
public string? ErrorMessage { get; set; }
111123
}
124+
125+
/// <summary>
126+
/// Data about load test endpoint statistics for event log display.
127+
/// Broadcast every 60 seconds while the endpoint is receiving traffic.
128+
/// </summary>
129+
public class LoadTestStatsData
130+
{
131+
/// <summary>
132+
/// Current number of concurrent requests being processed.
133+
/// </summary>
134+
public int CurrentConcurrent { get; set; }
135+
136+
/// <summary>
137+
/// Peak concurrent requests observed in this reporting period.
138+
/// </summary>
139+
public int PeakConcurrent { get; set; }
140+
141+
/// <summary>
142+
/// Total requests completed in this reporting period.
143+
/// </summary>
144+
public long RequestsCompleted { get; set; }
145+
146+
/// <summary>
147+
/// Average response time in milliseconds for this period.
148+
/// </summary>
149+
public double AvgResponseTimeMs { get; set; }
150+
151+
/// <summary>
152+
/// Maximum response time observed in this period.
153+
/// </summary>
154+
public double MaxResponseTimeMs { get; set; }
155+
156+
/// <summary>
157+
/// Requests per second throughput.
158+
/// </summary>
159+
public double RequestsPerSecond { get; set; }
160+
161+
/// <summary>
162+
/// Number of exceptions thrown (after 120s of traffic).
163+
/// </summary>
164+
public int ExceptionCount { get; set; }
165+
166+
/// <summary>
167+
/// When this stats snapshot was taken.
168+
/// </summary>
169+
public DateTimeOffset Timestamp { get; set; }
170+
}

src/PerfProblemSimulator/Models/LoadTestRequest.cs

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
* {
1212
* "workIterations": 1000,
1313
* "bufferSizeKb": 5,
14-
* "softLimit": 50,
15-
* "degradationFactor": 5
14+
* "softLimit": 10,
15+
* "degradationFactor": 50
1616
* }
1717
*
1818
* OR with defaults (empty body or null):
@@ -56,19 +56,19 @@ namespace PerfProblemSimulator.Models;
5656
/// <term>softLimit</term>
5757
/// <description>
5858
/// Concurrent requests before degradation starts. Lower = earlier degradation.
59-
/// Tune based on expected normal load. 50 is good for typical web apps.
59+
/// Tune based on expected normal load. 10 is aggressive for testing timeouts.
6060
/// </description>
6161
/// </item>
6262
/// <item>
6363
/// <term>degradationFactor</term>
6464
/// <description>
6565
/// Milliseconds of delay added per request OVER the soft limit.
66-
/// Higher = steeper degradation curve. 5ms is moderate.
66+
/// Higher = steeper degradation curve. 50ms is aggressive.
6767
///
68-
/// Example: softLimit=50, degradationFactor=5
69-
/// - 60 concurrent: (60-50) * 5 = 50ms added delay
70-
/// - 100 concurrent: (100-50) * 5 = 250ms added delay
71-
/// - 200 concurrent: (200-50) * 5 = 750ms added delay
68+
/// Example: softLimit=10, degradationFactor=50
69+
/// - 20 concurrent: (20-10) * 50 = 500ms added delay
70+
/// - 50 concurrent: (50-10) * 50 = 2000ms added delay
71+
/// - 100 concurrent: (100-10) * 50 = 4500ms added delay
7272
/// </description>
7373
/// </item>
7474
/// </list>
@@ -134,7 +134,7 @@ public class LoadTestRequest
134134
/// </summary>
135135
/// <remarks>
136136
/// <para>
137-
/// <strong>DEFAULT: 50</strong>
137+
/// <strong>DEFAULT: 10</strong>
138138
/// </para>
139139
/// <para>
140140
/// When concurrent requests exceed this limit, additional delay is
@@ -154,14 +154,14 @@ public class LoadTestRequest
154154
/// </list>
155155
/// </para>
156156
/// </remarks>
157-
public int SoftLimit { get; set; } = 50;
157+
public int SoftLimit { get; set; } = 10;
158158

159159
/// <summary>
160160
/// Milliseconds of delay added per concurrent request over the soft limit.
161161
/// </summary>
162162
/// <remarks>
163163
/// <para>
164-
/// <strong>DEFAULT: 5 ms</strong>
164+
/// <strong>DEFAULT: 50 ms</strong>
165165
/// </para>
166166
/// <para>
167167
/// <strong>DEGRADATION FORMULA:</strong>
@@ -170,25 +170,25 @@ public class LoadTestRequest
170170
/// </code>
171171
/// </para>
172172
/// <para>
173-
/// <strong>EXAMPLES (softLimit=50, degradationFactor=5):</strong>
173+
/// <strong>EXAMPLES (softLimit=10, degradationFactor=50):</strong>
174174
/// <list type="bullet">
175-
/// <item>30 concurrent → 0ms added (below soft limit)</item>
176-
/// <item>60 concurrent → 50ms added ((60-50) × 5)</item>
177-
/// <item>100 concurrent → 250ms added ((100-50) × 5)</item>
178-
/// <item>200 concurrent → 750ms added ((200-50) × 5)</item>
179-
/// <item>500 concurrent → 2250ms added ((500-50) × 5)</item>
175+
/// <item>5 concurrent → 0ms added (below soft limit)</item>
176+
/// <item>20 concurrent → 500ms added ((20-10) × 50)</item>
177+
/// <item>50 concurrent → 2000ms added ((50-10) × 50)</item>
178+
/// <item>100 concurrent → 4500ms added ((100-10) × 50)</item>
179+
/// <item>200 concurrent → 9500ms added ((200-10) × 50)</item>
180180
/// </list>
181181
/// </para>
182182
/// <para>
183183
/// <strong>REACHING 230s TIMEOUT:</strong>
184184
/// To reach Azure's 230s timeout with these defaults:
185-
/// (230000ms - 100ms base) / 5ms = 45980 requests over soft limit
186-
/// So: 50 + 45980 = ~46000 concurrent requests
185+
/// (230000ms - 100ms base) / 50ms = 4598 requests over soft limit
186+
/// So: 10 + 4598 = ~4608 concurrent requests
187187
///
188-
/// For faster degradation, increase degradationFactor:
189-
/// - degradationFactor=50: ~4650 concurrent requests to timeout
190-
/// - degradationFactor=100: ~2350 concurrent requests to timeout
188+
/// For lighter degradation, decrease degradationFactor:
189+
/// - degradationFactor=25: ~9200 concurrent requests to timeout
190+
/// - degradationFactor=10: ~23000 concurrent requests to timeout
191191
/// </para>
192192
/// </remarks>
193-
public int DegradationFactor { get; set; } = 5;
193+
public int DegradationFactor { get; set; } = 50;
194194
}

0 commit comments

Comments
 (0)