使用NTP进行事件同步
我想要在两台(或更多)通过有线网络连接的Linux机器之间同步两个事件。我可以用NTP来实现这个吗?
NTP主要是用来和时间服务器同步的,而我需要的是让两台机器彼此同步。这之间有点细微的区别。例如,如果一台机器离时间服务器的距离只有另一台的一半,那么直接让这两台机器互相同步,可能会比让它们都去同步时间服务器更有效。
还有一个稍微不同的问题:如果我使用NTP,安排事件的最佳方式是什么?是用cron作业还是at脚本?如果我使用像这个库,能否实现更好的(小于一秒)同步?
最后,有人知道适合让两台(或更多)机器之间同步的时间同步软件包吗?不一定要同步到时间服务器。
谢谢大家的帮助。
2 个回答
你们的主机之间的ping延迟变化有多大?协调的进程之间允许有多大的启动时间差?你打算怎么启动这些进程?使用cron来定时任务的精确度很差,进程的启动时间也需要考虑进去。
如果不同主机的ping时间差异很大,我会采取以下措施:
在事件发生前的几分钟,使用一个可靠的公共NTP服务器来同步所有协调主机的时钟。对于频繁的事件,每天同步3-4次就足够了。
使用像
cron
这样精度较低的调度器,提前2-3分钟,启动一个简单的包装脚本,这个脚本会wait()
,直到事件开始前15秒。然后这个包装脚本会以比正常更高的优先级启动目标应用程序。应用程序加载(磁盘访问和动态链接速度较慢),读取所需的数据文件,进行所有耗时的计算等等。然后它会使用
usleep()
和ftime()
或gettimeofday()
等方法,精确到毫秒地等待,直到事件开始的那一刻,这个过程放在fireLasersAtTheMoon()
或你要执行的目标动作之前。
显然,对于那些本身就不精确的操作,比如网络通信,进行如此精确的同步是没有意义的。如果你的网络延迟是可预测的,你可以通过测量ping
的往返时间来了解它,并在一台主机上创建一个主进程,通过ssh向其他主机发送启动命令,同时考虑到延迟。
你可以试着把一台机器当作主控机,其他的机器当作从机。当需要同步的事件发生时,主控机会发出指令,让从机开始工作。
这种同步的速度只会受到机器之间延迟(也就是网络反应时间)的影响,你就不用担心系统时钟是否一致的问题了。