以编程方式检查Linux时钟的健全性

以编程方式检查Linux时钟的健全性,linux,Linux,我在JVM/Linux上有一个生产系统,它依赖于system.nanoTime和system.currentTimeMillis。我曾经遇到过这样的情况,NTP完全弄乱了转换,因此时钟运行速度比实时快或慢(而且转换会影响前面提到的两种Java方法) 如何最好地监控nanoTime和currentTimeMillis以接近正确的速度运行?我想定期测量这些方法中的增量,并将它们与同一时期的“已知”增量进行比较。什么是“已知”三角洲的可靠来源?C/C++解决方案很好。可靠的时间来源,尤其是在虚拟机上,

我在JVM/Linux上有一个生产系统,它依赖于
system.nanoTime
system.currentTimeMillis
。我曾经遇到过这样的情况,NTP完全弄乱了转换,因此时钟运行速度比实时快或慢(而且转换会影响前面提到的两种Java方法)


如何最好地监控
nanoTime
currentTimeMillis
以接近正确的速度运行?我想定期测量这些方法中的增量,并将它们与同一时期的“已知”增量进行比较。什么是“已知”三角洲的可靠来源?C/C++解决方案很好。

可靠的时间来源,尤其是在虚拟机上,必须位于计算机外部。我假设您无法访问专门的硬件(如原子钟或GPS接收器),因此下一个最佳选择是NTP。找到附近的NTP服务器,通过系统时钟读取“之前”时间,通过NTP获取时间,并读取时钟的“之后”读数。将“之前”和“之后”的平均值与NTP值之间的差异进行比较。您不应该期望差异为零(您的网络延迟可能在两个方向上都不相同,等等)。监控随时间变化的差异。我预计变化趋势会下降,但如果你看到趋势以任何程度的信心增加(或减少),那么你可能会有一个混乱的时钟。

你怎么知道它们不是?顺便说一句,考虑到网络速度,NTP试图使你的时间与另一个时钟保持同步。它必须稍微加快/减慢速度,以保持两者的同步。我想这并不重要,只要值很小且恒定。同时,在实时系统中使用JVM(即依赖非常精确的计时)从一开始可能不是一个好的解决方案。我不需要像原子钟这样可靠的时间源(昂贵,或者依赖于NTP的正确配置),我只需要知道我可以信任哪些硬件计时器不会随NTP改变频率(每天休息几秒钟是可以的,我只是在寻找巨大的偏差)。我读过关于rdtsc是不变的,但我想知道这是否真的合适。