Aller au contenu
Les horloges mentent : ce que ça casse dans votre codeLecture : 0 %

Les horloges mentent : ce que ça casse dans votre code

Quatre mensonges de l'horloge (elle recule, elle diffère d'une machine à l'autre, elle dépend d'un fuseau, elle confond le fait et sa saisie) et pour chacun la parade, son prix et le cas où l'on peut s'en passer.

Par Elias Varen7 min de lectureMembres

PHP
$start = microtime(true);
$response = $client->request('POST', $url, $options);
$elapsedMs = (microtime(true) - $start) * 1000;

Ce code peut mesurer une durée négative. Il suffit que le démon de synchronisation recale l'horloge de la machine entre les deux lignes. L'histogramme de latence reçoit −340 ms, le calcul de percentile l'avale, et le budget de timeout, calculé par soustraction, accorde à l'appel suivant plus de temps qu'il n'en restait.

C'est le plus petit des quatre mensonges. Une horloge système répond à la question « quelle heure croit-il être, ici, maintenant ? », et le code lui fait répondre à quatre autres : combien de temps s'est écoulé, lequel des deux événements est arrivé en premier, quel jour sommes-nous pour ce client, et depuis quand cette information est vraie. Chacune demande un autre outil.

Elle recule : durée et instant sont deux mesures

L'horloge murale est corrigée en permanence. La plupart du temps la correction est lissée, et parfois c'est un saut, en avant ou en arrière, après une reprise de machine virtuelle ou une longue désynchronisation. Elle sert à dater, et mal à mesurer.

Pour mesurer, le système expose une horloge monotone, sans signification absolue mais qui ne recule jamais.

PHP
$start = hrtime(true);                       // nanosecondes, monotone
$response = $client->request('POST', $url, $options);
$elapsedMs = (hrtime(true) - $start) / 1e6;

Côté navigateur, la même distinction sépare Date.now() de performance.now(). La règle tient en une ligne : un délai, un timeout, une expiration de cache locale, un backoff se calculent sur l'horloge monotone ; seul ce qui sera lu par un humain ou une autre machine se date sur l'horloge murale.

Le coût est faible, mais il existe, car une valeur monotone ne se sérialise pas. Elle n'a de sens que dans le processus qui l'a lue. Dès qu'une échéance traverse le réseau, on repasse par l'horloge murale, et donc par le mensonge suivant.

Les horloges mentent : ce que ça casse dans votre code · Deepstack