From 30c9ac77dd166d181f5c690e5e49c42e25b160f0 Mon Sep 17 00:00:00 2001 From: Richard McDaniel <1130888+rmcdaniel@users.noreply.github.com> Date: Mon, 2 Nov 2026 06:34:23 -0600 Subject: [PATCH 1/2] Rust #325: small-host and matched 4c profiles for native 3.0.0-rc.3 Copies of the small-host profiles with the native image pinned to the published rc.3 index (899b404b, source 04cad60e) for rc.3's performance qualification. The originals stay unchanged because the November 2 observations cite their profile_sha256. Co-Authored-By: Claude Opus 5.5 --- benchmarks/server-port/rc3/README.md | 21 ++++ benchmarks/server-port/rc3/matched-4c.json | 133 ++++++++++++++++++++ benchmarks/server-port/rc3/small-host.json | 134 +++++++++++++++++++++ 3 files changed, 288 insertions(+) create mode 100644 benchmarks/server-port/rc3/README.md create mode 100644 benchmarks/server-port/rc3/matched-4c.json create mode 100644 benchmarks/server-port/rc3/small-host.json diff --git a/benchmarks/server-port/rc3/README.md b/benchmarks/server-port/rc3/README.md new file mode 100644 index 000000000..ade1c12fe --- /dev/null +++ b/benchmarks/server-port/rc3/README.md @@ -0,0 +1,21 @@ +# Release candidate 3 profiles + +The small-host profiles with `artifacts.native_image` set to the published +release candidate: + +- [small-host.json](small-host.json) is [../small-host/profile.json](../small-host/profile.json). +- [matched-4c.json](matched-4c.json) is [../small-host/matched-4c.json](../small-host/matched-4c.json). + +The candidate is `ghcr.io/durable-workflow/server@sha256:899b404b02f856cb582c5e77a95882a3f9928781083d1e7a3fe569f3ff978d6b` +(tag `3.0.0-rc.3`, source `04cad60ed661db2c9e961d85e7a132d82ee62e46`). The +same index is published as `durableworkflow/server:3.0.0-rc.3`. + +Only `native_image`, `native_version` and the schema note differ. rc.3 uses +schema 8, where rc.2 used 7. The workload, limits, probe and adapter pins, +SDK lock and PHP reference (published Server 2.11.8) are unchanged. + +The originals stay as they are because the November 2 observations in +[../small-host/](../small-host/) cite their `profile_sha256`. Run these with +the same scripts and instructions as the +[small-host README](../small-host/README.md), passing this directory's file +as the profile. diff --git a/benchmarks/server-port/rc3/matched-4c.json b/benchmarks/server-port/rc3/matched-4c.json new file mode 100644 index 000000000..f493cde5c --- /dev/null +++ b/benchmarks/server-port/rc3/matched-4c.json @@ -0,0 +1,133 @@ +{ + "schema": "durable-workflow.server-port-performance-profile/v1", + "profile_version": "3.0.0", + "profile_id": "server-port-development-matched-amd64-v3-rc2-php2118", + "evidence_class": "development_comparison", + "publishable_capacity_claim": false, + "status": "prospective_inputs", + "artifacts": { + "php_server": "durableworkflow/server@sha256:3848d5d5cd1b23bd2881e3fdecea64cc44b72e6fb812e577c2db6d0872d065dd", + "php_server_version": "2.11.8", + "php_workflow_version": "2.15.12", + "native_source": "e5bf7e2bf4e73c512a80cc7c3cd9ebb406927615", + "native_build_runner_revision": "e5bf7e2bf4e73c512a80cc7c3cd9ebb406927615", + "native_rust_tree": "2b0c5198e46a4b3bc4fd5b50d5b0e8b7034a92c6", + "native_build": "cargo build --release --locked --bin durable-workflow-server", + "native_binary_sha256": "cf18b714dca3c47c95c60df348e0893bfa6625d4f5b097ec8618600211407ca1", + "sdk_php_version": "2.3.9", + "sdk_php_source": "7decd1a9fc39704f48b10c9209a23db8668ae7f2", + "sdk_php_lock": "scripts/conformance/server-parity/corrected-markers/php/composer.lock", + "sdk_php_lock_sha256": "42e814ee38813d3dafcf2e4cc371327d661536adda653e6cf1518a91a46087ca", + "mysql": "mysql@sha256:679e7e924f38a3cbb62a3d7df32924b83f7321a602d3f9f967c01b3df18495d6", + "mysql_version": "8.4.5", + "redis": "redis@sha256:0637954999d01b7c9ce9167db2da50656e2590d3b884f1c600c5f63bb6e6773c", + "redis_version": "7.2.16", + "native_image": "ghcr.io/durable-workflow/server@sha256:899b404b02f856cb582c5e77a95882a3f9928781083d1e7a3fe569f3ff978d6b", + "native_version": "3.0.0-rc.3", + "native_image_source": "6caf527ab5c85d6f33b63274847080c97a8d4336", + "client_runtime_image": "durableworkflow/server@sha256:944c384c9875fd82637dd2bdea74dcb881cf983a57599ba0e492bec706296549" + }, + "hardware": { + "provider_plan": "vultr vhp-4c-8gb-amd", + "machine_facts": "recorded in each run identity.json" + }, + "topology": { + "compose": "scripts/perf/server-port-matched.compose.yml", + "database_isolation": "different_compose_project_and_fresh_mysql_volume_for_each_implementation", + "implementations_never_run_concurrently": true, + "extra_swap_bytes": 0, + "runtime_aggregate_limit": { + "cpu_cores": 2, + "memory_bytes": 2147483648 + }, + "php_runtime_components": [ + "php-server", + "php-worker", + "php-scheduler", + "redis" + ], + "native_runtime_components": [ + "native-server" + ], + "database_limit": { + "cpu_cores": 1, + "memory_bytes": 1073741824 + }, + "sdk_worker_limit": { + "cpu_cores": 0.5, + "memory_bytes": 536870912 + }, + "probe_limit": { + "cpu_cores": 0.5, + "memory_bytes": 536870912 + }, + "runtime_memory_accounting": "all_runtime_components_plus_mysql_reported_separately_from_sdk_and_probe" + }, + "workload": { + "authority": "benchmarks/capacity/v1/suite.json", + "authority_suite_version": "1.9.0", + "cell": "one-activity", + "workflow_type": "capacity.v1.one_activity", + "activity_type": "capacity.v1.echo", + "payload_bytes_each_direction": 1024, + "codec": "avro", + "client_processes": 1, + "sdk_worker_processes": 1, + "adapter": "benchmarks/capacity/v1/bindings/php/capacity_adapter.php", + "adapter_sha256": "0ad9fd714f325970c18d32cfedf754895cec621bd048593ac04fd8b9a247b926", + "command": "scripts/perf/standard-workflow-offered.php", + "command_sha256": "c0352bbab781df2d3f86f7c96e7b749606e62c19770bdbe85e6c75ef25c58e66", + "warmup_seconds": 60, + "offer_seconds": 120, + "drain_limit_seconds": 120, + "describe_interval_ms": 250, + "offered_rates_per_second": [ + 0.25, + 0.5, + 1 + ], + "repeats": 3, + "baseline_drift_control": "repeat_0.25_before_and_after_higher_rates" + }, + "idle": { + "command": "scripts/perf/idle-poll-probe.php", + "command_sha256": "e25704097dcd2138914b2dde9b81ea50ec47baa19764c2930823699f709f16cc", + "outcome_classifier": "scripts/perf/idle-poll-outcome.php", + "outcome_classifier_sha256": "df85f993c7fcec89b40986dd7643094b87da2b444f740368198b295bea1d9338", + "kind": "mixed", + "counts": [ + 6, + 12, + 24 + ], + "requested_timeout_seconds": 10, + "repeats": 3, + "ordinary_api_probe": "health_and_ready_during_held_polls", + "queue_condition": "no_tasks_or_active_workflows" + }, + "required_evidence": [ + "source_and_runner_revisions_input_hashes_and_optimized_binary_hash", + "actual_installed_sdk_and_php_engine_identity", + "resolved_images_machine_facts_and_actual_component_limits", + "offered_accepted_in_window_completed_drained_and_verified_counts", + "latencies_errors_full_window_component_cpu_and_memory_samples", + "ordinary_api_latency_during_work_and_idle_waits", + "final_database_tasks_registrations_restarts_oom_and_swap", + "all_repetitions_including_failures_and_baseline_drift", + "cleanup_of_databases_objects_dependencies_compiler_and_task_resources" + ], + "limitations": [ + "Prospective inputs, not a measured result or published native artifact.", + "The original v1 PHP measurements remain historical; both implementations need fresh matched observations.", + "This single-client 120-second development workload does not qualify the standard capacity topology or maximum sustained capacity.", + "Equal aggregate runtime limits include PHP HTTP, queue, scheduler and Redis, or the replacement native process; MySQL is additional and identical.", + "A debug build, missing component samples, growing backlog, failed cleanup or changed background workload cannot establish a performance gain.", + "The PHP reference is published 2.11.8 rather than the recorded 2.6.2 baseline, so PHP numbers are not comparable with October 20 or 30; native-image numbers are, on the same host type.", + "The native_binary_* fields describe the October 20 binary-mounted build and do not apply to native-image runs." + ], + "driver": { + "script": "scripts/perf/run-server-port-matched.sh", + "summarizer": "scripts/perf/summarize-server-port-matched.py", + "revision": "a8b5883e809d18df389064b5ea1bdb5918a589c1" + } +} diff --git a/benchmarks/server-port/rc3/small-host.json b/benchmarks/server-port/rc3/small-host.json new file mode 100644 index 000000000..7cd6ffaf8 --- /dev/null +++ b/benchmarks/server-port/rc3/small-host.json @@ -0,0 +1,134 @@ +{ + "schema": "durable-workflow.server-port-performance-profile/v1", + "profile_version": "1.0.0", + "profile_id": "server-port-small-host-split-amd64-v1", + "evidence_class": "development_comparison", + "publishable_capacity_claim": false, + "status": "prospective_inputs", + "artifacts": { + "native_image": "ghcr.io/durable-workflow/server@sha256:899b404b02f856cb582c5e77a95882a3f9928781083d1e7a3fe569f3ff978d6b", + "native_version": "3.0.0-rc.3", + "native_source": "6caf527ab5c85d6f33b63274847080c97a8d4336", + "php_server": "durableworkflow/server@sha256:3848d5d5cd1b23bd2881e3fdecea64cc44b72e6fb812e577c2db6d0872d065dd", + "php_server_version": "2.11.8", + "php_workflow_version": "2.15.12", + "client_runtime_image": "durableworkflow/server@sha256:944c384c9875fd82637dd2bdea74dcb881cf983a57599ba0e492bec706296549", + "sdk_php_version": "2.3.9", + "sdk_php_source": "7decd1a9fc39704f48b10c9209a23db8668ae7f2", + "sdk_php_lock": "scripts/conformance/server-parity/corrected-markers/php/composer.lock", + "sdk_php_lock_sha256": "42e814ee38813d3dafcf2e4cc371327d661536adda653e6cf1518a91a46087ca", + "mysql": "mysql@sha256:679e7e924f38a3cbb62a3d7df32924b83f7321a602d3f9f967c01b3df18495d6", + "mysql_version": "8.4.5", + "redis": "redis@sha256:0637954999d01b7c9ce9167db2da50656e2590d3b884f1c600c5f63bb6e6773c", + "redis_version": "7.2.16" + }, + "topology": { + "target_compose": "scripts/perf/small-host-target.compose.yml", + "driver_compose": "scripts/perf/small-host-driver.compose.yml", + "target_runs": "only the server and its database; no container CPU or memory limits, so the plan size is the limit", + "target_modes": { + "native-mysql": [ + "mysql", + "native-mysql" + ], + "native-sqlite": [ + "native-sqlite" + ], + "php-mysql": [ + "mysql", + "redis", + "php-bootstrap", + "php-server", + "php-worker", + "php-scheduler" + ] + }, + "driver_runs": "SDK workers, load probes, health observer and driver samplers, on a separate host in the target's private network", + "network": "target publishes 8080 only on its private (VPC) address", + "clock": "both hosts NTP-synchronized; latency compares the driver's start time with the server's closed_at", + "implementations_never_run_concurrently": true + }, + "planned_hosts": { + "targets": [ + "vultr vhp-1c-1gb-amd", + "vultr vc2-1c-1gb", + "vultr vhp-1c-2gb-amd" + ], + "driver": "a separate host in the same VPC with at least 4 vCPU, so client processes are never the limit", + "comparison": "vultr vhp-4c-8gb-amd runs the rc1 matched profile, unchanged, for continuity with October 20 and 30" + }, + "workload": { + "authority": "benchmarks/capacity/v1/suite.json", + "cell": "one-activity", + "workflow_type": "capacity.v1.one_activity", + "activity_type": "capacity.v1.echo", + "payload_bytes_each_direction": 1024, + "codec": "avro", + "adapter": "benchmarks/capacity/v1/bindings/php/capacity_adapter.php", + "adapter_sha256": "0ad9fd714f325970c18d32cfedf754895cec621bd048593ac04fd8b9a247b926", + "command": "scripts/perf/standard-workflow-offered.php", + "command_sha256": "c0352bbab781df2d3f86f7c96e7b749606e62c19770bdbe85e6c75ef25c58e66" + }, + "ladder": { + "warmup_seconds": 30, + "offer_seconds": 60, + "drain_limit_seconds": 60, + "describe_interval_ms": 100, + "rates_per_second": [ + 0.5, + 1, + 2, + 4, + 8, + 12, + 16, + 24, + 32 + ], + "max_rate_per_probe": 4, + "sdk_workers_per_probe": 2, + "min_sdk_workers": 2, + "bounds": { + "latency_p95_seconds": 2.0, + "min_in_window_completion_fraction": 0.9 + }, + "stop_rule": "a rate passes when every probe exits 0 (no errors, late or skipped offers, pending work or poll errors), at least 90% of planned workflows close inside the offer window, and the slowest probe's p95 is at most 2 s; a failed rate is repeated once, and two failures end the ladder", + "sustained_capacity": "the highest passing rate", + "drift_check": "the lowest rate again after the ladder" + }, + "idle": { + "command": "scripts/perf/idle-poll-probe.php", + "command_sha256": "e25704097dcd2138914b2dde9b81ea50ec47baa19764c2930823699f709f16cc", + "outcome_classifier": "scripts/perf/idle-poll-outcome.php", + "outcome_classifier_sha256": "df85f993c7fcec89b40986dd7643094b87da2b444f740368198b295bea1d9338", + "kind": "mixed", + "counts": [ + 6, + 12, + 24 + ], + "requested_timeout_seconds": 10, + "repeats": 2, + "queue_condition": "no_tasks_or_active_workflows; SDK workers stopped" + }, + "required_evidence": [ + "target and driver identity, plan, machine facts and NTP state at both ends", + "per-step offered, accepted, in-window, completed and verified counts, latencies, errors and verdict", + "target host CPU (busy, iowait, steal), memory used and available, swap use and traffic, OOM kills and pressure per window", + "driver host CPU per window, showing the driver was not the limit", + "ordinary health and ready answers during work and idle waits", + "target container restarts and OOM kills, database audit and complete teardown" + ], + "limitations": [ + "A development comparison on disposable hosts, not a publishable capacity claim.", + "One workload cell (one activity, 1 KiB each way); other shapes can saturate differently.", + "The p95 per step is the slowest probe's p95, not a merged percentile.", + "Latency crosses two hosts' clocks; NTP offsets of a few milliseconds are small against these latencies but are not removed.", + "Native rc.3 uses schema 8; it starts from an empty database on every run." + ], + "driver": { + "target_script": "scripts/perf/run-server-port-small-host-target.sh", + "driver_script": "scripts/perf/run-server-port-small-host.sh", + "summarizer": "scripts/perf/summarize-server-port-small-host.py" + } +} From 69307b98dda1fa48af33176ad71c6da26b49f051 Mon Sep 17 00:00:00 2001 From: Richard McDaniel <1130888+rmcdaniel@users.noreply.github.com> Date: Mon, 2 Nov 2026 06:36:28 -0600 Subject: [PATCH 2/2] Bind the rc.3 profiles' identity fields to rc.3 Security's review of #941: native_source and native_image_source still named rc.2's source 6caf527a, matched-4c kept the rc2 profile_id, small-host's comparison host named the rc1 matched profile, and matched-4c said its image was not a published artifact. All now name rc.3 (source 04cad60e) and the sibling profile; the October 20 binary-mounted fields stay as they are. The README lists exactly what differs. Co-Authored-By: Claude Opus 5.5 --- benchmarks/server-port/rc3/README.md | 17 ++++++++++++++--- benchmarks/server-port/rc3/matched-4c.json | 6 +++--- benchmarks/server-port/rc3/small-host.json | 6 +++--- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/benchmarks/server-port/rc3/README.md b/benchmarks/server-port/rc3/README.md index ade1c12fe..7254f7d9d 100644 --- a/benchmarks/server-port/rc3/README.md +++ b/benchmarks/server-port/rc3/README.md @@ -10,9 +10,20 @@ The candidate is `ghcr.io/durable-workflow/server@sha256:899b404b02f856cb582c5e7 (tag `3.0.0-rc.3`, source `04cad60ed661db2c9e961d85e7a132d82ee62e46`). The same index is published as `durableworkflow/server:3.0.0-rc.3`. -Only `native_image`, `native_version` and the schema note differ. rc.3 uses -schema 8, where rc.2 used 7. The workload, limits, probe and adapter pins, -SDK lock and PHP reference (published Server 2.11.8) are unchanged. +What differs from the originals is the rc.3 identity: + +- both files: `native_image`, `native_version` and `profile_id`; +- `small-host.json`: `artifacts.native_source` (`04cad60e`), the schema note + (rc.3 uses schema 8, where rc.2 used 7), and `planned_hosts.comparison`, + which now names the sibling `matched-4c.json`; +- `matched-4c.json`: `artifacts.native_image_source` (`04cad60e`), and the + first limitation, which now says the image is the published rc.3 artifact. + +`matched-4c.json` keeps `native_source`, `native_build_runner_revision`, +`native_rust_tree` and `native_binary_sha256` unchanged. They describe the +separate October 20 binary-mounted mode, as its limitations say, not +native-image runs. The workload, limits, probe and adapter pins, SDK lock and +PHP reference (published Server 2.11.8) are unchanged. The originals stay as they are because the November 2 observations in [../small-host/](../small-host/) cite their `profile_sha256`. Run these with diff --git a/benchmarks/server-port/rc3/matched-4c.json b/benchmarks/server-port/rc3/matched-4c.json index f493cde5c..165f07296 100644 --- a/benchmarks/server-port/rc3/matched-4c.json +++ b/benchmarks/server-port/rc3/matched-4c.json @@ -1,7 +1,7 @@ { "schema": "durable-workflow.server-port-performance-profile/v1", "profile_version": "3.0.0", - "profile_id": "server-port-development-matched-amd64-v3-rc2-php2118", + "profile_id": "server-port-development-matched-amd64-v3-rc3-php2118", "evidence_class": "development_comparison", "publishable_capacity_claim": false, "status": "prospective_inputs", @@ -24,7 +24,7 @@ "redis_version": "7.2.16", "native_image": "ghcr.io/durable-workflow/server@sha256:899b404b02f856cb582c5e77a95882a3f9928781083d1e7a3fe569f3ff978d6b", "native_version": "3.0.0-rc.3", - "native_image_source": "6caf527ab5c85d6f33b63274847080c97a8d4336", + "native_image_source": "04cad60ed661db2c9e961d85e7a132d82ee62e46", "client_runtime_image": "durableworkflow/server@sha256:944c384c9875fd82637dd2bdea74dcb881cf983a57599ba0e492bec706296549" }, "hardware": { @@ -117,7 +117,7 @@ "cleanup_of_databases_objects_dependencies_compiler_and_task_resources" ], "limitations": [ - "Prospective inputs, not a measured result or published native artifact.", + "Prospective inputs, not a measured result. The native image is the published 3.0.0-rc.3 artifact.", "The original v1 PHP measurements remain historical; both implementations need fresh matched observations.", "This single-client 120-second development workload does not qualify the standard capacity topology or maximum sustained capacity.", "Equal aggregate runtime limits include PHP HTTP, queue, scheduler and Redis, or the replacement native process; MySQL is additional and identical.", diff --git a/benchmarks/server-port/rc3/small-host.json b/benchmarks/server-port/rc3/small-host.json index 7cd6ffaf8..6d9c08d01 100644 --- a/benchmarks/server-port/rc3/small-host.json +++ b/benchmarks/server-port/rc3/small-host.json @@ -1,14 +1,14 @@ { "schema": "durable-workflow.server-port-performance-profile/v1", "profile_version": "1.0.0", - "profile_id": "server-port-small-host-split-amd64-v1", + "profile_id": "server-port-small-host-split-amd64-v1-rc3", "evidence_class": "development_comparison", "publishable_capacity_claim": false, "status": "prospective_inputs", "artifacts": { "native_image": "ghcr.io/durable-workflow/server@sha256:899b404b02f856cb582c5e77a95882a3f9928781083d1e7a3fe569f3ff978d6b", "native_version": "3.0.0-rc.3", - "native_source": "6caf527ab5c85d6f33b63274847080c97a8d4336", + "native_source": "04cad60ed661db2c9e961d85e7a132d82ee62e46", "php_server": "durableworkflow/server@sha256:3848d5d5cd1b23bd2881e3fdecea64cc44b72e6fb812e577c2db6d0872d065dd", "php_server_version": "2.11.8", "php_workflow_version": "2.15.12", @@ -55,7 +55,7 @@ "vultr vhp-1c-2gb-amd" ], "driver": "a separate host in the same VPC with at least 4 vCPU, so client processes are never the limit", - "comparison": "vultr vhp-4c-8gb-amd runs the rc1 matched profile, unchanged, for continuity with October 20 and 30" + "comparison": "vultr vhp-4c-8gb-amd runs the sibling rc3/matched-4c.json profile, with the same workload as the October 20 and 30 matched runs" }, "workload": { "authority": "benchmarks/capacity/v1/suite.json",