Perf: --isolation sharedonly option for the server load harness

StandardServer's default isolation profile runs the fair queue, so the
shared request queue path is measured only with SharedOnly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Roman Ettlinger
2026-10-27 07:32:48 +01:00
co-authored by Claude Opus 5.5
parent d50a986b80
commit e451267c51
2 changed files with 6 additions and 1 deletions
+1
View File
@@ -69,6 +69,7 @@ perf/ServerLoadHarness/bin/Release/net10.0/ServerLoadHarness.exe run --scenario
| `--duration`, `--warmup` | 20, 10 | Measurement window and warm-up in seconds. |
| `--diag`, `--audit` | 0 | Server diagnostics and auditing. |
| `--threads`, `--queue` | 200, 2000 | `MaxRequestThreadCount` and `MaxQueuedRequestCount` of the server; `MinRequestThreadCount` is the smaller of 50 and `--threads`. |
| `--isolation` | `default` | `sharedonly`: run the server with the SharedOnly [resource isolation](../docs/ResourceIsolation.md) mode (no isolation provider, one FIFO request queue) instead of the default profile. |
| `--trace <file>` | | Record the measurement window with `dotnet-trace`. |
| `--trace-profile` | `cpu` | `cpu` (sampled thread time), `alloc` (allocation ticks), `contention` or `gc`. |
| `--trace-side` | `server` | The process to record: `server` (the child) or `client` (the harness itself). |
+5 -1
View File
@@ -318,6 +318,10 @@ namespace Opc.Ua.Perf.ServerLoadHarness
: contract
? new BenchmarkContractServer(telemetry, ArgInt("async-node-manager", 1) != 0)
: new ReferenceServer(telemetry);
if (Arg("isolation", "default") == "sharedonly")
{
server.ResourceIsolationOptions.Mode = Opc.Ua.Server.ServerResourceIsolationMode.SharedOnly;
}
server.TransportBindings = TestTransportBindings.WithAllSchemes();
await application.StartAsync(server).ConfigureAwait(false);
Console.WriteLine(FormattableString.Invariant($"READY {endpointUrl} {Environment.ProcessId}"));
@@ -391,7 +395,7 @@ namespace Opc.Ua.Perf.ServerLoadHarness
};
(Process startedServer, BlockingCollection<string> startedLines) = StartServerChild(
FormattableString.Invariant(
$"server --port {port} --diag {Arg("diag", "0")} --audit {Arg("audit", "0")} --threads {Arg("threads", "200")} --counters {(scenario == "counters" ? Arg("nodes", "1") : "0")} --sampling {Arg("sampling", "10")} --queue {Arg("queue", "2000")}"),
$"server --port {port} --diag {Arg("diag", "0")} --audit {Arg("audit", "0")} --threads {Arg("threads", "200")} --counters {(scenario == "counters" ? Arg("nodes", "1") : "0")} --sampling {Arg("sampling", "10")} --queue {Arg("queue", "2000")} --isolation {Arg("isolation", "default")}"),
serverEnvironment);
using Process server = startedServer;
using BlockingCollection<string> serverLines = startedLines;