Skip to content
Draft
Show file tree
Hide file tree
Changes from 35 commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
2bf7115
perf(pm): bump manifests-concurrency-limit 64 → 256 + add fetch break…
elrrrrrrr May 8, 2026
8ac97ae
chore(p1): revert concurrency 256 → 64 + restore manifest-bench
elrrrrrrr May 8, 2026
5690a9b
ci(p1): wire manifest-bench standalone HTTP sweep into bench-phases-l…
elrrrrrrr May 8, 2026
94af458
perf(ruborist): inline JSON parse, drop rayon::spawn dispatch
elrrrrrrr May 8, 2026
ee5f5f4
perf(ruborist): switch JSON parse to tokio spawn_blocking
elrrrrrrr May 8, 2026
16404fc
perf(ruborist): switch extract_core_version to spawn_blocking too
elrrrrrrr May 8, 2026
460a538
revert + instrument(ruborist): post-build phase timing
elrrrrrrr May 8, 2026
58d49aa
instrument(ruborist): preload main loop dispatch + result split
elrrrrrrr May 8, 2026
8114bf4
perf(pm): grow rayon pool to max(num_cpus, 8) to drain p1 extract queue
elrrrrrrr May 8, 2026
394f6c9
perf(pm): skip preload for p1 path; BFS does per-level parallel prefetch
elrrrrrrr May 8, 2026
596cd20
perf(pm): fast_preload bypasses UnifiedRegistry for utoo deps path
elrrrrrrr May 8, 2026
2e74bba
perf(pm): dispatch fast_preload settle to rayon to free tokio runtime
elrrrrrrr May 8, 2026
04c9ec3
perf(pm): bump manifests-concurrency-limit 64 → 96 (manifest-bench best)
elrrrrrrr May 8, 2026
6455852
perf(pm): fast_preload populates (name, spec) cache slot for BFS fast…
elrrrrrrr May 8, 2026
4bbcae8
perf(pm): fuse primary settle into fetch task to drop dispatch RTT
elrrrrrrr May 8, 2026
671ac98
perf(pm): combined-parse fetch path eliminates per-fetch double simd_…
elrrrrrrr May 8, 2026
542d7f1
perf(pm): bump manifests-concurrency-limit 96 → 128
elrrrrrrr May 8, 2026
c8768ac
revert(pm): manifests-concurrency-limit back to 96
elrrrrrrr May 8, 2026
3be7487
perf(pm): mb_resolve experimental fetch path (parallel track to fast_…
elrrrrrrr May 9, 2026
02cc12e
perf(pm): mb_resolve v3 — two-phase pure HTTP + rayon batch parse
elrrrrrrr May 9, 2026
24165fb
fix(pm): mb_resolve v3 — restore spec-level dedup to terminate
elrrrrrrr May 9, 2026
41822b0
perf(pm): preload-bench — self-contained streaming preload baseline
elrrrrrrr May 9, 2026
01d1513
perf(pm): integrate standalone preload into ruborist for lockfile-onl…
elrrrrrrr May 9, 2026
d9fb207
perf(pm): aws-lc-rs TLS for mb_resolve + per-stage breakdown for BFS/…
elrrrrrrr May 9, 2026
c02bb15
perf(pm): fold preload + BFS into mb_fetch_with_graph for utoo deps
elrrrrrrr May 9, 2026
63928a7
fix(pm): mb_fetch_with_graph — drain edge_targets via inline cache hit
elrrrrrrr May 9, 2026
2527137
ci(pcap): add manifest-bench + preload-bench captures for TCP-level diff
elrrrrrrr May 9, 2026
fe26709
ci(pcap): upload small summaries artifact alongside the 2GB pcap dump
elrrrrrrr May 9, 2026
1ff58ae
ci(pcap): upload summary-only artifact + print table to CI logs
elrrrrrrr May 9, 2026
a21f24b
perf(pm): mb_fetch_with_graph — channel-based separation of fetch + g…
elrrrrrrr May 9, 2026
d1cf53e
perf(pm): integrate channel-based mb_fetch into install pipeline
elrrrrrrr May 9, 2026
21d9c7d
fix(pm): mb_fetch_with_graph — normalize npm: alias specs before fetch
elrrrrrrr May 9, 2026
3e1610e
perf(pm): floor tokio worker_threads at 4 to reduce p0 outlier tail
elrrrrrrr May 10, 2026
279c51e
perf(pm): move graph_worker off tokio worker scheduler to blocking pool
elrrrrrrr May 10, 2026
bd361cb
perf(pm): split p1 win from p3 — channel resolve only on lockfile path
elrrrrrrr May 10, 2026
39c8966
perf(pm): revert rayon pool to default — fix p3 install regression
elrrrrrrr May 10, 2026
0445299
perf(pm): revert parse_json_off_runtime to rayon — fix legacy install p3
elrrrrrrr May 10, 2026
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
201 changes: 201 additions & 0 deletions .github/workflows/pm-e2e-bench.yml
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,43 @@ jobs:
name: utoo-linux-x64
path: target/x86_64-unknown-linux-gnu/release/utoo
retention-days: 1
# manifest-bench is a standalone HTTP-only fetch sweeper used as
# the network-only baseline for p1_resolve perf work. Built only
# when phases bench is going to run (label or dispatch), so plain
# PR builds aren't slowed by the extra crate.
- name: Build manifest-bench (p1 baseline)
if: >
(github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'benchmark')) ||
(github.event_name == 'workflow_dispatch' && (inputs.target == 'pm-bench-phases' || inputs.target == 'pm-bench-pcap'))
run: cargo build --release --target x86_64-unknown-linux-gnu -p manifest-bench
- name: Upload manifest-bench binary
if: >
(github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'benchmark')) ||
(github.event_name == 'workflow_dispatch' && (inputs.target == 'pm-bench-phases' || inputs.target == 'pm-bench-pcap'))
uses: actions/upload-artifact@v4
with:
name: manifest-bench-linux-x64
path: target/x86_64-unknown-linux-gnu/release/manifest-bench
retention-days: 1
# preload-bench: same HTTP setup as manifest-bench, but discovers
# names by walking transitive deps from a package.json root —
# tests whether a fully self-contained streaming preload can match
# standalone manifest-bench's wall on the same workload that
# ruborist's path runs at ~2.18s.
- name: Build preload-bench
if: >
(github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'benchmark')) ||
(github.event_name == 'workflow_dispatch' && (inputs.target == 'pm-bench-phases' || inputs.target == 'pm-bench-pcap'))
run: cargo build --release --target x86_64-unknown-linux-gnu -p preload-bench
- name: Upload preload-bench binary
if: >
(github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'benchmark')) ||
(github.event_name == 'workflow_dispatch' && (inputs.target == 'pm-bench-phases' || inputs.target == 'pm-bench-pcap'))
uses: actions/upload-artifact@v4
with:
name: preload-bench-linux-x64
path: target/x86_64-unknown-linux-gnu/release/preload-bench
retention-days: 1
# Piggyback on the already-built target/ from the step above: when the
# PR is labeled `benchmark`, overlay origin/next's tree onto the current
# workdir and re-run cargo build. cargo's incremental compile only
Expand Down Expand Up @@ -516,6 +553,33 @@ jobs:
mv /tmp/utoo-next-dist/utoo /tmp/utoo-next
echo "Baseline utoo (next) version: $(/tmp/utoo-next --version)"
echo "UTOO_NEXT_BIN=/tmp/utoo-next" >> $GITHUB_ENV
# Download the manifest-bench binary built by build-linux. Used as
# the network-only baseline for p1_resolve work — strips out parse,
# BFS, dedup, lockfile write so the wall is pure HTTP fetch.
- name: Download manifest-bench binary
uses: actions/download-artifact@v4
with:
name: manifest-bench-linux-x64
path: /tmp/manifest-bench-dist
- name: Install manifest-bench
run: |
chmod +x /tmp/manifest-bench-dist/manifest-bench
mv /tmp/manifest-bench-dist/manifest-bench /tmp/manifest-bench
echo "MANIFEST_BENCH_BIN=/tmp/manifest-bench" >> $GITHUB_ENV
# Self-contained streaming preload bench — same HTTP setup as
# manifest-bench but discovers names via transitive walk from a
# package.json. Used to test whether a fully-isolated path can
# match standalone manifest-bench's wall on the same workload.
- name: Download preload-bench binary
uses: actions/download-artifact@v4
with:
name: preload-bench-linux-x64
path: /tmp/preload-bench-dist
- name: Install preload-bench
run: |
chmod +x /tmp/preload-bench-dist/preload-bench
mv /tmp/preload-bench-dist/preload-bench /tmp/preload-bench
echo "PRELOAD_BENCH_BIN=/tmp/preload-bench" >> $GITHUB_ENV
- name: Verify tools
run: |
hyperfine --version
Expand Down Expand Up @@ -565,6 +629,91 @@ jobs:
run: |
mkdir -p /tmp/pm-bench-output
bash bench/pm-bench-phases.sh 2>&1 | tee /tmp/pm-bench-output/bench-phases-npmmirror.log
# Standalone HTTP-only sweep — sweeps the network-only ceiling
# against the same lockfile-derived workload phase-bench just used.
# Output goes into the bench logs artifact; no PR comment surface.
- name: Standalone manifest-bench (HTTP-only sweep)
env:
PROJECT: ${{ github.event.inputs.project || 'ant-design' }}
REGISTRY: 'https://registry.npmjs.org'
run: |
set -eu
mkdir -p /tmp/pm-bench-output
PROJECT_DIR="/tmp/pm-bench/$PROJECT"
if [ ! -d "$PROJECT_DIR" ]; then
mkdir -p /tmp/pm-bench
git clone --depth 1 "https://github.com/ant-design/$PROJECT" "$PROJECT_DIR"
fi
cd "$PROJECT_DIR"
if [ ! -f package-lock.json ]; then
echo "==> generating lockfile via utoo (one-shot, untimed)"
utoo deps --registry "$REGISTRY" || true
fi
ls -la package-lock.json || { echo "no lockfile; skipping manifest-bench"; exit 0; }

MB_LOG=/tmp/pm-bench-output/manifest-bench-npmjs.log
{
echo "============================================================"
echo "manifest-bench: HTTP-only fetch (no parse, no resolver)"
echo " Goal: isolate reqwest/rustls/tokio behaviour from"
echo " ruborist's resolver pipeline. Same metric shape as"
echo " ruborist's p1-breakdown line."
echo "============================================================"
for CAP in 32 64 96 128 192 256; do
echo
echo "--- concurrency=$CAP, h1, full manifest, default UA ---"
"$MANIFEST_BENCH_BIN" --lockfile package-lock.json --registry "$REGISTRY" \
--concurrency "$CAP" --reps 2 --http1-only || true
done
echo
echo "--- concurrency=128, h2 negotiate, full manifest, default UA ---"
"$MANIFEST_BENCH_BIN" --lockfile package-lock.json --registry "$REGISTRY" \
--concurrency 128 --reps 2 || true
echo
echo "--- concurrency=128, h1, single-version endpoint ---"
"$MANIFEST_BENCH_BIN" --lockfile package-lock.json --registry "$REGISTRY" \
--concurrency 128 --reps 2 --http1-only --single-version || true
echo
echo "--- concurrency=128, h1, UA=Bun/1.2.21 ---"
"$MANIFEST_BENCH_BIN" --lockfile package-lock.json --registry "$REGISTRY" \
--concurrency 128 --reps 2 --http1-only --user-agent "Bun/1.2.21" || true
} 2>&1 | tee "$MB_LOG"
# Self-contained streaming preload (transitive walk from
# package.json) — same HTTP setup as manifest-bench but with a
# streaming FuturesUnordered + per-future parse. This tests
# whether a fully ruborist-independent path can hit standalone
# manifest-bench's wall under the same project workload.
- name: Standalone preload-bench (transitive walk sweep)
env:
PROJECT: ${{ github.event.inputs.project || 'ant-design' }}
REGISTRY: 'https://registry.npmjs.org'
run: |
set -eu
mkdir -p /tmp/pm-bench-output
PROJECT_DIR="/tmp/pm-bench/$PROJECT"
if [ ! -d "$PROJECT_DIR" ]; then
echo "no project dir; skipping preload-bench"; exit 0
fi
PJ="$PROJECT_DIR/package.json"
if [ ! -f "$PJ" ]; then
echo "no package.json; skipping preload-bench"; exit 0
fi

PB_LOG=/tmp/pm-bench-output/preload-bench-npmjs.log
{
echo "============================================================"
echo "preload-bench: streaming transitive-walk preload"
echo " Self-contained (no ruborist deps). Same HTTP setup as"
echo " manifest-bench, but discovers names by walking transitive"
echo " deps from package.json instead of consuming a flat list."
echo "============================================================"
for CAP in 64 96 128; do
echo
echo "--- concurrency=$CAP, h1, transitive walk ---"
"$PRELOAD_BENCH_BIN" --package-json "$PJ" --registry "$REGISTRY" \
--concurrency "$CAP" --reps 4 || true
done
} 2>&1 | tee "$PB_LOG"
- name: Upload bench logs
if: always()
uses: actions/upload-artifact@v4
Expand Down Expand Up @@ -851,17 +1000,69 @@ jobs:
mv /tmp/utoo-next-dist/utoo /tmp/utoo-next
echo "Baseline utoo (next) version: $(/tmp/utoo-next --version)"
echo "UTOO_NEXT_BIN=/tmp/utoo-next" >> $GITHUB_ENV
# manifest-bench + preload-bench binaries for pcap-comparing
# utoo's TCP-level behaviour against pure-HTTP and
# transitive-walk baselines.
- name: Download manifest-bench binary
uses: actions/download-artifact@v4
with:
name: manifest-bench-linux-x64
path: /tmp/manifest-bench-dist
- name: Install manifest-bench
run: |
chmod +x /tmp/manifest-bench-dist/manifest-bench
mv /tmp/manifest-bench-dist/manifest-bench /tmp/manifest-bench
echo "MANIFEST_BENCH_BIN=/tmp/manifest-bench" >> $GITHUB_ENV
- name: Download preload-bench binary
uses: actions/download-artifact@v4
with:
name: preload-bench-linux-x64
path: /tmp/preload-bench-dist
- name: Install preload-bench
run: |
chmod +x /tmp/preload-bench-dist/preload-bench
mv /tmp/preload-bench-dist/preload-bench /tmp/preload-bench
echo "PRELOAD_BENCH_BIN=/tmp/preload-bench" >> $GITHUB_ENV
- name: Capture pcap
env:
PROJECT: ${{ github.event.inputs.project || 'ant-design' }}
REGISTRY: 'https://registry.npmjs.org'
run: |
chmod +x bench/pm-bench-pcap.sh
bash bench/pm-bench-pcap.sh
# Small artifact (KB scale) with just the per-capture +
# aggregated metrics — fast to download for diff analysis,
# avoids the 2GB pcap-corpus pull when we only need numbers.
- name: Upload pcap summaries
if: always()
uses: actions/upload-artifact@v4
with:
name: pm-bench-pcap-summaries
path: |
/tmp/pm-bench-pcap/*.json
/tmp/pm-bench-pcap/*.log
/tmp/pm-bench-pcap/*.iostat.txt
/tmp/pm-bench-pcap/dns.txt
retention-days: 7
- name: Upload pcap artifact
if: always()
uses: actions/upload-artifact@v4
with:
name: pm-bench-pcap
path: /tmp/pm-bench-pcap
retention-days: 7
# Tiny summary-only artifact for quick comparison without
# re-downloading the multi-GB pcap blob. Includes the
# tshark-extracted JSON metrics + the pcap.log files (text,
# tiny) but no .pcap binaries.
- name: Upload pcap summaries (small)
if: always()
uses: actions/upload-artifact@v4
with:
name: pm-bench-pcap-summaries
path: |
/tmp/pm-bench-pcap/*.json
/tmp/pm-bench-pcap/*.log
/tmp/pm-bench-pcap/*.iostat.txt
/tmp/pm-bench-pcap/dns.txt
retention-days: 7
Loading
Loading