# Scale benchmarks This page is the measured scale snapshot for the opt-in runner in `benchmarks/run_benchmarks.py`. It is evidence about one local configuration, not a capacity guarantee. Run it with: ```console PYTHONPATH=src python benchmarks/run_benchmarks.py --profile quick PYTHONPATH=src python benchmarks/run_benchmarks.py --profile snapshot --json snapshot.json ``` ## Method The runner uses a `TemporaryDirectory`, a single Python process, no network, `durable=False`, and the local filesystem. Jobs use a minimal shell runner and are submitted with bounded-fan-out placements of the form `bench//`. The flat-placement heartbeat case uses one `flat` directory. The snapshot profile measures `N=2,500` and `N=10,000`; quick uses `N=500`. The join case always uses one waiting parent and `C=500` terminal children. The nine rows mean: - `streamed_submission` measures `prepare_job_payload` plus workspace submission and reports jobs per second. - `cold_scheduling_tick` measures the first tick of a fresh manager over ready jobs. `maximum_workers=1` remains required by the API, so the benchmark replaces the launch method with an eligibility-only no-op; no process is started. - `warm_scheduling_tick` measures the immediately following tick, with the manager's in-memory scan cursors warm. - `time_to_first_claim` measures from the first tick call until the wrapped transition observes the first `claimed` marker, with one worker and the minimal no-op runner. - `memory_per_active_marker` uses `tracemalloc` around a fresh marker-index rebuild and eligibility scan. It is an approximation of Python index and bookkeeping allocations, not resident set size. - `heartbeat_under_scan` scans a large flat placement while wrapping the manager heartbeat hook. The wrapper forces a heartbeat write at each observed opportunity so the maximum gap is observable; it is an instrumented hook measurement, not an RSS or shared-filesystem result. - `join_evaluation` measures one manager join-evaluation pass for the waiting parent and its terminal children. - `harvest_throughput` measures a complete lazy harvest drain of terminal jobs. - `fsck_and_gc` reports the combined wall time of a full fsck and gc pass. The JSON result also contains separate `fsck_seconds` and `gc_seconds`; gc uses `journal_days=0` so retention is configured and the journal walk occurs. ## Snapshot Measured on 2026-07-27 in `/home/rar/Documents/containers/devel/agents/httk2/httk-workflow`: | Benchmark | Size | Wall time (s) | Rate | | --- | ---: | ---: | ---: | | streamed submission | 2,500 | 3.279033 | 762.42 jobs/s | | streamed submission | 10,000 | 13.480633 | 741.80 jobs/s | | cold scheduling tick | 2,500 | 0.852287 | 1.17 ticks/s | | cold scheduling tick | 10,000 | 3.419358 | 0.29 ticks/s | | warm scheduling tick | 2,500 | 0.852236 | 1.17 ticks/s | | warm scheduling tick | 10,000 | 3.360714 | 0.30 ticks/s | | time to first claim | 2,500 | 0.847354 | 1.18 claims/s | | time to first claim | 10,000 | 3.356350 | 0.30 claims/s | | memory per active marker | 2,500 | 4.311729 | 2,069.78 bytes/marker | | memory per active marker | 10,000 | 17.809655 | 2,117.59 bytes/marker | | heartbeat under scan | 2,500 | 1.143089 | 17.49 heartbeats/s | | heartbeat under scan | 10,000 | 4.439381 | 15.98 heartbeats/s | | join evaluation (`C=500`) | 500 children | 0.669827 / 0.670408 | 746.46 / 745.81 children/s | | harvest throughput | 2,500 | 1.702431 | 1,468.49 records/s | | harvest throughput | 10,000 | 6.818689 | 1,466.56 records/s | | fsck + gc | 2,500 | 0.873996 (fsck 0.583754, gc 0.290242) | 2,860.42 jobs/s | | fsck + gc | 10,000 | 3.509589 (fsck 2.326079, gc 1.183510) | 2,849.34 jobs/s | The snapshot's total wall time was 125.457 seconds. The machine was an Intel Xeon E5-2680 v4 system with 28 visible CPUs and 92 GiB RAM, using a local ZFS filesystem. CPU frequency, filesystem cache state, Python version, storage, and background load affect these values; they should be treated as a local snapshot rather than a portable promise. ## Linearity check The ratio below is `t(10,000) / t(2,500)`. A ratio above approximately 5× is a review flag for super-linear behavior in this sample. None of these measured ratios crosses that flag; this is not a proof of asymptotic linearity. | Benchmark | Ratio | | --- | ---: | | streamed submission | 4.11× | | cold scheduling tick | 4.01× | | warm scheduling tick | 3.94× | | time to first claim | 3.96× | | memory per active marker | 4.13× | | heartbeat under scan | 3.88× | | harvest throughput | 4.01× | | fsck + gc | 4.02× | Join evaluation is not included in the ratio because its child count was held fixed at `C=500` in both snapshot runs. These numbers come from one local filesystem and differ on shared filesystems. Large campaigns should use project-partitioned workspaces, choosing each partition's size from measurements appropriate to its storage and workload; see {doc}`campaigns`.