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
32 changes: 32 additions & 0 deletions benchmarks/server-port/rc3/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# 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`.

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
the same scripts and instructions as the
[small-host README](../small-host/README.md), passing this directory's file
as the profile.
133 changes: 133 additions & 0 deletions benchmarks/server-port/rc3/matched-4c.json
Original file line number Diff line number Diff line change
@@ -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-rc3-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": "04cad60ed661db2c9e961d85e7a132d82ee62e46",
"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. 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.",
"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"
}
}
134 changes: 134 additions & 0 deletions benchmarks/server-port/rc3/small-host.json
Original file line number Diff line number Diff line change
@@ -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-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": "04cad60ed661db2c9e961d85e7a132d82ee62e46",
"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 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",
"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"
}
}
Loading