ntp导致的时钟回拨

时钟回拨

我们的服务器时间校准一般是通过ntp进程去校准的。但由于校准这个动作,会导致时钟跳跃变化的现象。

而这种情况里面,往往回拨最能引起我们的困扰,回拨如下所示:

会引起什么问题

准点调度任务的误判

假设有一个任务每天0点时候获取昨天所有的数据进行对账,正常情况和时钟回拨的情况如下图所示:



针对这种情况,笔者让业务调整了调度触发时间,不要精确在准点,以避免此问题。

唯一序列号(雪花算法)

时钟回拨的情况也会影响到采用雪花算法这种对时间戳要求单调的算法。很明显的,时间戳回调后,极易形成重复的序列号。

对于这种情况我们采用预留序列号段,在检测到这种情况后,将预留序列号分配出去,进而解决这一问题。

ntpd的时钟回拨(跳变)条件

事实上,ntpd本身还有另一种方案,即通过调整滴答频率来让我们的本地时钟慢慢的和精确时间match。

但是,如果本机时间和精确时间(从ntpd服务器获取的时间)相差过大(> stepout threshold 128ms),则ntpd会直接采用跳跃变化的方式修正时间。代码如下所示:

ntp_loopfilter.c

double	clock_max = CLOCK_MAX; // .128也就是128ms

int local_lock(...) {
// 差距>128ms之后,选择跳变
if (fabs(fp_offset) > clock_max && clock_max > 0) {
......
// 修正simclock.local_time
step_systime(fp_offset);
......
}
}

而在我们的线上,在/var/log/message中经常能见到时钟跳变的输出。

-x选项

我们采用-x选项,可以将stepout threshold(128ms)提升到600s。这样,不是太极端的情况,应该都不会触发到时钟回拨。但这会导致长时间时间戳不准确的问题(毕竟,调整滴答频率来慢慢match比较慢)。

stepback stepback

在高版本的ntpd中,还可以有stepback选项,如果设置为0的话,则不会回拨。

最新文章

  1. javascript关闭页面
  2. 1.羽翼sqlmap学习笔记之Access注入
  3. You may receive an exception when you browse a .NET Framework 2.0 ASP.NET Web application
  4. Android开发--ListView的应用
  5. SpringMVC无法获取请求中的参数的问题的调查与解决(1)
  6. java基础-复制
  7. Linux和UNIX监控
  8. SDUT1281Cup
  9. Java基础知识强化之集合框架笔记52:Map集合之Map集合的遍历 键找值
  10. mysql排序,可以对统计的数据进行排序
  11. 一款新型的智能家居WiFi选择方案——SimpleWiFi在无线智能家居中的应用
  12. 201521123119 《Java程序设计》第13周学习总结
  13. 三 : spring-uploadify上传文件
  14. Python3.0科学计算学习之绘图(一)
  15. spring 集成redis客户端jedis(java)
  16. turtle画戒指
  17. ABP 异常处理 第四篇
  18. mysql中唯一约束用法
  19. 【H5】dropload (移动端下拉刷新,上拉加载)
  20. substr和substring,slice和splice的区别,js字符串截取和数组截取

热门文章

  1. Day05_26_Overide_方法重写
  2. Day10_53_Collections.synchronizedList() 将Arraylist集合转换为线程安全的集合
  3. Java 常用类总结(SE基础)
  4. Spring Cloud Alibaba(6)---Nacos持久化Mysql8.0版本
  5. 2021S软件工程——结对项目第三阶段
  6. Android最新敲诈者病毒分析及解锁(11月版)
  7. Win64 驱动内核编程-8.内核里的其他常用
  8. 【JavaScript】Leetcode每日一题-组合总和4
  9. SimpleDateFormat线程不安全的5种解决方案!
  10. Elasticsearch入门,看这一篇就够了