故事
崇祯十七年,漏刻司的两座钟,一座看星象,一座看水滴,各自走得稳当,却在一夜之间差出了一个时辰。
漏刻司掌管皇家计时,正堂悬着一座自鸣钟,是万历年间利玛窦进贡的西洋器物,每日误差不过一刻。司里又设铜壶滴漏为备,以水位定时辰,百年未改。两器对照,互为勘验,本是极稳当的差事。
那日五更,司官周德昌被急促的梆子惊醒。太监来传话,说皇上所在的寝殿的时辰错了——皇上按钟点起身,却发现天还未亮,星斗尚在正南。
周德昌奔到司里,自鸣钟指着寅时三刻,铜壶漏却停在丑时末。差了一整个时辰。他命人查验,钟的齿轮完好,漏的水流正常,两器各自走得稳稳当当,只是彼此越走越远。
原来三日前的雷雨,击中了司房屋顶的避雷针——也是西洋传来的物件——电流顺着铜线窜入自鸣钟的机括。钟没停,却跳了一瞬:雷击的刹那,齿轮猛地一挫,向后退了七齿,又继续向前。这七齿的倒退,让钟比真实时间慢了约一刻,且慢得无声无息。
铜壶漏没有雷击,继续走它的。三日累积,两器岔开了一个时辰。皇上按错的钟起身,按对的漏上朝,便撞见了未亮的夜空。
周德昌想校准,却发现更大的麻烦:以谁为准?自鸣钟有西洋的精确,却遭过雷击;铜壶漏百年老实,却粗糙易冻。他派人去钦天监对星象,又去鼓楼听更鼓——更鼓也是人敲的,那夜敲更的老卒恰好在钟慢的那一刻打了盹,更点本身就乱了。
—
周德昌在司里坐了整夜,把两具时钟拆成零件。
自鸣钟的齿轮上,他找到了那道挫痕——雷击的印记。齿轮的齿距极匀,挫痕却让它在某一点上突然回跳。这种回跳不是停走,停走至少能被察觉;它是伪装成正常的异常,直到与另一套系统对照才暴露。
铜壶漏更麻烦。它没有挫痕,却有漂移:水温、气压、壶壁的苔藓厚度,都让流速渐变。这种漂移极慢,单日看不出,累积百日便差出半个时辰。它是系统性的谎言,每一刻都诚实,合起来却骗人。
周德昌忽然明白,漏刻司真正的职责不是"报时",而是怀疑时。两具时钟不是为了互相备份,是为了互相揭发。只有对照,才能发现各自的失败模式:钟怕雷击跳变,漏怕环境漂移。单一系统无论多精密,都藏着自己看不见的盲区。
他写了一份揭帖,建议司里增设第三具时钟——不必更精,只要异质。比如日晷,它怕阴天,却不怕雷击;比如燃香,它怕风,却不怕水冻。多种失败模式互相覆盖,才能逼近那个看不见的"真时"。
这份揭帖没来得及施行。三月,李自成破城,漏刻司的钟和漏都停了。
但揭帖被人从灰烬里拾出,抄进一本叫《时宪残录》的私人笔记。里头那段话后来常被引用:
「一器之准,不可为准;二器相参,可察其失;三器异质,乃近真时。雷击、冻裂、阴翳、风折,各害其所害,亦各保其所保。」
周德昌当初想设第三具时钟,不是为了更精确,是为了让失败模式互相覆盖——钟怕雷击,晷怕阴天,香怕风,没有哪一种灾难能同时毁掉三者。这种「异质冗余」的思路,三百年后在计算机系统里重新出现:GPS 授时、原子钟、晶振析
NTP 与 PTP 并行,日志里既写本地时间戳也写逻辑序列号。
钟和漏停了,但「分布式系统里的节点各自有物理时钟——主板上的晶振、NTP 同步后的系统时间、或者 PTP 硬件戳。这些时钟的失败模式各不相同,却都不可信任。
跳变(Clock Jump)。 NTP 同步时,如果本地时钟与服务器差距过大,NTP 会选择"步进"而非"微调"——直接把时间拨过去。这像雷击后的齿轮回跳:进程看着墙上时间突然倒退或跃进,因果倒置。数据库的 MVCC 依赖时间戳定序,一次跳变可能让"后发生的事"拿到"更早的戳",一致性崩塌。
漂移(Clock Drift)。 晶振的频率受温度、电压、老化影响,每日误差可达毫秒级甚至秒级。两个节点起初对准,各自走各自的,百日后差出数秒。这种漂移是单调的、累积的、无声的——像铜壶漏的水温渐变——直到某次超时判断或缓存过期突然出错才暴露。
闰秒。 为协调原子时与地球自转,UTC 偶尔插入一秒。有的系统把它"抹平"(23:59:59 持续两秒),有的"跳跃"(直接跳过)。2012 年 Reddit、LinkedIn、Qantas 的宕机,皆因闰秒处理分歧:一部分代码看见 23:59:60,另一部分没看见,集群内部的时间共识瞬间碎裂。
PTP 的幻觉。 Precision Time Protocol 用硬件时间戳把同步精度压到亚微秒,看似解决了问题。但它依赖网络拓扑对称、边界时钟可靠——这些条件在云上往往不成立。PTP 不是"更准的 NTP",是另一种失败模式:它漂移更小,却可能在拓扑变化时突然跳变,且更难察觉。
工程上的应对。 现代系统很少直接信任物理时钟。Spanner 的 TrueTime 返回时间区间而非单点;CockroachDB 用 HLC 把物理时间仅作参考,逻辑时钟定因果;Lamport 时钟干脆放弃物理时间,只追踪"发生在前"的关系。
周德昌的第三具时钟,正是工程上的时钟异构——用单调时钟(monotonic clock)测间隔,用 wall clock 对绝对时间,用逻辑时钟定因果。没有一种时钟能单独胜任,唯有对照,才能逼近真时。