nodejs / nodejs/node

Increased CPU utilization after upgrading from Node.js v20.20.0 to v22.x

Aperta
#62,939 8 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

stale
Lingua principale
JavaScript
Stelle
122k
Fork
37.3k
Merge medio
4g 2h
PR unite (30g)
283

Descrizione

Version

v22.22.0 / v22.22.2 / 24.15.0

Platform
Oracle Linux 8 latest
Subsystem

No response

What steps will reproduce the bug?
  1. Run workload on Node.js v20.20.0 → CPU ~68–70%
  2. Upgrade to Node.js v22.22.x or 24.15.0
  3. Run identical workload (same TPS, config)
  4. Observe CPU increase (~86–88%)
  5. Revert to v20 → CPU returns to baseline
How often does it reproduce? Is there a required condition?

consistently 100% reproducable

What is the expected behavior? Why is that the expected behavior?

no bigger than 5% CPU degradation

What do you see instead?

20% CPU degradation

Additional information

We are observing a significant increase in CPU utilization after upgrading our runtime from Node.js v20.20.0 → v22.x (22.22.x), with no application-level changes.

A/B testing strongly indicates the regression is tied to the Node.js runtime upgrade rather than application logic.

Impact

  • ~20% relative CPU increase observed
  • Consistent across multiple test runs
  • No functional regression, but clear performance degradation

Environment

  • Node.js versions:
    • v20.20.0 (baseline)
    • v22.22.0 / v22.22.2
  • Workload:
    • High-throughput service (~17–18K TPS)
    • Distributed/multi-node setup
  • Runtime flags:
    • --max-semi-space-size=256
    • --max-old-space-size=3072

Observed Behavior

Scenario Node Version CPU Utilization
Baseline v20.20.0 ~68–70%
Upgraded runtime v22.22.x ~86–88%
v22.x + --max-semi-space-size=16 v22.22.x ~88%
Reverted runtime v20.20.0 ~68%

Key Findings

  1. Strong correlation with Node.js version

    • Reverting v22 → v20 reduces CPU by ~12–20%
    • No application changes between runs
  2. Memory tuning did not help

    • Adjusting --max-semi-space-size showed no improvement
    • Lower values increased GC frequency without reducing CPU
  3. Latest v22 versions do not fix the issue

    • Testing with v22.22.2 shows same behavior
  4. Maglev likely not the cause

    • Disabled by default in Node ≥22.9.0
    • Issue persists on versions where Maglev is disabled

What Was Ruled Out

  • Application-level regression
  • Load/TPS variation
  • GC tuning via semi-space adjustments
  • Early v22-only issues

Suspected Cause

Likely related to runtime-level changes introduced in Node.js v22, such as:

  • V8 upgrade (v11.x → v12.x)
  • JIT execution changes
  • GC or memory management differences
  • libuv / stream internal changes

Reproduction Steps (High-level)

  1. Run workload on Node.js v20.20.0 → CPU ~68–70%
  2. Upgrade to Node.js v22.22.x
  3. Run identical workload (same TPS, config)
  4. Observe CPU increase (~86–88%)
  5. Revert to v20 → CPU returns to baseline

Additional Notes

  • No explicit Node.js release notes mention this regression
  • Issue is reproducible under high throughput
  • Not observed in lower TPS environments (≤5–7K TPS)

##Questions##

  • Are there known CPU regressions or behavior changes in Node.js v22 / V8 12.x?
  • Are there recommended runtime flags or GC tuning options for high-throughput workloads in v22?
  • Any guidance on mitigating CPU increase when upgrading from v20 → v22?
  • Will an upgrade to the latest available version of Node.js v26 fix this issue?

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia riproducendo il workload ad alto throughput segnalato su Node.js v20.20.0 e v22.22.x con Oracle Linux 8 e i flag di memoria elencati, mantenendo identici TPS e configurazione. Confronta l’utilizzo della CPU e documenta un workload minimo e riproducibile oppure isola la modifica del runtime responsabile; nell’issue non sono indicati file sorgente né test.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
javascript, linux, node.js
Ambito
backend, performance
Tipo di issue
Bug
Difficoltà
5/5
Tempo stimato
Più di una settimana
Stato di attività
Attiva
Chiarezza
Da chiarire
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.