Windows Azure上的时钟同步质量?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows Azure上的时钟同步质量?相关的知识,希望对你有一定的参考价值。

我正在寻找Windows Azure上虚拟机之间时钟偏移的定量估计 - 假设所有虚拟机都托管在同一个数据中心。我猜测一个VM和另一个VM之间的平均时钟偏移低于10秒,但我甚至不确定它是Azure云的保证属性。

有没有人对此事进行定量测量?

答案

我终于决定自己做一些实验了。

关于实验方案的一些事实:

  • 我没有查找参考时钟的偏移量,而是简单地检查了Azure VM和Azure存储之间的时钟差异。
  • 已使用下面粘贴的HTTP hack检索Azure存储的时钟时间。
  • 已经在Azure的北欧数据中心内使用250个小型VM进行了测量。
  • 对于简约的未经身份验证的请求,使用Stopwatch测量的存储和VM之间的延迟始终低于1ms(基本上HTTP请求返回400个错误,但仍然在HTTP头中提供Date:)。

结果:

  • 大约50%的VM对存储的时钟偏移大于1秒。
  • 大约5%的VM对存储的时钟偏移大于2s。
  • 时钟偏移的观测结果不到1%,接近3s。
  • 手足差距接近4s。
  • 单个VM与存储器之间的时钟偏移通常在一个请求与下一个请求之间变化+ 1 / -1。

从技术上讲,我们距离2s容差目标并不太远,但对于数据中心内同步,您不必将实验推向远近观察接近4s的偏移。如果我们假设时钟偏移的正常(又称高斯)分布,那么我会说依赖于低于6s的任何时钟阈值必然会导致调度问题。

/// <summary>
/// Substitute for proper NTP (Network Time Protocol) 
/// when UDP is not available, as on Windows Azure.
/// </summary>
public class HttpTimeChecker
{
    public static DateTime GetUtcNetworkTime(string server)
    {
        // HACK: we can't use WebClient here, because we get a faulty HTTP response
        // We don't care about HTTP error, the only thing that matter is the presence
        // of the 'Date:' HTTP header
        var tc = new TcpClient();
        tc.Connect(server, 80);

        string response;
        using (var ns = tc.GetStream())
        {
            var sw = new StreamWriter(ns);
            var sr = new StreamReader(ns);

            string req = "";
            req += "GET / HTTP/1.0
";
            req += "Host: " + server + "
";
            req += "
";

            sw.Write(req);
            sw.Flush();

            response = sr.ReadToEnd();
        }

        foreach(var line in response.Split(new[] { '
', '
' }, StringSplitOptions.RemoveEmptyEntries))
        {
            if(line.StartsWith("Date: "))
            {
                return DateTime.Parse(line.Substring(6)).ToUniversalTime();
            }
        }

        throw new ArgumentException("No date to be retrieved among HTTP headers.", "server");
    }
}
另一答案

我最近与Azure产品团队的人就时钟同步进行了对话,更多的是出于兴趣而不是其他任何事情。我收到的最新回复是:

虚拟机和服务在启动时直接从底层Hyper-V平台消耗时间,从那时起,服务维护时钟。为了在分布式系统中实现真正的时间同步,您需要在应用程序层和/或引用单个时间服务器的服务上执行此操作。

另一答案

根据我的经验,我不会依赖Azure VM的系统时钟来处理任何关键问题。我偶尔会看到差异长达几分钟,面对你所期待的那样。

另一答案

这是分布式系统和虚拟机的典型问题 - 时钟偏差。

一种可能的解决方案是使用Azure调度程序ping您的每个VM上的端点,这将重置您的时钟 - 或者至少告诉您差异将是什么。这样,你的偏斜就不会增长,你甚至可以计算通信延迟的偏移量。这样,你就可以在几毫秒而不是几秒内完成。

当然,您也可以采用其他方式,并在VM上提供服务,通过ping到某个时间服务器来定期管理时钟。我不确定管理程序是否会让你弄乱它的时钟,但你真正需要的是你的应用程序消耗的偏移量。

总的来说......永远不要相信VM上的时钟,当然也不会信任分布式系统上的时钟。请注意,这个时钟问题是许多大学积极研究的一部分。即。 https://scholar.google.com/scholar?hl=en&q=distributed+system+clock&btnG=&as_sdt=1%2C48&as_sdtp=

另一答案

我试图寻找这个具体问题的答案 - 但没有成功!

我发现的一些关于“Windows时间服务”的参考文献 - W32Time - 引用了Windows服务的设计目标是2秒的容差 - 例如

在Azure网络的实践中,我希望实现的同步应该比这更好 - 但我的搜索没有引用保证。

另一答案

如果要构建分布式系统,则永远不能信任时钟同步,除非在Google Spanner中使用特殊的硬件措施。即使有一种特殊的算法用于解决可能的时钟偏差冲突。但是,有许多算法可以解决分布式系统中的这个问题:逻辑时钟,矢量时钟,Lamport时间戳等等。参见Andrew Tanenbaum的经典着作“分布式系统:原理和范例”。

以上是关于Windows Azure上的时钟同步质量?的主要内容,如果未能解决你的问题,请参考以下文章

WSL2 时钟与 Windows 不同步

经验体会:解决Ubuntu 18.04+Windows双系统时间不同步的问题

ffmpeg 如何音视频同步

Windows和Ubuntu双系统时钟同步的方法。

Windows7 时钟同步频率调整

怎么在html里做到同步本地时间?