Linux clock_gettime (CLOCK_MONOTONIC) strano comportamento non-monotono
Domanda
La gente, nella mia applicazione sto usando clock_gettime(CLOCK_MONOTONIC)
al fine di misurare il tempo delta tra fotogrammi (un approccio tipico gamedev) e di tanto in tanto io sono di fronte uno strano comportamento di clock_gettime(..)
- valori restituiti a volte non sono monotona (vale a dire prec. tempo di è più grande del tempo corrente).
Attualmente, se un tale paradosso avviene semplicemente saltare il frame corrente e avviare l'elaborazione successiva.
La domanda è: come può essere possibile a tutti? Si tratta di un bug nell'implementazione di Linux POSIX di clock_gettime
? Sto utilizzando Ubuntu Server Edition 10.04 (kernel 2.6.32-24, x86_64), gcc-4.4.3.
Soluzione
man clock_gettime
dice:
CLOCK_MONOTONIC_RAW (a partire da Linux 2.6.28; Linux-specifico)
Simile a CLOCK_MONOTONIC, ma fornisce l'accesso a un tempo grezzo basata su hardware che non è soggetto ad aggiustamenti NTP.
Dato CLOCK_MONOTONIC_RAW
non è oggetto di rettifiche di NTP, immagino CLOCK_MONOTONIC
potrebbe essere.
Abbiamo avuto problemi simili con Redhat Enterprise 5.0 con 2.6.18 del kernel e alcuni specifici del processore Itanium. Non siamo riusciti a riprodurlo con un altro processore sullo stesso sistema operativo. E 'stato fissato in RHEL 5.3 con un po' più recente kernel e alcune patch RedHat.
Altri suggerimenti
appare come un'istanza di
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
qui per una patch. Questo è stato incluso nella 2.6.32.19, ma potrebbe non essere stata backport dal team Debian (?). Si dovrebbe controllare.
Prova CLOCK_MONOTONIC_RAW
.
Certo suona come un insetto per me. Forse si dovrebbe riferire in di Ubuntu bug tracker .
E 'un bug di Linux. No ajustment in un orologio monotona può farlo andare all'indietro. Stai usando un kernel molto vecchio e una distribuzione molto vecchio.
Edit: Sei sicuro è necessario saltare il telaio? Se si chiama clock_gettime ancora una volta, che cosa succede?