我正在寻找关于Windows Azure上虚拟机之间的时钟偏移量的数量估计 - 假设所有虚拟机都托管在同一数据中心。我猜测一个VM和另一个VM之间的平均时钟偏移量低于10秒,但我甚至不确定这是Azure云的保证属性。
有人对这个问题进行过一些定量的测量吗?
我正在寻找关于Windows Azure上虚拟机之间的时钟偏移量的数量估计 - 假设所有虚拟机都托管在同一数据中心。我猜测一个VM和另一个VM之间的平均时钟偏移量低于10秒,但我甚至不确定这是Azure云的保证属性。
有人对这个问题进行过一些定量的测量吗?
我终于决定自己做一些实验。
有关实验协议的几个事实:
Stopwatch
测量存储和VM之间的延迟始终低于1ms,用于最简单的未经身份验证的请求(基本上返回带有Date:
HTTP标头的400错误)。结果:
因此,从技术上讲,我们离2秒的公差目标并不太远,尽管对于数据中心内同步而言,你不必将实验推得太远以观察接近4秒的偏移量。如果我们假设时钟偏差服从正态(即高斯)分布,那么我会说依赖低于6秒的任何时钟阈值都可能导致调度问题。
/// <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\n";
req += "Host: " + server + "\n";
req += "\n";
sw.Write(req);
sw.Flush();
response = sr.ReadToEnd();
}
foreach(var line in response.Split(new[] { '\r', '\n' }, 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虚拟机的系统时钟来处理任何关键性任务。我偶尔会看到几分钟的时间差异,这与您所期望的情况不符。
我尝试搜索这个具体问题的答案 - 但没有成功!
关于"Windows Time Service" - W32Time - 我找到了一些参考资料,其中提到Windows服务的设计目标是2秒的容差 - 例如。
在Azure网络中,我预计实现的同步应该比这要好得多,但我的搜索没有找到任何相关的保证。如果你正在构建分布式系统,除非使用特殊的硬件措施(例如Google Spanner中使用的),否则不能信任时钟同步。即使在那里,也会使用特殊算法来解决可能的时钟偏差冲突。 然而,有许多算法可以解决分布式系统中的这个问题:逻辑时钟、向量时钟、Lamport时间戳等等。请参阅Andrew Tanenbaum的经典著作《分布式系统:原理与范例》。