8

我们有一个大型的高性能软件系统,它由多个交互的 Java 进程(不是 EJB)组成。每个进程可以在同一台机器上,也可以在不同的机器上。

某些事件在一个进程中生成,然后以不同的方式传播到其他进程以进行进一步处理等等。

出于基准测试的目的,我们需要创建每个事件何时通过“检查点”的日志,最终将这些日志组合起来以获得每个事件如何通过系统传播以及延迟多少的时间线(当然,进程切换和 IPC 添加延迟,没关系)。

当然,问题在于时钟同步。所以这是我的问题:

1)如果所有进程都在同一台机器上,是否保证 currentTimeMilis 在调用时是准确的?ITP的错误有一定的界限吗?

2)如果某些进程可能在不同的机器上,是否有用于时钟同步的现成解决方案(也是免费或开源的)?我最好寻找一种可以绕过操作系统(Windows 或 Linux)并直接从 Java 工作的解决方案。我还理想地寻找可以以微秒精度运行的东西。我考虑过 NTP,但我不确定它是否可以通过 Java 而不是通过操作系统获得,而且我不确定它的复杂性。

3)有没有办法确定在特定配置(或我最终使用的任何解决方案)中使用 NTP 的误差范围,以便我可以在计算延迟时给出误差范围?

谢谢!

4

4 回答 4

4

对于分布式编程,时钟同步通常是不够的。您可能想要构建一个逻辑时间框架(例如 Lamport 或矢量时钟或 Singhal-Kshemkalyani 方法......并且还有更多负载可以使机器之间的因果关系保持同步)。您选择哪种通常取决于应用程序和事件之间所需的因果关系。

时钟是同步的,以确保并发事件保持正确的顺序。除了保持系统时钟同步之外,还有其他方法可以做到这一点……除非它们共享一个共同的物理时钟……这非常棘手。

在NTP误差范围方面,有解决方案:

我的建议:

阅读: 分布式计算:原理、算法和系统

特别是:第3章,逻辑时间

编辑

在 Cheeso 的帖子之后,我发现

http://www.uniforum.org/publications/ufm/apr96/opengroup.html

http://sourceforge.net/projects/freedce

那里可能有 DCE Java 绑定。

于 2009-06-02T13:48:06.623 回答
2

我真的只是使用NTP。即使在互联网上也非常准确,在局域网上应该会更好。根据维基百科[ 1 ],

NTPv4 在公共互联网上的时间通常可以保持在 10 毫秒(1/100 秒)以内,在理想条件下,在局域网中可以达到 200 微秒(1/5000 秒)或更好的精度。

因此,如果您的条件足够“理想”,它可能足以满足您的需求。NTP 已经存在了足够长的时间,几乎所有东西都可以使用它。我认为没有任何理由通过 Java 而不是操作系统来做到这一点。如果操作系统已同步,Java 也会同步。

[1]维基百科:网络时间协议

于 2009-06-02T14:53:54.073 回答
1

我自己尝试了一些东西后遇到了这个线程(应该先搜索!) http://snippets.dzone.com/posts/show/11345 - 可能是一个好方法,可能是坏方法,但它是分布式的(无服务器)很好。

于 2010-05-14T21:25:12.847 回答
0

旧的DCE(“分布式计算环境”)曾经有一个分布式时间同步解决方案,具有所有这些功能。它被称为 DTS。管理员可以将一组机器配置为同步,计算延迟或不确定性并使其可用。如果任何机器不同步,它的时钟会慢慢调整,直到它再次同步。保证任何机器上的时间都不会向后调整(违反基本物理学)。网络需要至少一个 NTP 输入才能与“现实世界”保持同步。

我不知道那个时间同步的东西,或者一般的 DCE 代码发生了什么。

在我看来,您不需要“Java”解决方案。您需要同步一组分布式机器的时钟。Java 应用程序只是在机器上运行的东西。

于 2009-06-02T13:48:57.777 回答