我遇到了一种非常奇怪的行为,我很难确定其来源,但假设它是计算机时钟。以下是设置和概要:
我的家庭网络上有两台计算机通过调制解调器连接到互联网。一台(计算机A)通过 RJ45 连接,另一个(计算机B) 通过 WLAN。两台机器都运行 Windows 10,并且在两台机器上我都有完全相同的应用程序堆栈:Postgresql 13 数据库和 Java 应用程序。
我正在使用 Java 应用程序通过 websocket 监控每隔几毫秒到达的事件。这些事件发布在互联网上的服务器上,并包含以毫秒为粒度的时间戳。
Java 应用程序解析消息并将其存储在 postgresql 表中。该表还包含一个字段,用于自动捕获插入时间(使用默认的 now())。
为了了解事件和数据库中记录之间的延迟,我对事件时间和插入时间进行了比较。计算机B(使用 WLAN 连接),我发现延迟约为 5 毫秒,这是完全可以接受的。计算机A然而,使用完全相同的软件堆栈,这种“延迟”令人惊讶地高,大约为 2 到 3 秒,并且变化很大。此外,在某些情况下,插入时间被记录为事件时间之前,这是不可能的,这让我相信这不是延迟问题,而是 postgresql 中的“now()”函数从计算机获取时间的问题。
使用http://time.is我检查了电脑时钟的准确性,确实计算机B,时间显示为“准确”,而计算机A显示有 0.7 秒的差异。重新同步时间也没有任何区别。然后我使用 NetTime 应用程序使用不同的同步方法,并注意到时钟报告为 28 毫秒,几秒钟后它就差了 -1 秒。换句话说,虽然我刚刚进行了同步,但它几乎立即再次不同步,并且在太慢和太快之间变化。
我主要担心的是第一台计算机(计算机 A)上的时间差或延迟,鉴于这些关于时钟变化的观察结果,加上软件堆栈 100% 相同的事实,我推测问题出在计算机时钟上。不幸的是,我不知道如何最好地验证这个假设,如果我是正确的,我甚至不知道如何解决这个问题,因为我从未听说过计算机时钟会表现出这样的行为。但是......可能是其他原因,我追错了兔子?可能是任何与 LAN 相关的问题,我该如何检查,因为没有其他明显的问题。
任何帮助将不胜感激。