{ "Date": "2026-03-17", "Workspace": "C:\\dev\\serdica-backend4", "TestCommand": "dotnet test src/Serdica/Ablera.Serdica.Workflow/__Tests/Ablera.Serdica.Workflow.IntegrationTests/Ablera.Serdica.Workflow.IntegrationTests.csproj -c Release --no-build --filter \"FullyQualifiedName~PostgresPerformance\"", "SuiteResult": { "Passed": 11, "Total": 11, "Duration": "2 m 16 s" }, "RawArtifactDirectory": "src/Serdica/Ablera.Serdica.Workflow/__Tests/Ablera.Serdica.Workflow.IntegrationTests/bin/Release/net9.0/TestResults/workflow-performance/", "PostgresEnvironment": { "DockerImage": "postgres:16-alpine", "Database": "workflow", "Version": "PostgreSQL 16.13", "Backend": "Durable queue tables plus LISTEN/NOTIFY wake hints" }, "MeasurementViews": { "SerialLatencyScenario": "postgres-signal-roundtrip-latency-serial", "SteadyThroughputScenario": "postgres-signal-roundtrip-throughput-parallel", "CapacityScenarioPrefix": "postgres-signal-roundtrip-capacity-" }, "Notes": { "TopWaitCounts": [ { "Name": "Client:ClientRead", "Count": 13 }, { "Name": "", "Count": 1 } ], "Interpretation": [ "Serial latency baseline and steady throughput baseline are separated from the capacity ladder.", "The capacity ladder still scales through c16 on this local PostgreSQL Docker setup.", "Immediate queue handling remains much cheaper than full workflow resume.", "The dominant observed backend state is client read waiting, not an obvious storage stall." ] }, "Scenarios": [ { "ScenarioName": "postgres-signal-roundtrip-capacity-c1", "Tier": "WorkflowPerfCapacity", "OperationCount": 16, "Concurrency": 1, "DurationMilliseconds": 3895.54, "ThroughputPerSecond": 4.11, "AverageLatencyMilliseconds": 3738.08, "P95LatencyMilliseconds": 3762.51, "MaxLatencyMilliseconds": 3771.10, "TopWait": "Client:ClientRead", "CounterDeltas": { "xact_commit": 251, "xact_rollback": 7, "blks_hit": 1654, "blks_read": 24, "tup_inserted": 48, "tup_updated": 48, "tup_deleted": 16 } }, { "ScenarioName": "postgres-signal-roundtrip-capacity-c4", "Tier": "WorkflowPerfCapacity", "OperationCount": 64, "Concurrency": 4, "DurationMilliseconds": 3700.99, "ThroughputPerSecond": 17.29, "AverageLatencyMilliseconds": 3577.49, "P95LatencyMilliseconds": 3583.70, "MaxLatencyMilliseconds": 3584.43, "TopWait": "Client:ClientRead", "CounterDeltas": { "xact_commit": 1080, "xact_rollback": 21, "blks_hit": 7084, "blks_read": 1, "tup_inserted": 192, "tup_updated": 192, "tup_deleted": 64 } }, { "ScenarioName": "postgres-signal-roundtrip-capacity-c8", "Tier": "WorkflowPerfCapacity", "OperationCount": 128, "Concurrency": 8, "DurationMilliseconds": 3853.89, "ThroughputPerSecond": 33.21, "AverageLatencyMilliseconds": 3713.31, "P95LatencyMilliseconds": 3718.66, "MaxLatencyMilliseconds": 3719.34, "TopWait": "Client:ClientRead", "CounterDeltas": { "xact_commit": 2348, "xact_rollback": 44, "blks_hit": 17069, "blks_read": 0, "tup_inserted": 384, "tup_updated": 384, "tup_deleted": 128 } }, { "ScenarioName": "postgres-signal-roundtrip-capacity-c16", "Tier": "WorkflowPerfCapacity", "OperationCount": 256, "Concurrency": 16, "DurationMilliseconds": 4488.07, "ThroughputPerSecond": 57.04, "AverageLatencyMilliseconds": 4251.48, "P95LatencyMilliseconds": 4287.87, "MaxLatencyMilliseconds": 4294.09, "TopWait": "Client:ClientRead", "CounterDeltas": { "xact_commit": 4536, "xact_rollback": 48, "blks_hit": 40443, "blks_read": 0, "tup_inserted": 768, "tup_updated": 768, "tup_deleted": 256 } }, { "ScenarioName": "postgres-signal-roundtrip-latency-serial", "Tier": "WorkflowPerfLatency", "OperationCount": 16, "Concurrency": 1, "DurationMilliseconds": 49290.47, "ThroughputPerSecond": 0.32, "AverageLatencyMilliseconds": 3079.33, "P95LatencyMilliseconds": 3094.94, "MaxLatencyMilliseconds": 3101.71, "PhaseLatencySummaries": { "start": { "AverageMilliseconds": 6.12, "P95Milliseconds": 9.29, "MaxMilliseconds": 11.26 }, "signalPublish": { "AverageMilliseconds": 5.63, "P95Milliseconds": 6.82, "MaxMilliseconds": 7.53 }, "signalToCompletion": { "AverageMilliseconds": 3073.20, "P95Milliseconds": 3086.59, "MaxMilliseconds": 3090.44 } } }, { "ScenarioName": "postgres-signal-roundtrip-throughput-parallel", "Tier": "WorkflowPerfThroughput", "OperationCount": 96, "Concurrency": 16, "DurationMilliseconds": 3729.17, "ThroughputPerSecond": 25.74, "AverageLatencyMilliseconds": 3603.54, "P95LatencyMilliseconds": 3635.59, "MaxLatencyMilliseconds": 3649.96, "TopWait": "Client:ClientRead", "CounterDeltas": { "xact_commit": 1502, "xact_rollback": 38, "blks_hit": 21978, "blks_read": 24, "tup_inserted": 288, "tup_updated": 288, "tup_deleted": 96 }, "PhaseLatencySummaries": { "start": { "AverageMilliseconds": 16.21, "P95Milliseconds": 40.31, "MaxMilliseconds": 47.02 }, "signalPublish": { "AverageMilliseconds": 18.11, "P95Milliseconds": 23.62, "MaxMilliseconds": 28.41 }, "signalToCompletion": { "AverageMilliseconds": 3504.24, "P95Milliseconds": 3530.38, "MaxMilliseconds": 3531.14 } } }, { "ScenarioName": "postgres-signal-roundtrip-soak", "Tier": "WorkflowPerfSoak", "OperationCount": 108, "Concurrency": 8, "DurationMilliseconds": 25121.68, "ThroughputPerSecond": 4.30, "AverageLatencyMilliseconds": 4164.52, "P95LatencyMilliseconds": 4208.42, "MaxLatencyMilliseconds": 4209.96, "TopWait": "Client:ClientRead", "CounterDeltas": { "xact_commit": 3313, "xact_rollback": 352, "blks_hit": 26548, "blks_read": 269, "tup_inserted": 774, "tup_updated": 339, "tup_deleted": 108 } } ] }