知识卡片
日历时钟与单调钟的用途分野及混用的危险
内容
现代计算机至少有两种性质完全不同的时钟,混用会带来隐患。日历时钟返回按公历计算的 当前日期和时间(自1970年UTC零点起的秒数),通常靠NTP和外部时间源保持同步,用来 标记”这件事发生在什么时刻”;但它有个危险特性——如果本地时钟和NTP服务器偏差太大, 可能会被强制重置,看起来就像时间突然跳回了过去(或跳向未来),这个跳变特性加上 常常忽略闰秒的事实,使得日历时钟不适合用来测量经过了多长时间。单调钟则专门为测量 时间间隔而生(超时判断、响应时间统计):它保证只会一直往前走、绝不会跳回,你可以 在两个时间点各读一次值,两次读数的差就是经过的时长——但单调钟的绝对值本身毫无意义 (可能只是开机以来的纳秒数),比较两台不同机器上的单调钟读数是没有意义的。NTP可以 让单调钟走得更快或更慢来做微调(偏移),但绝不会让它向前或向后跳变,这保证了它在 分布式系统里测量”经过时间”(比如超时判断)是相对安全的,因为它不依赖任何跨节点的 时钟同步假设,对轻微的不准确也不敏感。反过来,如果一段依赖时序安全性的代码错把 日历时钟当单调钟用来测量时间间隔,一旦发生NTP强制重置引发的跳变,整个逻辑的时序 假设就会被悄悄打破——这类问题往往不会崩溃报错,而是安静地产生错误结果,因此格外 危险。
参考来源
- 位置:《数据密集型应用系统设计》第八章《分布式系统的麻烦》"单调钟与日历时钟"
(源文件:_epub-src/ch8_split_002.html)
- 结论依据:原文说明日历时钟可能因NTP强制重置而跳变、因此不能用于测量经过时间,
单调钟保证只会向前走、适合测量时间间隔但绝对值本身无意义、跨机器比较无意义,
直接支撑本卡片对两种时钟用途分野的结论。
- 原始内容:如果本地时钟在NTP服务器之前太远,则它可能会被强制重置,看上去好像
跳回了先前的时间点……这些跳跃……使日历时钟不能用于测量经过时间……但单调钟的
绝对值是毫无意义的……特别是比较来自两台不同计算机的单调钟的值是没有意义的……
但NTP不能使单调时钟向前或向后跳转。