Linux clock_gettime(CLOCK_MONOTONIC)奇怪的非单调行为

在我的应用程序中,我正在使用clock_gettime(CLOCK_MONOTONIC)来测量帧之间的时间差clock_gettime(CLOCK_MONOTONIC)中的一个典型方法),并且时不时地遇到clock_gettime(..)的奇怪行为 – 返回的值偶尔不是单调的(即前一次比现在 )。

目前,如果发生这样的矛盾,我只需跳过当前帧并开始处理下一个帧。

问题是,这怎么可能呢? 是clock_gettime Linux POSIX实现中的一个错误? 我正在使用Ubuntu Server版本10.04(内核2.6.32-24,x86_64),gcc-4.4.3。

man clock_gettime说:

CLOCK_MONOTONIC_RAW (自Linux 2.6.28; Linux专用)

与CLOCK_MONOTONIC类似,但可以访问不受NTP调整影响的原始硬件时间。

由于CLOCK_MONOTONIC_RAW不是NTP调整的主题,我猜CLOCK_MONOTONIC可能是。

我们在Redhat Enterprise 5.0 2.6.18内核和一些特定的Itanium处理器上遇到了类似的问题。 我们无法在同一操作系统上使用其他处理器进行复制。 在RHEL 5.3中修复了一些稍微更新的内核和一些Redhat补丁。

看起来像一个实例

 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 

看到这里的补丁。 这个包含在2.6.32.19中,但是可能没有被Debian团队支持(?)。 你应该检查一下。

尝试CLOCK_MONOTONIC_RAW

当然,听起来像是一个bug。 也许你应该在Ubuntu的bug跟踪器中报告。

这是一个Linux的错误。 在单调时钟中调整不能使其倒退。 你正在使用一个非常古老的内核和一个非常古老的发行版。

编辑:你确定你需要跳过框架? 如果再次调用clock_gettime,会发生什么情况?