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秒的容差 - 例如
- http://www.windowsitpro.com/article/time-synchronization/windows-time-synchronization-service
- http://support.microsoft.com/kb/939322
在Azure网络的实践中,我希望实现的同步应该比这更好 - 但我的搜索没有引用保证。
如果要构建分布式系统,则永远不能信任时钟同步,除非在Google Spanner中使用特殊的硬件措施。即使有一种特殊的算法用于解决可能的时钟偏差冲突。但是,有许多算法可以解决分布式系统中的这个问题:逻辑时钟,矢量时钟,Lamport时间戳等等。参见Andrew Tanenbaum的经典着作“分布式系统:原理和范例”。
以上是关于Windows Azure上的时钟同步质量?的主要内容,如果未能解决你的问题,请参考以下文章