Linux clock_gettime(CLOCK_MONOTONIC) strano comportamento non monotono



gcc (4)

Personalmente, 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(..) - valori restituiti di tanto in tanto non sono monotoni (vale a dire che il tempo precedente è maggiore del tempo corrente).

Attualmente, se accade un tale paradosso, salterò semplicemente il frame corrente e inizierò a processare quello successivo.

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


È 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 dover saltare la cornice? Se chiami ancora clock_gettime, cosa succede?



Sembra un esempio 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

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


man clock_gettime dice:

CLOCK_MONOTONIC_RAW (da Linux 2.6.28; specifico per Linux)

Simile a CLOCK_MONOTONIC, ma fornisce l'accesso a un tempo basato sull'hardware grezzo non soggetto alle rettifiche NTP.

Poiché CLOCK_MONOTONIC_RAW non è soggetto alle regolazioni NTP, immagino CLOCK_MONOTONIC potrebbe essere CLOCK_MONOTONIC .

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.





clock