Skip to content

[experiment] ci: benchmark the longest PR checks on 16/32/64-core runners - #343095

Draft
Michael Lively (Yoyokrazy) wants to merge 4 commits into
mainfrom
agents/benchmark-longest-running-pr-checks
Draft

Michael Lively (Yoyokrazy) wants to merge 4 commits into
mainfrom
agents/benchmark-longest-running-pr-checks

Conversation

@Yoyokrazy

@Yoyokrazy Michael Lively (Yoyokrazy) commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

Warning

Experiment, do not merge. The temporary benchmark jobs make this PR non-mergeable by design. Some of them may fail on the new runners (for example, WSL on Windows smoke shard 1). That's expected and is part of what gets measured.

Part of https://github.com/microsoft/vscode-engineering/issues/4273.

What this measures

How much faster the longest-running PR check jobs get on bigger GitHub-hosted runners with no test-code changes. Only runs-on changes, plus ESLint settings in a step that already runs in parallel. Every size runs on the same commit in the same workflow run as the original jobs, so each run also gives an in-run baseline.

Job Baseline runner Benchmark runners
Linux / Electron, Electron-Unit, Remote, smoke shards 1–2 standard ubuntu-24.04 (4-core) vscode-large-runners-ubuntu-{16,32,64}-core
Windows / Electron, Electron-Unit, Remote, smoke shards 1–2 1ES D8ds_v5 (8-core, Server 2022) vscode-large-runners-windows-{16,32,64}-core (Server 2025)
Compile & Hygiene 1ES 8-core (Ubuntu 22.04) vscode-large-runners-ubuntu-{16,32,64}-core × 3 ESLint variants

The 8-core pools are production pools, so this PR doesn't use them. The 8-core data point will come from the PR that moves the PR checks onto them.

Changes

  • pr-linux-test.yml and pr-win32-test.yml get two new inputs:
    • runner: defaults to today's runner (ubuntu-24.04 / the 1ES Windows pool).
    • benchmark: samples CPU and memory in the background (vmstat on Linux, Get-Counter on Windows), uploads the samples as a resources-* artifact, and adds the runner label to artifact names so they don't collide with the original jobs.
  • pr.yml:
    • New bench-* jobs run the jobs above on 16/32/64 core. They're not part of required-checks.
    • Compile & Hygiene is now a matrix. The first entry is the unchanged required check. The others run on 16/32/64 core with ESLint:
      • after: after the npm-run-all2 -lp group, as today.
      • parallel: inside the group. It was moved out because the 32 GB machine ran out of memory (ci: run ESLint after parallel compile checks #339153).
      • parallel-8-workers (32/64 core): inside the group, with at most 8 ESLint workers. Run A used one worker per core instead (parallel-all-cores). That ran out of memory on 16 and 64 cores, so it was replaced.
  • build/eslint.ts: VSCODE_ESLINT_CONCURRENCY (auto/off/N) overrides ESLint's concurrency option. The default (auto) is unchanged.
  • build/lib/test/detectChanges.test.ts: the temporary bench-* jobs are excluded from the check that every PR test job reports through required-checks.
  • The Windows sampler also records disk type, CPU model and Defender status, and the Linux one records disk info.

Pool usage per run: up to 8 concurrent jobs on each Linux pool, 5 on each Windows pool.

Not in this PR

Results

Results comment, also posted on vscode-engineering#4273:

  • Linux test jobs stop getting faster at 8 cores. Electron-Unit gets nothing from size.
  • Compile & Hygiene on 32-core, with ESLint in the parallel group and capped at 8 workers: 8.0 → 3.5 min. auto (32 workers) runs out of memory on 64-core.
  • Windows gets no faster at any size, and Agent Host E2E and npm ci are slower than on 1ES. The cause is I/O, not CPU, and Defender is off.

Validation

  • actionlint on the three workflows: no new findings. The only warnings left are the existing unknown 1ES.Pool=… labels.
  • CI ran test-build-scripts (including the new eslint and the updated detectChanges tests) and Type check /build/ scripts in every Compile & Hygiene job. Both passed.

Temporary experiment for microsoft/vscode-engineering#4273, do not merge.

- Add `runner` and `benchmark` inputs to pr-linux-test.yml and
  pr-win32-test.yml. `runner` defaults to today's runner. `benchmark`
  samples CPU and memory in the background and suffixes artifact names.
- Add benchmark jobs to pr.yml that run Linux and Windows Electron,
  Electron-Unit, Remote, and both smoke shards unchanged on the 16, 32,
  and 64-core GitHub-hosted pools, next to the original jobs.
- Run Compile & Hygiene as a matrix: the first entry is the unchanged
  required check; the others run on 16/32/64 core with ESLint after the
  parallel checks, inside them, or inside them with one worker per core.
- Let VSCODE_ESLINT_CONCURRENCY override ESLint's `concurrency` option.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings October 21, 2026 00:37
The temporary runner-size benchmark jobs call the PR test workflows but are
not required checks.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
One ESLint worker per core ran out of memory on the 16 and 64-core
runners. Benchmark a fixed cap of 8 workers on 32 and 64 cores instead.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Warning

Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a copilot-code-review.yml file specifying one with the runs-on attribute. See the docs for more details.

Copilot review overview

7 open issues
What changed in this PR

This PR adds temporary CI benchmark jobs to measure how long-running PR checks perform on larger GitHub-hosted runners, and introduces an environment-variable override for ESLint concurrency to support those experiments.

Changes:

  • Adds runner/benchmark inputs to the Linux/Windows reusable test workflows, including resource sampling and benchmark-safe artifact naming.
  • Converts “Compile & Hygiene” into a matrix to test runner sizes and multiple ESLint-parallelization strategies.
  • Adds VSCODE_ESLINT_CONCURRENCY parsing in build tooling plus unit tests, and updates required-check detection tests to ignore bench-* jobs.
File Description
build/​eslint.ts Adds VSCODE_ESLINT_CONCURRENCY parsing and wires it into ESLint invocation.
build/​lib/​test/​eslint.test.ts Adds coverage for the new concurrency parsing helper.
build/​lib/​test/​detectChanges.test.ts Excludes benchmark jobs from required-check comparison logic.
.github/​workflows/​pr.yml Adds bench job matrices + resource sampling; expands Compile & Hygiene into a matrix.
.github/​workflows/​pr-linux-test.yml Adds runner selection, benchmark mode, artifact name disambiguation, and resource sampling.
.github/​workflows/​pr-win32-test.yml Adds runner selection, benchmark mode, artifact name disambiguation, and resource sampling.

Review effort: Lite

Comment on lines +58 to +63
- name: Start resource sampler
if: ${{ inputs.benchmark }}
run: |
mkdir -p .build/resources
{ nproc; free -m; df -h "$GITHUB_WORKSPACE" /tmp; lscpu; } > .build/resources/system.txt 2>&1
nohup vmstat -n -t 5 > .build/resources/vmstat.log 2>&1 &
Comment on lines +509 to +516
- name: Publish resource samples
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: ${{ always() && inputs.benchmark }}
continue-on-error: true
with:
name: ${{ format('resources-linux-{0}-{1}-{2}', env.VSCODE_ARCH, env.ARTIFACT_NAME, github.run_attempt) }}
path: .build/resources
if-no-files-found: ignore
Comment on lines +80 to +81
Start-Process pwsh -WindowStyle Hidden -ArgumentList '-NoProfile', '-File', "`"$sampler`"", '-Output', "`"$(Join-Path $directory counters.csv)`""

Comment on lines +394 to +401
- name: Publish resource samples
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: ${{ always() && inputs.benchmark }}
continue-on-error: true
with:
name: ${{ format('resources-windows-{0}-{1}-{2}', env.VSCODE_ARCH, env.ARTIFACT_NAME, github.run_attempt) }}
path: .build/resources
if-no-files-found: ignore
Comment thread .github/workflows/pr.yml
Comment on lines +421 to +430
bench-linux-electron-unit-tests:
name: Bench Linux ${{ matrix.size }}-core
strategy:
fail-fast: false
matrix:
size: [16, 32, 64]
uses: ./.github/workflows/pr-linux-test.yml
with:
job_name: Electron-Unit
runner: vscode-large-runners-ubuntu-${{ matrix.size }}-core
Comment thread .github/workflows/pr.yml
Comment on lines +436 to +445
bench-linux-electron-tests:
name: Bench Linux ${{ matrix.size }}-core
strategy:
fail-fast: false
matrix:
size: [16, 32, 64]
uses: ./.github/workflows/pr-linux-test.yml
with:
job_name: Electron
runner: vscode-large-runners-ubuntu-${{ matrix.size }}-core
Comment thread build/eslint.ts
Comment on lines +26 to +34
if (!value || value === 'auto') {
return 'auto';
}
if (value === 'off') {
return 'off';
}
const workers = Number(value);
if (!Number.isInteger(workers) || workers < 1) {
throw new Error(`Invalid VSCODE_ESLINT_CONCURRENCY: ${value}`);
The Windows benchmark jobs are disk-bound, so record what the runners'
disks and real-time scanning look like.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown
Contributor

Screenshot Changes

Base: 022ccea0 Current: 7425cdf2

Changed (1)

chat/aiCustomizations/customizationMigrationDashboard/MigrationsTooltip/Light
Before After
before after

@Yoyokrazy

Copy link
Copy Markdown
Collaborator Author

Results: longest PR check jobs on 16 / 32 / 64-core runners (size only, no test changes)

Draft PR: #343095 · tracking: microsoft/vscode-engineering#4273

Short answer:

  • Linux test jobs: stop getting faster at 8 cores.
  • Compile & Hygiene: the only job that keeps scaling. 32-core with ESLint folded in and capped at 8 workers: 8.0 → 3.5 min.
  • Windows: gets no faster at any size on the GitHub-hosted pools, and Windows / Electron is ~11 min slower than today's 1ES pool. The slowdown is I/O, not CPU.

Headline: median job time, minutes (node_modules cache hit)

Job Today 8-core¹ 16-core 32-core 64-core Where it flattens
Windows / Electron 32.1 (1ES 8-core) AH E2E alone 30.0, failed 44.3 43.3 42.8 worse at every size
Windows / Electron-Unit 20.0 (1ES) node unit failed 14.9 20.1 18.3 noisy, no consistent gain
Windows / Remote 15.3 (1ES) 15.6 12.4 17.1 11.4 noisy, no consistent gain
Windows smoke shard 1 13.0 (1ES) 15.9 14.0 16.9 16.1 worse (setup + WSL prep)
Windows smoke shard 2 10.7 (1ES) 12.5 9.4 12.9 10.3 flat
Linux / Remote 13.6 (standard 4-core) 9.9 9.9 9.2 9.0 8
Linux / Electron 16.1 (4-core) 11.7 12.2 12.0 11.5 8
Linux / Electron-Unit 13.6 (4-core) 13.9 12.2 12.1 12.1 no gain at any size
Linux smoke shard 1 11.1 (4-core) 10.3 8.2 7.7 7.6 16
Linux smoke shard 2 12.1 (4-core) 10.3 9.1 7.9 8.3 16–32
Compile & Hygiene, ESLint after the group (today) 8.0 (1ES 8-core) 7.2 5.6 4.2 3.5 (1 of 4 OOM) 32
Compile & Hygiene, ESLint in the group (auto workers) – – 4.9 3.6 3.2 (1 of 4 OOM) 32
Compile & Hygiene, ESLint in the group, max 8 workers – – 4.9² 3.5 2.7 32 (64 saves 0.8 min more)

¹ 8-core numbers come from the production-pool PR #343094: 1–2 runs per job, so they show the trend only. ² On 16 cores auto already means 8 workers.

Samples: 4 per job × size (run A plus 3 attempts of run C), all on one commit per run. Every run also ran the unchanged original jobs, which give the in-run baseline ("Today"). The in-run baseline matches the Oct 20 medians (Compile 8.0 vs 8.0; Windows / Electron 32.1 vs 25.5–37.5 depending on Agent Host E2E). This PR changes .github/workflows/pr*, so every Electron job ran the full Agent Host E2E profile.

Why

Busy cores during the main steps, from the vmstat / Get-Counter samplers (median of runs; full table below):

Job / step Average busy cores (p95) Notes
Linux Electron-Unit: Electron unit / node unit 0.9 (2) / 0.9 (2) One renderer, one node process. Size can't help; #342237 (--workers) is the fix
Linux Electron: Agent Host E2E / integration 4.4 (10) / 2.0 (4) AH E2E already runs its 6 suites in parallel
Linux Remote / smoke shards 2–3.3 (4–5)
Compile & Hygiene parallel group (ESLint after) 7.4–8.5 (16–31) A long single-threaded tail (core-ci) caps the gain past 32
Compile & Hygiene group with ESLint, auto 10.6 / 13.3 / 17.1 on 16 / 32 / 64 Peak memory 45 / 62 / 95 GB
Compile & Hygiene group with ESLint, max 8 workers 12.2 / 13.4 on 32 / 64 Peak memory 40 / 48 GB
Windows Electron: Agent Host E2E 1.5–1.9 (3) Disk 93–94% busy on 16/32-core, 46% on 64-core
Windows npm ci (cache miss) 0.8–1.5 (2–3) Disk 33–72% busy
  • Linux tests use 1–5 cores on average, never more than ~10 at p95. The gain over today's standard 4-core runner comes from having more cores at all; past 8 cores, extra ones sit idle.
  • ESLint memory grows with its worker count. concurrency: 'auto' means one worker per two cores, so 32 workers on 64-core.
    • 32 workers hit FATAL ERROR … JavaScript heap out of memory / ERR_WORKER_OUT_OF_MEMORY in 2 of 8 64-core runs: one with ESLint after the group, one with it inside.
    • One worker per core OOMed on 64-core, and on 16-core the runner itself was shut down (exit 143, most likely out of system memory). Only 32-core survived. So I replaced that variant with an 8-worker cap after run A.
    • On 16-core with ESLint inside the group at auto, free memory bottomed out at 7.5 GB of 64 GB.
    • The 8-worker cap never failed and was the fastest variant on 32 and 64.
  • Windows is I/O-bound, not CPU-bound.
    • Agent Host E2E takes 26–30 min on every GitHub-hosted size, 8-core included, vs 9.7–19.5 min on 1ES. Every suite is 1.6–2.4× slower, while only 1.5–2 cores are busy.
    • On a node_modules cache miss, npm ci takes 17–24 min vs 12 min on 1ES.
    • The cache restore (7z x) takes 3–4 min vs 1.3, and WSL prep 2.6–3.2 vs 1.8.
    • Defender is not the cause: RealTimeProtectionEnabled: False, and C:\ is excluded.
    • Everything (workspace, %TEMP%, user-data) runs on C:, which is a remote "NVMe Premium SSD" virtual disk. The 1ES D8ds_v5 has a local temp SSD.
    • 64-core has a larger disk (lower busy %), yet AH E2E is still ~27 min, which points at per-operation storage latency rather than throughput.
    • ⚠️ These Windows numbers also change the OS (Server 2022 on 1ES → Server 2025 on the new pools), so OS and storage effects are mixed together.

Recommendation

Job Size Why
Compile & Hygiene 32-core, ESLint inside the npm-run-all2 -lp group with concurrency: 8 8.0 → 3.5 min (−56%), peak 40 GB. 64-core gets 2.7 min at twice the price of 32. Never use auto on 64-core, and don't fold ESLint in at auto on 16-core (OOM risk). This is faster first feedback; it doesn't shorten the PR overall, because Windows / Electron is the long pole
Linux Electron, Remote, smoke shards 8-core (#343094) 16+ cores save at most ~1–2 min on the smoke shards, for 2× the cost
Linux Electron-Unit 8-core Size doesn't matter (one core busy). Parallel workers (#342237) are the lever
Windows (all jobs) Don't upsize Nothing scales with cores. Fix storage before moving Windows / Electron off 1ES: try a Dev Drive (ReFS) or faster storage for the workspace, %TEMP% and user-data dirs, and compare Server 2022 vs 2025. The same problem shows up on the 8-core pool in #343094 (AH E2E 30 min, failed)

Related work:

Cache, queue, flakes

  • Cache: Linux hit in every run of this PR. In run C attempt 1, Windows missed for the 1ES jobs and most of the new-pool jobs; jobs that started a few minutes later hit. Those misses are where the npm ci numbers come from. Linux npm ci on 8-core (ci: move PR checks to GitHub-hosted 8-core runners #343094): 2.9–5.2 min.
  • Queue time (created_at → started_at): median 0.3–2.4 min, max 6.3 min (Windows 64-core) and 5.0 min (Linux 64-core). 1ES and standard runners: 0.1–0.2 min.
  • Failures, all on the new pools; none in the baseline jobs:
    • Windows AH E2E, 1 of 4 runs on 32-core and 1 of 4 on 64-core (both in run A). "Copilot managed permissions" timed out waiting for a response to subscribe (20 s), and on 64-core the Claude suite failed as well. Both fit the slow I/O.
    • Windows node unit, once on 64-core ("Mission Control WPS: concurrent hosts converge …").
    • Windows smoke shard 1, once on 16-core (docker ps in the WSL Dev Container after all hook).
    • Compile & Hygiene ESLint OOMs, listed above.
  • WSL2 works on every GitHub-hosted Windows size: WSL prep succeeded in all 12 runs.
  • Hardware: Linux is AMD EPYC 7763 and Windows is AMD EPYC 9V45, both with SMT, so "16-core" means 8 physical cores. Disks: Linux virtual disk, 600 GB on 16-core and larger on bigger sizes; Windows "NVMe Premium SSD" virtual disk.

Cost of the experiment

Two full workflow runs plus two full re-runs (run A; run C × 3 attempts). Two more runs were cancelled within ~7 min: one to fix a build-script test that enumerates pr.yml jobs, one to add disk and Defender diagnostics. No single-job re-runs were needed.

Full per-step tables (median, min–max; minutes)

"Total, cache hit" counts only successful jobs whose node_modules cache hit. Step times include runs where the step failed on a test assertion; the suites still ran to completion. Compile & Hygiene step times come from successful runs only.

Windows

Job Size OK / runs Total, cache hit Step 1 Step 2 npm ci (miss) Cache hit / miss Queue med (max)
Electron baseline 4 / 4 32.1 (24.4–34.6) Agent Host E2E 16.6 (9.7–19.5) integration 12.6 (12.1–12.7) 12.1 3 / 1 0.2 (0.2)
Electron 8-core* 0 / 1 – Agent Host E2E 30.0 integration 12.7 – 1 / 0 1.9 (1.9)
Electron 16-core 4 / 4 44.3 (44.3–45.2) Agent Host E2E 28.0 (27.3–29.4) integration 12.2 (11.9–12.4) 21.4 3 / 1 0.5 (1.9)
Electron 32-core 3 / 4 43.3 (41.9–44.8) Agent Host E2E 28.4 (27.2–28.7) integration 12.0 (10.3–14.4) 23.8 3 / 1 0.5 (3.1)
Electron 64-core 3 / 4 42.8 (40.9–44.6) Agent Host E2E 27.1 (26.4–27.7) integration 12.0 (10.0–13.9) 19.9 3 / 1 1.8 (3.4)
Electron-Unit baseline 4 / 4 20.0 (19.7–21.3) Electron unit 11.3 (11.1–12.0) node unit 6.5 (6.3–6.9) 12.3 3 / 1 0.2 (0.3)
Electron-Unit 8-core* 0 / 1 – Electron unit 9.1 node unit 5.2 – 1 / 0 2.0 (2.0)
Electron-Unit 16-core 4 / 4 14.9 (13.8–24.2) Electron unit 8.1 (7.2–10.7) node unit 3.9 (3.1–8.4) 18.1 3 / 1 0.8 (2.3)
Electron-Unit 32-core 4 / 4 20.1 (14.6–20.7) Electron unit 9.4 (6.9–9.8) node unit 4.8 (3.9–6.7) 17.2 3 / 1 1.2 (2.2)
Electron-Unit 64-core 3 / 4 18.3 (14.6–24.4) Electron unit 9.0 (6.9–11.5) node unit 4.6 (4.5–7.5) – 4 / 0 1.6 (6.3)
Remote baseline 4 / 4 15.3 (14.3–15.8) integration 4.3 (4.1–4.7) smoke 7.7 (7.3–8.2) 11.8 3 / 1 0.2 (0.2)
Remote 8-core* 2 / 2 15.6 integration 3.7 (3.6–3.8) smoke 6.5 (5.9–7.0) 18.5 1 / 1 1.1 (2.1)
Remote 16-core 4 / 4 12.4 (11.6–19.1) integration 3.0 (3.0–5.0) smoke 5.7 (5.2–8.4) 18.9 3 / 1 0.8 (2.1)
Remote 32-core 4 / 4 17.1 (11.3–18.0) integration 3.5 (2.8–4.5) smoke 6.1 (5.2–7.5) 17.6 3 / 1 0.5 (2.1)
Remote 64-core 4 / 4 11.4 (10.9–14.9) integration 3.1 (2.8–3.7) smoke 5.7 (5.0–6.3) 19.4 3 / 1 1.8 (2.6)
Smoke shard 1 baseline 4 / 4 13.0 (12.8–13.3) WSL prep 1.8 (1.6–1.9) smoke 8.4 (8.1–8.6) 12.3 3 / 1 0.2 (0.2)
Smoke shard 1 8-core* 2 / 2 15.9 WSL prep 2.8 (2.8–2.8) smoke 8.0 (7.9–8.1) 19.7 1 / 1 2.1 (2.3)
Smoke shard 1 16-core 3 / 4 14.0 (13.3–18.5) WSL prep 2.6 (2.1–3.1) smoke 6.5 (6.1–9.0) – 4 / 0 0.3 (0.5)
Smoke shard 1 32-core 4 / 4 16.9 (13.7–18.3) WSL prep 3.2 (2.8–3.7) smoke 8.3 (6.1–8.8) – 4 / 0 0.4 (2.9)
Smoke shard 1 64-core 4 / 4 16.1 (14.6–18.6) WSL prep 2.7 (2.6–2.9) smoke 7.8 (7.5–8.7) – 4 / 0 1.5 (5.0)
Smoke shard 2 baseline 4 / 4 10.7 (10.6–10.8) smoke 7.9 (7.6–8.0) 12.1 3 / 1 0.2 (0.2)
Smoke shard 2 8-core* 2 / 2 12.5 smoke 7.8 (7.7–7.8) 24.4 1 / 1 2.1 (2.4)
Smoke shard 2 16-core 4 / 4 9.4 (8.9–12.9) smoke 6.8 (5.8–8.0) 20.6 3 / 1 0.6 (2.2)
Smoke shard 2 32-core 4 / 4 12.9 (11.2–13.4) smoke 7.6 (6.7–7.9) 19.3 3 / 1 0.6 (1.9)
Smoke shard 2 64-core 4 / 4 10.3 (8.9–12.8) smoke 6.8 (5.6–7.6) 17.9 3 / 1 0.6 (2.8)

Linux

Job Size OK / runs Total, cache hit Step 1 Step 2 npm ci (miss) Cache hit / miss Queue med (max)
Remote baseline 4 / 4 13.6 (13.5–16.3) integration 4.6 (4.5–5.7) smoke 6.8 (6.5–8.6) – 4 / 0 0.1 (0.1)
Remote 8-core* 2 / 2 9.9 integration 3.8 (3.7–3.8) smoke 4.5 (4.5–4.5) 2.9 1 / 1 0.1 (0.1)
Remote 16-core 4 / 4 9.9 (9.6–11.8) integration 3.7 (3.6–4.4) smoke 4.5 (4.5–5.7) – 4 / 0 1.4 (1.7)
Remote 32-core 4 / 4 9.2 (8.4–10.6) integration 3.5 (3.3–4.0) smoke 4.2 (3.8–5.0) – 4 / 0 2.0 (2.3)
Remote 64-core 4 / 4 9.0 (8.2–11.2) integration 3.4 (3.3–4.4) smoke 4.1 (3.8–5.3) – 4 / 0 1.4 (2.4)
Electron-Unit baseline 4 / 4 13.6 (12.0–15.3) Electron unit 8.8 (7.5–9.7) node unit 3.3 (2.8–3.7) – 4 / 0 0.1 (0.1)
Electron-Unit 8-core* 2 / 2 13.9 Electron unit 9.0 (9.0–9.0) node unit 3.5 (3.5–3.5) 4.2 1 / 1 0.1 (0.1)
Electron-Unit 16-core 4 / 4 12.2 (11.7–13.9) Electron unit 7.7 (7.6–9.1) node unit 2.8 (2.7–3.7) – 4 / 0 0.9 (1.8)
Electron-Unit 32-core 4 / 4 12.1 (10.5–14.4) Electron unit 7.8 (6.8–9.3) node unit 2.9 (2.4–3.7) – 4 / 0 1.3 (2.1)
Electron-Unit 64-core 4 / 4 12.1 (11.0–14.0) Electron unit 7.9 (7.2–9.1) node unit 3.1 (2.5–3.7) – 4 / 0 2.0 (3.9)
Electron baseline 4 / 4 16.1 (14.4–19.5) Agent Host E2E 6.2 (5.1–7.7) integration 8.1 (7.3–10.0) – 4 / 0 0.1 (0.1)
Electron 8-core* 2 / 2 11.7 Agent Host E2E 4.5 (4.0–5.1) integration 7.5 (6.3–8.7) 4.2 1 / 1 0.1 (0.1)
Electron 16-core 4 / 4 12.2 (12.1–13.7) Agent Host E2E 4.0 (3.9–4.4) integration 6.7 (6.7–8.0) – 4 / 0 1.3 (1.6)
Electron 32-core 4 / 4 12.0 (11.0–13.9) Agent Host E2E 3.8 (3.6–4.2) integration 6.9 (5.9–8.1) – 4 / 0 1.3 (2.1)
Electron 64-core 4 / 4 11.5 (10.3–13.6) Agent Host E2E 3.7 (3.3–4.0) integration 6.5 (5.8–8.2) – 4 / 0 1.4 (2.0)
Smoke shard 1 baseline 4 / 4 11.1 (10.1–11.8) smoke 9.0 (7.9–9.8) – 4 / 0 0.1 (0.1)
Smoke shard 1 8-core* 2 / 2 10.3 smoke 7.6 (6.7–8.4) 3.3 1 / 1 0.1 (0.1)
Smoke shard 1 16-core 4 / 4 8.2 (7.5–9.0) smoke 6.7 (6.2–7.5) – 4 / 0 0.6 (1.6)
Smoke shard 1 32-core 4 / 4 7.7 (7.0–8.7) smoke 6.1 (5.6–7.3) – 4 / 0 0.8 (2.1)
Smoke shard 1 64-core 4 / 4 7.6 (6.6–9.0) smoke 6.2 (5.3–7.3) – 4 / 0 1.9 (3.5)
Smoke shard 2 baseline 4 / 4 12.1 (10.9–12.5) smoke 9.7 (9.1–10.3) – 4 / 0 0.1 (0.1)
Smoke shard 2 8-core* 2 / 2 10.3 smoke 8.3 (8.0–8.5) 3.5 1 / 1 0.1 (0.1)
Smoke shard 2 16-core 4 / 4 9.1 (8.2–10.1) smoke 7.5 (6.8–8.6) – 4 / 0 0.9 (1.5)
Smoke shard 2 32-core 4 / 4 7.9 (7.4–9.6) smoke 6.4 (6.1–8.0) – 4 / 0 0.9 (2.3)
Smoke shard 2 64-core 4 / 4 8.3 (7.5–9.2) smoke 7.1 (6.2–7.7) – 4 / 0 1.4 (3.6)

Compile & Hygiene (Linux)

Job Size OK / runs Total, cache hit Step 1 Step 2 npm ci (miss) Cache hit / miss Queue med (max)
ESLint after baseline 4 / 4 8.0 (7.5–8.2) parallel group 4.8 (4.6–4.9) ESLint 2.3 (2.1–2.4) – 4 / 0 0.2 (0.3)
ESLint after 8-core* 2 / 2 7.2 parallel group 4.7 (4.3–5.1) ESLint 2.1 (1.9–2.3) 5.2 1 / 1 0.1 (0.1)
ESLint after 16-core 4 / 4 5.6 (5.1–6.3) parallel group 3.3 (2.8–3.6) ESLint 1.4 (1.2–1.5) – 4 / 0 1.0 (1.6)
ESLint after 32-core 4 / 4 4.2 (3.6–4.4) parallel group 2.4 (2.0–2.5) ESLint 0.9 (0.9–1.0) – 4 / 0 1.5 (2.2)
ESLint after 64-core 3 / 4 3.5 (3.4–5.1) parallel group 2.4 (1.9–3.0) ESLint 0.9 (0.9–1.2) – 4 / 0 2.0 (5.0)
ESLint parallel 16-core 4 / 4 4.9 (4.4–5.6) parallel group 4.0 (3.5–4.5) – 4 / 0 0.3 (1.4)
ESLint parallel 32-core 4 / 4 3.6 (3.1–4.7) parallel group 2.8 (2.3–3.5) – 4 / 0 1.3 (2.0)
ESLint parallel 64-core 3 / 4 3.2 (3.1–4.3) parallel group 2.6 (2.2–3.3) – 4 / 0 1.9 (2.9)
ESLint parallel-8-workers 32-core 3 / 3 3.5 (3.1–3.7) parallel group 2.7 (2.3–2.8) – 3 / 0 1.9 (2.2)
ESLint parallel-8-workers 64-core 3 / 3 2.7 (2.7–2.8) parallel group 2.0 (2.0–2.0) – 3 / 0 2.4 (3.4)
ESLint parallel-all-cores 16-core 0 / 1 – parallel group – – 1 / 0 0.1 (0.1)
ESLint parallel-all-cores 32-core 1 / 1 4.1 parallel group 3.1 – 1 / 0 0.1 (0.1)
ESLint parallel-all-cores 64-core 0 / 1 – parallel group – – 1 / 0 0.2 (0.2)
Resource usage per step (median across runs)
Job / step 16-core 32-core 64-core
Linux / Compile & Hygiene (ESLint after) / compileHygiene 7.5 avg / 16 p95 cores, iowait 1%, 28 GB (n=3) 8.4 avg / 23 p95 cores, iowait 0%, 28 GB (n=3) 8.5 avg / 31 p95 cores, iowait 0%, 28 GB (n=3)
Linux / Compile & Hygiene (ESLint after) / eslint 8.6 avg / 11 p95 cores, iowait 0%, 27 GB (n=3) 12.6 avg / 19 p95 cores, iowait 0%, 46 GB (n=3) 19.1 avg / 35 p95 cores, iowait 0%, 78 GB (n=3)
Linux / Compile & Hygiene (ESLint parallel) / compileHygiene 10.6 avg / 16 p95 cores, iowait 0%, 45 GB (n=3) 13.4 avg / 28 p95 cores, iowait 0%, 62 GB (n=3) 17.7 avg / 47 p95 cores, iowait 0%, 95 GB (n=3)
Linux / Compile & Hygiene (ESLint parallel-8-workers) / compileHygiene – 12.7 avg / 25 p95 cores, iowait 0%, 43 GB (n=2) 13.5 avg / 32 p95 cores, iowait 0%, 49 GB (n=2)
Linux / Compile & Hygiene (ESLint parallel-all-cores) / compileHygiene – 16.6 avg / 31 p95 cores, iowait 0%, 87 GB (n=1) 20.5 avg / 59 p95 cores, iowait 0%, 99 GB (n=1)
Linux / Electron-Unit / unitElectron 0.9 avg / 2 p95 cores, iowait 2%, 5 GB (n=3) 0.8 avg / 2 p95 cores, iowait 0%, 5 GB (n=3) 0.9 avg / 2 p95 cores, iowait 0%, 6 GB (n=3)
Linux / Electron-Unit / unitNode 1.0 avg / 1 p95 cores, iowait 0%, 4 GB (n=3) 1.0 avg / 1 p95 cores, iowait 0%, 4 GB (n=3) 0.9 avg / 1 p95 cores, iowait 0%, 5 GB (n=3)
Linux / Electron / agentHostE2E 4.2 avg / 9 p95 cores, iowait 1%, 6 GB (n=3) 4.1 avg / 10 p95 cores, iowait 1%, 7 GB (n=3) 4.2 avg / 10 p95 cores, iowait 0%, 8 GB (n=3)
Linux / Electron / integration 1.9 avg / 4 p95 cores, iowait 0%, 6 GB (n=3) 1.9 avg / 3 p95 cores, iowait 0%, 7 GB (n=3) 2.0 avg / 3 p95 cores, iowait 0%, 8 GB (n=3)
Linux / Remote / integrationRemote 2.0 avg / 3 p95 cores, iowait 0%, 4 GB (n=3) 2.1 avg / 4 p95 cores, iowait 0%, 5 GB (n=3) 2.0 avg / 4 p95 cores, iowait 0%, 6 GB (n=3)
Linux / Remote / smokeRemote 3.3 avg / 5 p95 cores, iowait 0%, 5 GB (n=3) 3.2 avg / 4 p95 cores, iowait 0%, 6 GB (n=3) 3.1 avg / 4 p95 cores, iowait 0%, 7 GB (n=3)
Linux / Smoke shard 1 / smoke 2.8 avg / 4 p95 cores, iowait 0%, 6 GB (n=4) 2.7 avg / 4 p95 cores, iowait 0%, 6 GB (n=3) 2.6 avg / 4 p95 cores, iowait 0%, 6 GB (n=3)
Linux / Smoke shard 2 / smoke 2.4 avg / 4 p95 cores, iowait 1%, 6 GB (n=3) 2.2 avg / 4 p95 cores, iowait 0%, 6 GB (n=3) 2.4 avg / 4 p95 cores, iowait 0%, 7 GB (n=3)
Windows / Electron-Unit / npmCi 0.8 avg / 2 p95 cores, disk busy 72%, 7 GB (n=1) 1.2 avg / 2 p95 cores, disk busy 63%, 9 GB (n=1) –
Windows / Electron-Unit / unitElectron 1.1 avg / 2 p95 cores, disk busy 42%, 11 GB (n=4) 1.3 avg / 2 p95 cores, disk busy 47%, 12 GB (n=4) 1.4 avg / 2 p95 cores, disk busy 11%, 15 GB (n=3)
Windows / Electron-Unit / unitNode 1.3 avg / 2 p95 cores, disk busy 43%, 9 GB (n=4) 1.4 avg / 2 p95 cores, disk busy 65%, 11 GB (n=4) 1.1 avg / 2 p95 cores, disk busy 34%, 13 GB (n=3)
Windows / Electron / agentHostE2E 1.6 avg / 3 p95 cores, disk busy 93%, 10 GB (n=4) 1.6 avg / 3 p95 cores, disk busy 94%, 12 GB (n=4) 1.8 avg / 3 p95 cores, disk busy 47%, 15 GB (n=4)
Windows / Electron / integration 3.1 avg / 11 p95 cores, disk busy 14%, 10 GB (n=4) 2.9 avg / 6 p95 cores, disk busy 42%, 11 GB (n=4) 2.6 avg / 5 p95 cores, disk busy 32%, 14 GB (n=4)
Windows / Electron / npmCi 1.3 avg / 2 p95 cores, disk busy 65%, 7 GB (n=1) 1.2 avg / 2 p95 cores, disk busy 72%, 9 GB (n=1) 1.4 avg / 3 p95 cores, disk busy 33%, 12 GB (n=1)
Windows / Remote / integrationRemote 2.6 avg / 4 p95 cores, disk busy 9%, 10 GB (n=3) 2.7 avg / 4 p95 cores, disk busy 23%, 11 GB (n=3) 2.7 avg / 4 p95 cores, disk busy 9%, 14 GB (n=4)
Windows / Remote / npmCi – – 1.2 avg / 2 p95 cores, disk busy 34%, 12 GB (n=1)
Windows / Remote / smokeRemote 3.0 avg / 5 p95 cores, disk busy 65%, 10 GB (n=3) 3.3 avg / 6 p95 cores, disk busy 38%, 12 GB (n=3) 3.1 avg / 5 p95 cores, disk busy 16%, 15 GB (n=4)
Windows / Smoke shard 1 / smoke 3.0 avg / 5 p95 cores, disk busy 52%, 14 GB (n=4) 3.1 avg / 5 p95 cores, disk busy 94%, 17 GB (n=3) 3.5 avg / 6 p95 cores, disk busy 39%, 22 GB (n=3)
Windows / Smoke shard 2 / npmCi – 1.5 avg / 2 p95 cores, disk busy 57%, 8 GB (n=1) –
Windows / Smoke shard 2 / smoke 2.6 avg / 5 p95 cores, disk busy 23%, 10 GB (n=3) 3.2 avg / 5 p95 cores, disk busy 33%, 12 GB (n=4) 3.5 avg / 6 p95 cores, disk busy 9%, 15 GB (n=3)

Data: runs 39522774727 and 39528120074 (attempts 1–3). 8-core: 39522227766 and 39539559733.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants