Summary
On a constrained CI runner (GitHub ubuntu-24.04-arm), vp run <task> fails with:
✗ Failed to spawn process: Resource temporarily unavailable (os error 11)
os error 11 is EAGAIN, the OS refusing a new process/thread because a per-user limit (RLIMIT_NPROC, which counts threads) is exhausted. This started after upgrading to vite-plus 0.2.2.
Where it comes from
The failing task is a plain Node script with no vite-plus/native import:
'i18n:check': { command: 'node scripts/compare-translations.ts' }
The script itself runs to completion (it prints thousands of lines of output); the failure is raised by the vp run wrapper's native runtime. Two independent changes each make it pass, which points at vp run's per-task cache bookkeeping:
cache: false on the task → passes.
- Running the command directly (
node scripts/compare-translations.ts, bypassing vp run) → passes.
Ruled out:
- Not the task's work: the script exits 0 and writes nothing extra.
- Not cross-task concurrency: it fails even when the task runs alone (serialized).
- Not the rayon pool:
RAYON_NUM_THREADS=2 and ROLLDOWN_MAX_BLOCKING_THREADS=2 did not help.
So the cache path appears to spawn a CPU-sized (or unbounded) set of threads/processes to hash inputs/outputs, and hard-fails with EAGAIN when the runner's RLIMIT_NPROC is low.
Expected
vp run's cache bookkeeping should stay within a bounded thread/process count and degrade gracefully (or fall back to running uncached) instead of aborting with a hard EAGAIN. Ideally expose a knob to cap the worker count.
Environment
- vite-plus /
vp: 0.2.2
- Runner: GitHub Actions
ubuntu-24.04-arm
- Node:
lts/* (24)
Repro / evidence (in npmx.dev)
Workaround
Set cache: false on the affected task (also appropriate here since the audit script writes files, so caching never helped).
Summary
On a constrained CI runner (GitHub
ubuntu-24.04-arm),vp run <task>fails with:os error 11isEAGAIN, the OS refusing a new process/thread because a per-user limit (RLIMIT_NPROC, which counts threads) is exhausted. This started after upgrading to vite-plus0.2.2.Where it comes from
The failing task is a plain Node script with no vite-plus/native import:
The script itself runs to completion (it prints thousands of lines of output); the failure is raised by the
vp runwrapper's native runtime. Two independent changes each make it pass, which points atvp run's per-task cache bookkeeping:cache: falseon the task → passes.node scripts/compare-translations.ts, bypassingvp run) → passes.Ruled out:
RAYON_NUM_THREADS=2andROLLDOWN_MAX_BLOCKING_THREADS=2did not help.So the cache path appears to spawn a CPU-sized (or unbounded) set of threads/processes to hash inputs/outputs, and hard-fails with EAGAIN when the runner's
RLIMIT_NPROCis low.Expected
vp run's cache bookkeeping should stay within a bounded thread/process count and degrade gracefully (or fall back to running uncached) instead of aborting with a hard EAGAIN. Ideally expose a knob to cap the worker count.Environment
vp: 0.2.2ubuntu-24.04-armlts/*(24)Repro / evidence (in npmx.dev)
cache: false): https://github.com/npmx-dev/npmx.dev/actions/runs/28701691091Workaround
Set
cache: falseon the affected task (also appropriate here since the audit script writes files, so caching never helped).