Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions benchmarks/server-port/rc3/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,11 @@ The originals stay as they are because the November 2 observations in
the same scripts and instructions as the
[small-host README](../small-host/README.md), passing this directory's file
as the profile.

## Results

The November 2 rc.3 performance qualification is in
[observations-2026-11-02.md](observations-2026-11-02.md), with one summary per
run (`summary-<plan>-<mode>[-r2]-2026-11-02.json`) and the matched four-vCPU
tables (`summary-matched-4c-*-2026-11-02.md`).

118 changes: 118 additions & 0 deletions benchmarks/server-port/rc3/observations-2026-11-02.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
# Release candidate 3 observations, November 2, 2026

One batch (`dw-bench-rc3-20261102`) on disposable Vultr hosts in EWR, run by
the Cloud owner on 13:34–16:49 UTC with [small-host.json](small-host.json) and
[matched-4c.json](matched-4c.json) at Server `8f5ac120`. It is the rc.3
performance qualification. Like the
[November 2 rc.2 note](../small-host/observations-2026-11-02.md), it is a
development comparison, not a publishable capacity claim.

## Identity

- Native: `ghcr.io/durable-workflow/server@sha256:899b404b02f856cb582c5e77a95882a3f9928781083d1e7a3fe569f3ff978d6b`
(`3.0.0-rc.3`, source `04cad60e`). The only runtime change in rc.4 and in
`3.0.0` (source `74145425`) is #939's schedule next-fire math, which this
workload does not use.
- PHP reference: published Server 2.11.8,
`durableworkflow/server@sha256:3848d5d5cd1b23bd2881e3fdecea64cc44b72e6fb812e577c2db6d0872d065dd`.
- MySQL and Redis come from the profiles' digests. SDK PHP 2.3.9, lock
`42e814ee…`.
- Each small-host summary records `profile_sha256` `520f4157…`
(`small-host.json`).
- Topology is as in the rc.2 note. Targets ran only the server and its
database, with no container limits. A separate `vhp-4c-8gb-amd` driver sat
in the same private network, and each target accepted 8080 only from the
driver's private address.

## Results

Sustained one-activity capacity (workflows/s) is the highest rate that passed
twice: at least 90% closed in the window, p95 ≤ 2 s, and a clean probe.

| Plan | native-mysql | native-sqlite | php-mysql | rc.2 (Nov 2) |
| --- | ---: | ---: | --- | --- |
| `vhp-1c-1gb-amd` | 4 | 8 | none | 4 / 8 / none |
| `vhp-1c-2gb-amd` | 4 | 4 | none | 4 / 4 / none |
| `vc2-1c-1gb` | 1 (rerun 1) | 2 (rerun 2) | none | 2 / 4 / none |

No run had an OOM kill, container restart or non-zero teardown.

**rc.3 and rc.2 cost the same per workflow.** On `vhp-1c-1gb-amd` at
1 workflow/s:

| Mode | Service | rc.3 cores | rc.2 cores |
| --- | --- | ---: | ---: |
| MySQL | server | 0.099 | 0.096 |
| MySQL | MySQL | 0.183 | 0.180 |
| SQLite | server | 0.080 | 0.0795 |

The 2 workflows/s windows agree to within a few percent too. rc.3 does no
extra work and issues no extra queries.

**The lower `vc2-1c-1gb` ceilings come from that instance, not rc.3.** Both
native modes failed one ladder step below rc.2, and the reruns reproduced it
at low CPU steal. The target's 5-second `/proc/stat` samples show 1.0–1.2%
steal around the failing MySQL 2/s windows and 2.4–3.4% at the failing SQLite
4/s windows. The MySQL 2/s windows closed only 39 and 49 of 120. The SQLite
4/s windows closed 237 of 240 with p95 0.94 s but failed the probe's
late-offer check.

On this instance the unchanged MySQL image itself needed about 25% more CPU
for the same work. At 1/s it used 0.53–0.54 cores, against 0.43 on November
2's `vc2`. The server needed about 25% more as well: 0.30 against 0.24 for
MySQL mode, and 0.21–0.22 against 0.18 for SQLite. The host ran at about 97%
busy at MySQL 1/s, where November 2's `vc2` ran at 78%. On the AMD plans the
same image costs exactly what rc.2 does, so the `vc2` result reflects a slower
Broadwell instance, not the release. `vc2` stays capacity-only evidence; the
AMD plans are the reference.

### PHP at the lowest rate

PHP 2.11.8 again fails 0.5/s on every 1-vCPU plan, as on November 2.

## Clock

`clock.cross_host_timing_reliable` is false for every run in this batch. The
**driver**'s NTP offset reached 11–36 ms against the 5 ms tolerance.

- The `vhp` targets stayed in tolerance, at ≤ 5 ms offset and ≤ 3 ms jitter.
- The `vc2` target reached up to 58 ms offset and 96 ms jitter.

Driver-relative latency figures are therefore excluded. Capacity verdicts and
resource use stand: the offsets are small against the 2 s bound.

## Four vCPU comparison (`matched-4c.json`)

These ran on the `vhp-4c-8gb-amd` driver host after the small-host batch, PHP
first and then the rc.3 image, with three repeats per rate. Every window passed
for both runtimes. Per-window tables:

- [summary-matched-4c-php-2026-11-02.md](summary-matched-4c-php-2026-11-02.md)
- [summary-matched-4c-native-image-2026-11-02.md](summary-matched-4c-native-image-2026-11-02.md)

At 1 workflow/s, across the three repeats:

| Measure | rc.3 | PHP 2.11.8 |
| --- | ---: | ---: |
| p50 | 0.103–0.104 s | 0.552–0.560 s |
| p95 | 0.115–0.120 s | 0.697–0.719 s |
| Runtime CPU per workflow | 0.077–0.082 core-s | 0.785–0.805 core-s |
| MySQL CPU per workflow | 0.161–0.168 core-s | 0.267–0.271 core-s |
| Runtime memory | about 7 MiB | 192–215 MiB |

**Idle:** rc.3 answered every idle poll empty at 0.4–0.9 core-s. PHP returned
backpressure on 4 of 12 and 16 of 24 idle polls, at 3–5 core-s.

**This does not reproduce November 2's PHP result.** In the
[rc.2 note](../small-host/observations-2026-11-02.md), PHP closed only 17–41
of 120 at 1/s, and native's p50 was 0.37 s. Both runtimes ran much faster
here. No other job shared the driver in either batch, and the run identity
does not record the driver's CPU or host. Treat the November 2 PHP collapse at
4 vCPUs as unconfirmed, and use this same-session comparison.

## Cleanup

Raw result directories stay private and are not committed. After the batch,
all four hosts, the private network, the firewall group and the SSH key were
deleted. Absence was verified by ID and by run tag (`tagged_instances_remaining`
0).
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
| Runtime / window | Accepted | Verified | Pending | In-window | p50 s | p95 s | p99 s | Runtime core-s/wf | MySQL core-s/wf | Runtime max MiB | Health fail/replies |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |
| native-image / setup | 2 | 2 | 0 | 2 | 0.117 | 0.186 | 0.186 | 0.125 | 0.268 | 5.0 | 0/8 |
| native-image / warmup | 15 | 15 | 0 | 15 | 0.105 | 0.179 | 0.179 | 0.156 | 0.308 | 6.0 | 0/108 |
| native-image / low-before-1 | 30 | 30 | 0 | 30 | 0.104 | 0.117 | 0.124 | 0.157 | 0.309 | 7.2 | 0/216 |
| native-image / low-before-2 | 30 | 30 | 0 | 30 | 0.108 | 0.121 | 0.122 | 0.160 | 0.315 | 7.2 | 0/214 |
| native-image / low-before-3 | 30 | 30 | 0 | 30 | 0.108 | 0.129 | 0.161 | 0.160 | 0.317 | 7.3 | 0/216 |
| native-image / rate-0.5-1 | 60 | 60 | 0 | 60 | 0.106 | 0.125 | 0.203 | 0.107 | 0.217 | 6.5 | 0/218 |
| native-image / rate-0.5-2 | 60 | 60 | 0 | 60 | 0.104 | 0.114 | 0.161 | 0.106 | 0.216 | 7.3 | 0/216 |
| native-image / rate-0.5-3 | 60 | 60 | 0 | 60 | 0.106 | 0.120 | 0.142 | 0.107 | 0.219 | 6.7 | 0/214 |
| native-image / rate-1-1 | 120 | 120 | 0 | 120 | 0.103 | 0.119 | 0.136 | 0.077 | 0.161 | 6.7 | 0/216 |
| native-image / rate-1-2 | 120 | 120 | 0 | 120 | 0.104 | 0.120 | 0.127 | 0.080 | 0.167 | 7.6 | 0/218 |
| native-image / rate-1-3 | 120 | 120 | 0 | 120 | 0.104 | 0.115 | 0.120 | 0.082 | 0.168 | 7.1 | 0/216 |
| native-image / low-after-1 | 30 | 30 | 0 | 30 | 0.107 | 0.122 | 0.137 | 0.159 | 0.326 | 6.8 | 0/216 |
| native-image / low-after-2 | 30 | 30 | 0 | 30 | 0.105 | 0.129 | 0.184 | 0.160 | 0.327 | 7.3 | 0/214 |
| native-image / low-after-3 | 30 | 30 | 0 | 30 | 0.105 | 0.119 | 0.122 | 0.156 | 0.322 | 6.6 | 0/216 |

| Runtime / idle | Polls | Outcomes | Runtime core-s | Health fail/replies, slowest ok s |
| --- | ---: | --- | ---: | --- |
| native-image / idle-6-1 | 6 | {"empty": 6} | 0.395 | 0/18, 0.097 |
| native-image / idle-6-2 | 6 | {"empty": 6} | 0.443 | 0/18, 0.007 |
| native-image / idle-6-3 | 6 | {"empty": 6} | 0.424 | 0/20, 0.091 |
| native-image / idle-12-1 | 12 | {"empty": 12} | 0.592 | 0/18, 0.009 |
| native-image / idle-12-2 | 12 | {"empty": 12} | 0.561 | 0/20, 0.009 |
| native-image / idle-12-3 | 12 | {"empty": 12} | 0.6 | 0/18, 0.101 |
| native-image / idle-24-1 | 24 | {"empty": 24} | 0.862 | 0/20, 0.008 |
| native-image / idle-24-2 | 24 | {"empty": 24} | 0.827 | 0/20, 0.01 |
| native-image / idle-24-3 | 24 | {"empty": 24} | 0.947 | 0/20, 0.012 |
28 changes: 28 additions & 0 deletions benchmarks/server-port/rc3/summary-matched-4c-php-2026-11-02.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
| Runtime / window | Accepted | Verified | Pending | In-window | p50 s | p95 s | p99 s | Runtime core-s/wf | MySQL core-s/wf | Runtime max MiB | Health fail/replies |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |
| php / setup | 2 | 2 | 0 | 2 | 0.778 | 0.953 | 0.953 | 1.507 | 0.277 | 145.5 | 0/8 |
| php / warmup | 15 | 15 | 0 | 15 | 0.565 | 0.774 | 0.774 | 1.716 | 0.392 | 186.1 | 0/96 |
| php / low-before-1 | 30 | 30 | 0 | 30 | 0.573 | 0.743 | 0.753 | 1.699 | 0.380 | 207.3 | 0/194 |
| php / low-before-2 | 30 | 30 | 0 | 30 | 0.565 | 0.787 | 0.830 | 1.686 | 0.378 | 179.0 | 0/193 |
| php / low-before-3 | 30 | 30 | 0 | 30 | 0.583 | 0.757 | 0.785 | 1.682 | 0.380 | 201.5 | 0/196 |
| php / rate-0.5-1 | 60 | 60 | 0 | 60 | 0.541 | 0.761 | 0.792 | 1.074 | 0.301 | 189.0 | 0/192 |
| php / rate-0.5-2 | 60 | 60 | 0 | 60 | 0.555 | 0.694 | 0.758 | 1.096 | 0.309 | 179.0 | 0/194 |
| php / rate-0.5-3 | 60 | 60 | 0 | 60 | 0.571 | 0.771 | 0.816 | 1.083 | 0.308 | 193.4 | 0/192 |
| php / rate-1-1 | 120 | 120 | 0 | 120 | 0.552 | 0.697 | 0.766 | 0.785 | 0.267 | 206.5 | 0/192 |
| php / rate-1-2 | 120 | 120 | 0 | 120 | 0.560 | 0.719 | 0.796 | 0.805 | 0.271 | 191.6 | 0/192 |
| php / rate-1-3 | 120 | 120 | 0 | 120 | 0.556 | 0.701 | 0.763 | 0.791 | 0.268 | 214.6 | 0/192 |
| php / low-after-1 | 30 | 30 | 0 | 30 | 0.591 | 0.754 | 0.775 | 1.689 | 0.384 | 183.4 | 0/194 |
| php / low-after-2 | 30 | 30 | 0 | 30 | 0.571 | 0.737 | 0.750 | 1.696 | 0.386 | 200.4 | 0/194 |
| php / low-after-3 | 30 | 30 | 0 | 30 | 0.574 | 0.790 | 0.794 | 1.682 | 0.380 | 207.8 | 0/194 |

| Runtime / idle | Polls | Outcomes | Runtime core-s | Health fail/replies, slowest ok s |
| --- | ---: | --- | ---: | --- |
| php / idle-6-1 | 6 | {"empty": 6} | 3.128 | 0/18, 1.326 |
| php / idle-6-2 | 6 | {"empty": 6} | 4.274 | 0/20, 0.441 |
| php / idle-6-3 | 6 | {"empty": 6} | 3.404 | 0/20, 0.331 |
| php / idle-12-1 | 12 | {"empty": 8, "backpressure": 4} | 4.93 | 0/20, 1.358 |
| php / idle-12-2 | 12 | {"empty": 8, "backpressure": 4} | 4.234 | 0/20, 1.121 |
| php / idle-12-3 | 12 | {"empty": 8, "backpressure": 4} | 5.009 | 1/18, 0.224 |
| php / idle-24-1 | 24 | {"empty": 8, "backpressure": 16} | 5.41 | 0/18, 1.456 |
| php / idle-24-2 | 24 | {"empty": 8, "backpressure": 16} | 5.132 | 1/16, 0.526 |
| php / idle-24-3 | 24 | {"empty": 8, "backpressure": 16} | 5.196 | 0/16, 1.923 |
Loading
Loading