2010-09-07 10 views
25

Gente, nella mia applicazione sto usando clock_gettime(CLOCK_MONOTONIC) per misurare il tempo di delta tra i frame (un approccio tipico in gamedev) e di volta in volta sto affrontando uno strano comportamento di clock_gettime(..) - i valori restituiti di tanto in tanto non sono monotoni (ovvero l'ora precedente è maggiore rispetto all'ora corrente).Linux clock_gettime (CLOCK_MONOTONIC) strano comportamento non monotonico

Attualmente, se si verifica un simile paradosso, salterò semplicemente il fotogramma corrente e inizierò a elaborare quello successivo.

La domanda è: come può essere possibile? È un bug nell'implementazione Linux POSIX di clock_gettime? Sto usando Ubuntu Server Edition 10.04 (kernel 2.6.32-24, x86_64), gcc-4.4.3.

+0

Sei in esecuzione in un ambiente virtualizzato per caso? – caf

+0

No, nessuna virtualizzazione coinvolta – pachanga

risposta

22

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 a Aggiustamenti NTP.

Dal CLOCK_MONOTONIC_RAW non è oggetto di rettifiche di NTP, immagino CLOCK_MONOTONIC potrebbe essere.

Abbiamo avuto problemi simili con Redhat Enterprise 5.0 con kernel 2.6.18 e alcuni specifici processori Itanium. Non è stato possibile riprodurlo con altri processori sullo stesso sistema operativo. È stato corretto in RHEL 5.3 con kernel leggermente più recente e alcune patch Redhat.

+0

Grazie per il suggerimento Un'altra lezione per me - mai e poi mai assolutamente fidati anche delle librerie più affidabili :) – pachanga

+0

Interessante. Ma secondo http://markmail.org/thread/54bb663vi47kjxnu anche CLOCK_MONOTONIC non dovrebbe essere in grado di saltare. Quindi non dovrebbe sempre essere almeno in aumento? – Thomas

+0

Dice che l'orologio può ruotare (potrebbe andare indietro all'IIUC), quindi potrebbe diminuire. –

6

Prova CLOCK_MONOTONIC_RAW.

4

Certo, suona come un insetto. Forse dovresti segnalarlo in Ubuntu's bug tracker.

+5

I tracker di bug sono belli, così come l'invio di bug (che tutti dovrebbero fare), ma sono impopolari perché i programmatori vogliono delle correzioni ORA. Generalmente i bug di upstream non vengono risolti molto tempo dopo aver terminato la codifica della maggior parte di un progetto, e devi supportare persone che non hanno aggiornato le librerie a monte per un lungo periodo di tempo. :( –

+0

Così triste, così vero ... – pachanga

21

Sembra un caso di

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 

Vedere here per una patch. Questo è stato incluso in 2.6.32.19, ma potrebbe non essere stato backportato dal team Debian (?). Si dovrebbe controllare.

-1

È un bug di Linux. Nessun aggiustamento in un orologio monotono può farlo andare indietro. Stai usando un kernel molto vecchio e una distribuzione molto vecchia.

Modifica: sei sicuro di aver saltato la cornice? Se chiami ancora clock_gettime, cosa succede?