Since NTP 常见问题解答 http://twiki.ntp.org/bin/view/Support/KnownOsIssues#Section_9.2.2.具体说明了为什么 NTP 时间同步在虚拟机下无法“正常”工作,这可能是一个无法克服的问题。
大多数机器都有一个 RTC(实时时钟),在 PC 上它是您存储时间的方式,以便您可以“粗略”猜测时间,如果 ntp 不可用,一旦系统加载,就会出现“时钟的分辨率更高——这就是 NTP 设置的。
该滴答时钟会受到虚拟机漂移的影响,因为滴答可能会或可能不会以正确的间隔发生 - 您尝试使用的任何时间机制都将受到该漂移的影响。
如果机器 A 和 B 的增量为 200 毫秒,而机器 B 和 C 的增量为 200 毫秒,则 C 可能与 A 相差 400 毫秒,尝试在虚拟机上强制执行 ntp 同步可能是次优的设计。您无法控制这一点。
你最好使用像 Zeromq 这样的集中式消息系统来让每个人都与作业队列同步,这会增加开销,但依赖系统滴答时间充其量是一件狡猾的事情。有许多集群解决方案使用各种可靠的机制来考虑集群参与,以确保每个人都同步,看看 corosync 或 spread - 他们已经解决了诸如两阶段提交之类的问题。
顺便说一句,当漂移太高时 ntp“放弃”可以通过指示 ntp 将时间“猛击”到新值而不是“转换”来避免。默认情况下,ntp 将增量更新系统时间以解决其与“实时”的偏差。我忘记了如何在 ntpd 中配置它,但如果你使用 ntpdate,标志是 -B
-B Force the time to always be slewed using the adjtime(2) system call, even if the measured
offset is greater than +-128 ms. The default is to step the time using settimeofday(2) if the offset
is greater than +-128 ms. Note that, if the offset is much greater than +-128 ms in this case, it
can take a long time (hours) to slew the clock to the correct value. During this time, the host
should not be used to synchronize clients.