tv_nsec Linux clock_gettime(CLOCK_MONOTONIC) comportement étrange non monotone




tv_nsec (4)

man clock_gettime dit:

CLOCK_MONOTONIC_RAW (depuis Linux 2.6.28; spécifique à Linux)

Similaire à CLOCK_MONOTONIC, mais donne accès à une heure matérielle brute non soumise aux ajustements NTP.

Puisque CLOCK_MONOTONIC_RAW n'est pas soumis aux ajustements NTP, je suppose que CLOCK_MONOTONIC pourrait l'être.

Nous avons rencontré des problèmes similaires avec Redhat Enterprise 5.0 avec le noyau 2.6.18 et certains processeurs Itanium spécifiques. Nous n'avons pas pu le reproduire avec d'autres processeurs sur le même système d'exploitation. Il a été corrigé dans RHEL 5.3 avec un noyau légèrement plus récent et certains correctifs Redhat.

Les gens, dans mon application, j'utilise clock_gettime(CLOCK_MONOTONIC) afin de mesurer le temps de delta entre les frames (une approche typique dans gamedev) et de temps en temps je suis confronté à un comportement étrange de clock_gettime(..) - valeurs retournées de temps en temps ne sont pas monotones (c.-à-d. que le temps précédent est plus grand que l'heure actuelle).

Actuellement, si un tel paradoxe se produit, je saute simplement l'image actuelle et commence à traiter la suivante.

La question est comment cela peut-il être possible du tout? Est-ce un bogue dans l'implémentation Linux POSIX de clock_gettime ? J'utilise Ubuntu Server Edition 10.04 (noyau 2.6.32-24, x86_64), gcc-4.4.3.


Essayez CLOCK_MONOTONIC_RAW .


Ressemble à une instance de

commit 0696b711e4be45fa104c12329f617beb29c03f78
Author: Lin Ming <[email protected]>
Date:   Tue Nov 17 13:49:50 2009 +0800

timekeeping: Fix clock_gettime vsyscall time warp

Since commit 0a544198 "timekeeping: Move NTP adjusted clock
multiplier to struct timekeeper" the clock multiplier of vsyscall is updated with
the unmodified clock multiplier of the clock source and not with the
NTP adjusted multiplier of the timekeeper.

This causes user space observerable time warps:
new CLOCK-warp maximum: 120 nsecs,  00000025c337c537 -> 00000025c337c4bf

Voir here pour un patch. Cela a été inclus dans 2.6.32.19, mais peut ne pas avoir été backporté par l'équipe Debian (?). Tu devrais y jeter un coup d'oeil.






clock