27 votes

Linux clock_gettime(CLOCK_MONOTONIC) comportement étrange non monotone

Les amis, dans mon application, j'utilise clock_gettime(CLOCK_MONOTONIC) afin de mesurer le delta de temps entre les images (une approche typique en gamedev) et de temps en temps, je suis confronté à un comportement étrange de clock_gettime(..) - les valeurs renvoyées ne sont parfois pas monotones (c'est-à-dire que le temps prévalent 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 de savoir comment cela peut être possible. Est-ce un bug dans l'implémentation POSIX de Linux de clock_gettime ? J'utilise Ubuntu Server Edition 10.04 (kernel 2.6.32-24, x86_64), gcc-4.4.3.

23voto

Dmitry Yudakov Points 6354

man clock_gettime dit :

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

Semblable à CLOCK_MONOTONIC, mais donne accès à une heure matérielle brute qui n'est pas soumise aux ajustements NTP.

Depuis CLOCK_MONOTONIC_RAW ne fait pas l'objet d'ajustements NTP, je suppose que CLOCK_MONOTONIC pourrait être.

Nous avons eu des problèmes similaires avec Redhat Enterprise 5.0 avec le noyau 2.6.18 et un processeur Itanium spécifique. 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 quelques correctifs Redhat.

21voto

Michael Foukarakis Points 14892

On dirait une instance de

commit 0696b711e4be45fa104c12329f617beb29c03f78
Author: Lin Ming <ming.m.lin@intel.com>
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 aquí pour un patch. Celui-ci a été inclus dans la version 2.6.32.19, mais n'a peut-être pas été rétroporté par l'équipe Debian ( ?). Vous devriez le vérifier.

6voto

Matt Joiner Points 29194

Essayez CLOCK_MONOTONIC_RAW .

4voto

caf Points 114951

Ça ressemble à un bug pour moi. Vous devriez peut-être le signaler dans Traqueur de bogues d'Ubuntu .

0voto

hdante Points 2192

C'est un bug linux. Aucun réglage d'une horloge monotone ne peut la faire reculer. Vous utilisez un très vieux noyau et une très vieille distribution.

Edit : êtes-vous sûr de vouloir sauter la trame ? Si vous appelez à nouveau clock_gettime, que se passe-t-il ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X