nodejs / nodejs/node

performance.now() should jump after sleep/suspend/hibernation

Aperta
#47,724 9 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

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

Descrizione

Version

v18.14.2

Platform

Linux qubit 5.15.108-0-lts #1-Alpine SMP Fri, 21 Apr 2023 05:55:14 +0000 x86_64 GNU/Linux

Subsystem

perf_hooks

What steps will reproduce the bug?

In an interactive node session run:

function timeDelta() {
    // The delta should be approximately the same on each invocation (assuming the system time is unchanged).
    return Date.now() - performance.now();
};
const ref = timeDelta();
const before = timeDelta();

Now suspend and resume the machine / VM through whatever means. Then continue in the same node session:

const after = timeDelta();
console.log('BEFORE:', ref - before, 'AFTER:', ref - after);

Observe that the after value is incorrectly missing a number of seconds that matches the time the system was suspended. Eg. from my run:

BEFORE: -0.410888671875
AFTER: -7346.271728515625
How often does it reproduce? Is there a required condition?

100% (on Linux)

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

performance.now() is expected to jump with the realtime passed time while suspended according to the spec and https://github.com/w3c/hr-time/issues/115.

The https://github.com/mdn/content/issues/4713 issue also goes into detail on how the "Ticking During Sleep" applies to various platforms.

What do you see instead?

No jump during sleep. Eg. by using more suitable clock reference, as proposed implemented in https://github.com/libuv/libuv/issues/1674.

Additional information

The current performance.now() implementation is based on process.hrtime():

https://github.com/nodejs/node/blob/2ac5e9889aba461f5a54d320973d2574980d206b/lib/internal/perf/utils.js#L13-L16

This issue also seems to contain a lot of relevant context around a concrete problem: https://github.com/open-telemetry/opentelemetry-js/issues/852.

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 con lib/internal/perf/utils.js e l’implementazione di perf_hooks, che attualmente basa performance.now() su process.hrtime(). Esegui la sessione interattiva Node del report in corrispondenza della sospensione o della ripresa del sistema. Il lavoro è completato quando performance.now() avanza su Linux del tempo trascorso durante la sospensione, preservando al contempo il comportamento previsto di timeDelta.

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

Valutazione

Stack tecnologico
javascript, linux, node.js
Ambito
performance
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Attiva
Chiarezza
Abbastanza chiara
Idoneità per principianti
52/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.