如何测量和防止时钟漂移?


15

在几个生产平台上,我们已经观察到症状,这些现象似乎表明一天中的时钟周期性地向前或向后跳跃。跳跃通常在1秒钟左右,通常会被抵消(向前跳跃然后在很短的时间内向后跳跃),每天大约发生50次。在应用程序使用高峰期以及磁盘I / O操作频繁(例如日常备份)期间,这种变化最为明显。这些漂移正在影响我们的软实时敏感应用程序。

系统是运行带有默认内核3.0.58-0.6.6-SLES 11SP2的Oracle Netra X4250和Netra X4270服务器。

$ cat /sys/devices/system/clocksource/clocksource0/available_clocksource
tsc hpet acpi_pm

$ cat /sys/devices/system/clocksource/clocksource0/current_clocksource
tsc

我们已禁用NTP,但这对漂移没有任何影响。是否有用于测量一天中时钟漂移的工具?我们如何避免这种情况?

这些是生产平台,我们无法在实验室中重现该问题,因此我的实验能力受到限制。如果留给我自己的设备使用,我将编写一个测量漂移的工具,并可能尝试使用HPET时钟源。


5
禁用NTP会使时钟变得更加不稳定...我能看到NTP不使时钟保持一致的唯一原因是时钟已失控,并且NTP拒绝对其进行更新(请参阅ntpdate(8)ntpd(8))。
vonbrand 2014年

1
NTPD可以跟踪并纠正时钟漂移,但是您所拥有的并不是漂移。随着时间的流逝,漂移始终沿相同的方向一致。如果它随机地向前和向后跳跃,则无法预测它并适应它。
帕特里克

1
@Patrick说的是正确的,您描述的问题是每天多次不连续地向前和向后跳跃。NTP在漂移方面效果很好,但是在此方面没有太大帮助。有可能将您的系统日期重置为某个可能只有1秒分辨率的外部时间源。如果您的服务器是x86 *,则硬件RTC可能是源,某些cron作业可能是罪魁祸首。只要使用良好的第1层时钟参考,就测量Bratchley的ntpdate答案是一种合理的方法:每分钟运行一次并gnuplot图片的结果。
duanev

1
运行在新服务器(drdobbs.com/embedded-systems/…)上的NTP评估评估。学习新晶体需要NTP时间。对于真的很差的晶体,NTP在训练时必须多次“步调”时钟(请参见该文章中的图4和5)。ntp.drift的最终值为118ppm,是每天10秒或每30分钟208ms。尽管这不是OP所见,但NTP 最初可能会引起时间上的明显跳跃。
duanev 2015年

Answers:


8

是否有用于测量一天中时钟漂移的工具?

我知道的唯一工具应该是NTP工具。您不必将ntpd实际配置为与给定的时钟源同步,您只需使用该-d选项ntpdate即可获取计算出的偏移量。

例:

[davisja5@xxxadmvlm08 ~]$ ntpdate -d clock.redhat.com 2>/dev/null | egrep "^offset"
offset -0.004545
[davisja5@xxxadmvlm08 ~]$

-d 是调试选项,它可以在不实际触摸系统时钟的情况下执行NTP。

关于如何避免这种情况的任何建议?

对于您无法在开发/测试环境中重现此内容,我并不感到惊讶,因为它可能仅是由于硬件时钟造成的。如果您在某人的支持下获得硬件支持,我将尝试为您的机器提供服务。一种可能性是将用于该生产机器的一台开发机器进行交易,修复以前的PROD系统,然后将其重新引入为一台开发机器,以替换现在PROD中的一台。

除此之外,切换硬件时钟源几乎是您所能做的。如果您不愿意或不能完成交换,我建议您一定要走hpet路线。您可以测试时钟源更改是否与系统服务混为一谈,然后将其部署为生产环境。


“测量时钟漂移”并不是说从参考时间源漂移,例如NTP给您的漂移。我的意思是一种可以在连续时间范围内检测时钟中“跳跃”的工具。例如,每隔50ms进行一天中的时间采样,并报告与上一次采样的差值是否与50ms相差太远。这样的工具将显示一天中的时钟是否由于任何原因偏离了基础硬件时钟。
布雷特2014年

1
这样的干预是否会导致性能下降超过您希望解决的程度?不过,很可能这是硬件问题,因此您需要维修硬件或使用时钟源而不会出现此问题。tsc是基于CPU的,因此有意义的是,较高的CPU活动始终会触发硬件时钟问题。如果hpet对您来说足够快,那么您可能只需要尝试一下,获得服务或执行交换操作即可。这些是我为您看到的唯一选择。
布拉奇利2014年

3

一种解决方案是使用 HPET

另请参见高精度事件计时器

要将其设置为引导参数,请使用

clocksource=hpet

在较旧的硬件上,TSC它通常是不稳定的,并且已被内核禁用。

随着多核/超线程CPU,具有多个CPU的系统以及休眠操作系统的问世,无法依靠TSC来提供准确的结果...

维基百科:时间戳计数器


在表现出时钟抖动症状的生产系统上,我将时钟源切换为hpet。这对观察到的时钟抖动症状没有影响。
布雷特2014年

HPET是外部硬件计时器,不会抖动。因此,这种解决方案似乎是一条错误的道路。旧硬件存在很多定时问题,尤其是在使用虚拟化时。您是否也使用其他软件进行了检查?

1

我编写了一个更详细的工具,将时钟测量结果与我们的应用程序显示的延迟症状相关联。这个工具似乎可以排除我先前怀疑的Linux时间时钟抖动。

长话短说,我最初的假设是无效的。但是我从答案和链接中学到了很多有关Linux时钟的知识,所以感谢所有回答!


3
(...)我最初的假设是无效的,那么您能告诉我们真正的原因是什么?
Piotr Dobrogost'3

0

除非有人更改时钟,否则时钟不应该单调吗?向后跳转应该是不可能的。必须设置时钟-cron作业或其他守护程序(例如对的调用hwclock --adjust)。我确实记得ntp本身会更新漂移的统计信息并定期对其进行补偿,如果长时间不运行ntp并获得了巨大的补偿,那么如果不重置它会浪费几天的时间/etc/adjtime。您可能会进行类似的设置-会定期重新调整时间漂移(并导致跳跃)。

ntp 实际上是为了解决这个问题。


那也是我的想法。我对硬件时钟源的阅读表明,计数器应单调递增。如果那是真的,最糟糕的是,我们应该观察到不稳定的滴答声速率,但是永远不要跳回去。在多处理器系统上,我知道tsc需要在处理器之间同步-也许这是导致向后跳转的原因?
布雷特2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.