文章作者:luxianghao

文章来源:http://www.cnblogs.com/luxianghao/p/6339470.html  转载请注明,谢谢合作。

免责声明:文章内容仅代表个人观点,如有不当,欢迎指正。

---

为什么会有闰秒?

世界上有几种计量时间的方式,

世界时(UT1):是一种天文计量的方式,天文学家通过观测地球的自转,并将自转一周的时间(一天)等分为864000份,每份为一秒,

受潮汐等因素的影响,地球自转一周的时间并不是恒定的,这也是造成闰秒现象的直接原因。

原子时(TAI):由于上面描述的世界时并不稳定,物理学家用更为稳定的量子计量的方式来统计时间,1967年,国际计量大会用铯133

(Cs133)原子基态的两个超精细能级之间的跃迁所对应辐射的9192631770个周期所持续的时间定义为1秒,这个是目前最精确的时间

计量方式,其误差为1400000年一秒,基本可忽略不计

协调世界时(UTC):又称世界标准时间或世界协调时间,UTC以TAI为基础,又要兼顾UT1,当UTC,和UT1之间的偏差接近1秒时,

国际地球自转和参考系服务(IERS)会提前6个月公布下一次闰秒的时间。

闰秒是否有规律,多长时间闰秒一次?

如下图所示,看起来并没有什么规律,如之前所说,影响地球自转的因素没什么规律,那么闰秒自然也没什么规律。

闰秒有什么影响?

对于普通人来说,正常的上班、下班、工作、学习,生命中偏差的这一秒无关痛痒,这个倒不会像闰年,闰月那样,影响人的生日

对于对时间要求比较精确的航空、航天、军工等,影响就会比较大了

对于我所在的互联网行业,服务器清一色的linux系统,闰秒可能会造成机器cpu突然增高,机器宕机等,对应的服务就会挂掉,

因为互联网是最近几年才蓬勃发展起来,所以之前的闰秒对linux的影响就没被放大,随着linux的普遍使用,闰秒也被越来越多的被关注。

闰秒对linux以及在linux上run的应用的影响

系统打印闰秒插入信息的时候夯住:当NTP通知内核关于闰秒的动作时,这个bug会被触发,这个bug会发生在闰秒发生的前一天的任何时候,

这个bug提前被触发的原因是NTP时间服务器会提前一天通知连接它的linux服务器,将来的某个时刻会发生闰秒,linux服务器的ntp收到这个信息

后会在闰秒时刻对linux的时间做一些处理,增加一秒,或者减去一秒

闰秒活锁导致系统夯住:由于这个bug,NMI看门狗会检测到系统夯住,系统会不停的crash;闰秒被插入后这个bug就会被触发,目前还没确定

哪个版本修复了这个bug

cpu load快速增高:其原因为应用程序不能处理闰秒带来的系统时间的突然变化,linux系统提供两种系统时间,wall time和montonic time,其中

wall time记录的是事实时间,可以向前或者向后调整,montonic time记录的是系统从启动以来的秒数,只能向前递增,因此如果应用程序在获取时间

时用的wall time则会受到系统时间调整(如闰秒)的影响,而采用后者则不会受到影响,具体到jdk来说明在jdk 7u6开始采用后者。

不能处理闰秒的内核在处理闰秒发生故障时会有什么样的系统日志

eg: Kernel panic - not syncing: Watchdog detected hard LOCK UP on cpu 21

闰秒后系统日志会有什么记录?

eg: kernel[81951.244556] Clock: inserting leap second 23:59:60 UTC

内核bug修复情况

以上提到的bug在linux各个版本陆陆续续有修复,这里提供一个安全的版本,内核是2.6.39-200.3或者更高版本的可以认为是安全的

ntp && 闰秒

主机使用了ntp

此时主机在闰秒时的表现将取决于使用的ntp的版本

1 版本高于等于4.2.2p1-9 或者更高版本(除了ntp-4.2.6p5-19.el7, ntp-4.2.6p5-1.el6 and ntp-4.2.6p5-2.el6_6)

a 带-x参数运行:闰秒不是直接在内核中添加,而是把这一秒分散到大约2000秒中,1秒比之前长一些,缓慢的更改时间,

这样做的优点:

1)避免时间倒退造成的应用逻辑问题

2)比较奇怪的时间点23:59:60不会出现

3)由于实际上没有增加闰秒,所以上面描述的内核bug也不会出现

这样做的缺点:

1)由于调整的时间段内,一秒的长短实际上是不准确的,所以对时间精度要求高的场景就不适用了

2)由于ntp的更新机制,这个办法同样也不适用于那些要求所有节点时间一致的集群

b 不带-x参数运行,ntp会通知内核直接增加一秒(是突增的,非连续的)

2 版本低于4.2.2p1-9

  ntp会通知内核直接增加一秒,或者在停止一秒

注意:如果主机上运行了ntp,那么运行“file /etc/localtime”,确保输出结果中有“no leap seconds”(这表明不会添加闰秒)

主机没有使用ntp

1 没有使用tzdata

  那么主机的时间完全由自己调整,建议使用ntp加上-x参数

2 使用了tzdata

  a 版本低于2015a,不会添加闰秒

  b 大于等于2015a,并且运行“file /etc/localtime”,输出结果中有“X leap seconds”(X是个数字)

   那么闰秒会以“23:59:60”这样的形式出现,这会导致DATE/TIMESTAMP数据类型出现问题,

   你需要复制适当的/usr/share/zoneinfo文件覆盖/etc/localtime(这个操作是动态调整的,不需要重启)

应对闰秒的总结

1 升级内核使版本大于等于2.6.39-200.3,内核能够处理闰秒,但是依然要提防应用程序对时间的敏感度,具体情况可参考这个

针对这样的应用程序,你需要

a 重构代码

b 升级对应的软件如jdk

2 在主机是任何版本内核的情况下,升级ntp是版本大于等于4.2.2p1-9,来应对那些对时间精度要求不高的场景

3 对于那些既不关心时间精度,也不想升级任何东西的,那就重启ntp

a 在上级时间服务器发闰秒通知开始之前停止ntp(需提前一天 /etc/init.d/ntpd stop),

b date -s "`date`" (重置系统时间,个人认为这样做可能是为了解开闰秒造成的死锁)

c 启动ntp/etc/init.d/ntpd start

4 copy时间文件应对tzdata添加的闰秒

应对linux下的闰秒的更多相关文章

  1. Linux下配置tomcat+apr+native应对高并发

    摘要:在慢速网络上Tomcat线程数开到300以上的水平,不配APR,基本上300个线程狠快就会用满,以后的请求就只好等待.但是配上APR之后,Tomcat将以JNI的形式调用Apache HTTP服 ...

  2. (转)Linux下配置tomcat+apr+native应对高并发

    摘要:在慢速网络上Tomcat线程数开到300以上的水平,不配APR,基本上300个线程狠快就会用满,以后的请求就只好等待.但是配上APR之后,Tomcat将以JNI的形式调用Apache HTTP服 ...

  3. Linux 下configure 参数配置与软件的安装与卸载

    Linux环境下的软件安装,并不是一件容易的事情:如果通过源代码编译后在安装,当然事情就更为复杂一些:现在安装各种软件的教程都非常普遍:但万变不离其中,对基础知识的扎实掌握,安装各种软件的问题就迎刃而 ...

  4. Linux下mysql的安装和使用(C语言)

    1 mysql的安装 我使用的ubuntu在线安装,非常简单,命令为: sudo apt-get install mysql-client mysql-server 2 mysql命令集合 网络太多了 ...

  5. linux磁盘清理方法 Linux 下垃圾清理工具 BleachBit

    由于当初安装系统设计不合理,有些分区的过小,以及网络通讯故障等造成日志文件速度增长等其他原因都可以表现为磁盘空间满,造成无法读写磁盘,应用程序无法执行等.下面就给你支几招(以/home空间满为例): ...

  6. Linux 下最为人熟知的解压缩工具

    很多时候,通过互联网发送或接收大文件和图片是一件令人头疼的事.压缩及解压缩工具正好可以应对这个问题.下面让我们快速浏览一些可以使得我们的工作更加轻松的开源工具. Tar Tar 由 ‘Tape arc ...

  7. Linux下Oracle11G RAC报错:在安装oracle软件时报file not found一例

    Linux下Oracle11G RAC报错:在安装oracle软件时报file notfound一例 1.现象 之前安装一切都比較顺利,安装oracle软件时,进度到30%时报错:file not f ...

  8. linux下各安装包的安装方法

    <转>linux下各安装包的安装方法   一.rpm包安装方式步骤: 1.找到相应的软件包,比如soft.version.rpm,下载到本机某个目录: 2.打开一个终端,su -成root ...

  9. 转:// LINUX下为ORACLE数据库设置大页--hugepage

    一.在解释什么情况下需要开启大页和为啥需要开启大页前先了解下Linux下页的相关的知识:以下的内容是基于32位的系统,4K的内存页大小做出的计算1)目录表,用来存放页表的位置,共包含1024个目录en ...

随机推荐

  1. Javascript隔离方法

    1.常用的隔离方法: (function() { })(); 2.query的隔离方法: 需要引入jquery: <script type="text/javascript" ...

  2. ZOJ 3935 2016

    简单规律题...没看懂题目直接从输出中找到了规律. 先不管是不是闰年,前后两项的差值会形成一个等差数列,公差是64... 输出的时候再判一下闰年即可. #include<cstdio> # ...

  3. iOS 8自定义动画转场上手指南

    原文:http://www.cocoachina.com/ios/20150126/11011.html iOS 5发布的时候,苹果针对应用程序界面的设计,提出了一种全新的,革命性的方法—Storyb ...

  4. Servlet中的过滤器Filter用法

    1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对Http ...

  5. sqlserver修改增删改字段

    ---新增列 alter table article add addtime0 datetime ---修改列 alter table article ) --删除列 alter table arti ...

  6. u-boot-2016.07 README文档结构

    Author:AP0904225版权声明:本文为博主原创文章,转载请标明出处. 阅读u-boot的README文档,可以获取很多有用的信息,例如从哪里可以获得帮助,帮助:u-boot版本命名规则,目录 ...

  7. spring.net的基本搭建

    这几天在学C#,感觉还是需要一个控制反转的框架,正好Spirng也有.net版的,看着API搭建一个 大致目录是这样的,我们在APP.CONFIG里面配好xml文件的地址,这个APP.CONFIG就相 ...

  8. C语言-for循环

    for循环是C语言中的循环语句之一,它的一般形式为for(初值,条件表达式,步长){语句};初值通常是一个赋值语句, 它用来给循环控制变量赋初值: 条件表达式是一个关系表达式, 它决定什么时候退出循环 ...

  9. 【动态规划】Gym - 101102A - Coins

    Hasan and Bahosain want to buy a new video game, they want to share the expenses. Hasan has a set of ...

  10. CentOS 7 上面安装PowerShell

    看了文章 爱上PowerShell , 就想在CentOS 7上面试试PowerShell , 本文记录了在CentOS 7.2上安装Powershell 的过程. 首先我们要从github上下载最新 ...