Windows Azure上的时钟同步质量?

如何解决Windows Azure上的时钟同步质量?

| 我正在寻找有关Windows Azure上VM之间的时钟偏移的定量估计-假设所有VM都托管在同一数据中心中。我猜测一个虚拟机和另一个虚拟机之间的平均时钟偏移小于10秒,但我什至不确定它是否是Azure云的保证属性。 有人对此事进行过定量测量吗?     

解决方法

我终于下定决心自己做一些实验。 有关实验方案的一些事实: 我没有寻找参考时钟的偏移,而是仅检查了Azure VM和Azure存储之间的时钟差异。 已使用下面粘贴的HTTP hack检索了Azure存储的时钟时间。 已在Azure的北欧数据中心内使用250个小型VM进行了测量。 对于未经身份验证的简约请求,使用“ 0”衡量的存储和VM之间的延迟始终小于1ms(基本上,HTTP请求返回了400个错误,但HTTP标头中仍然存在“ 1”)。 结果: 大约50%的VM的时钟偏移量大于1s。 大约5%的VM到存储的时钟偏移大于2s。 不到1%的时钟偏移观测值关闭了3s。 一手异常值接近4s。 从一个请求到下一个请求,单个VM和存储之间的时钟偏移通常在+ 1 / -1秒之间变化。 因此,从技术上讲,我们离2s容差目标不太远,尽管对于数据中心内同步,您不必为了使接近4s的偏移而进行实验。如果我们假设时钟偏移量为正态(aka高斯)分布,那么我想说,依赖任何低于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\\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产品团队的某人就时钟同步进行对话,这比其他任何事情都引起了人们的兴趣。我收到的最新答复是:   VM和服务直接从底层花费时间   Hyper-V平台在启动时以及从该点开始的时钟为   由服务维护。为了使真实时间在   分布式系统,您将需要在应用程序层执行此操作   和/或带有引用单个时间服务器的服务。     ,根据我的经验,我不会依赖Azure VM的系统时钟来处理任何关键事件。我偶尔会看到长达几分钟的差异,这确实会遇到您的期望。     ,这是分布式系统和虚拟机的经典问题-时钟偏斜。 一种可能的解决方案是使用Azure调度程序对每个VM上的终结点计算机执行ping操作,这将重置您的时钟-或至少告诉您差异是什么。这样,您的偏差就不会增加,甚至可以计算出通信延迟的偏移量。这样,您将可以在几毫秒而不是几秒钟内到达。 当然,您也可以采用其他方法,并在VM上具有一项服务,该服务通过向某个时间服务器执行查询来定期管理时钟。我不确定虚拟机管理程序是否会让您混乱它的时钟,但是您真正需要的只是抵消应用程序使用的开销。 总体而言...永远不要相信VM上的时钟,当然也不要相信分布式系统上的时钟。请注意,这个时钟问题是许多大学积极研究的一部分。即。 https://scholar.google.com/scholar?hl=zh-CN&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撰写的经典著作“分布式系统:原理和范例”。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-