闰秒及其对计算机系统影响,闰秒原理及其对计算机系统影响

此时 linux 系统会出现一句告警kernel: [xxxxxx.xxxxxx] Clock: inserting leap second 23:59:60 UTC闰秒代码从定时器那里中断处理程序, 每次时钟中断触发时会调用 tick_do_update_jiffies 更新 jiffies 的值,而 jiffies 主要记录了系统启动以来产生的处理频次,通过 jiffies/Hz 可以得到系统启动了多少秒。因此在这里需要对 xtime_lock 加入写锁。闰秒代码调用second_overflow 这个函数处理润秒,我们截取这个函数确定 时间状态的一段判定,发现,switch (time_state) {case TIME_OK:if (time_status & STA_INS)time_state = TIME_INS;elseif (time_status & STA_DEL)time_state = TIME_DEL;break;case TIME_INS:if (xtime.tv_sec % 86400 == 0) {xtime.tv_sec--;wall_to_monotonic.tv_sec++;/* The timer interpolator will make time change gradually instead * of an immediate jump by one second. */time_interpolator_update(-NSEC_PER_SEC);time_state = TIME_OOP;clock_was_set();printk(KERN_NOTICE "Clock: inserting leap second 23:59:60 UTC\n");}break;case TIME_DEL:if ((xtime.tv_sec + 1) % 86400 == 0) {xtime.tv_sec++;wall_to_monotonic.tv_sec--; /* Use of time interpolator for a gradual change of time */time_interpolator_update(NSEC_PER_SEC);time_state = TIME_WAIT;clock_was_set();printk(KERN_NOTICE "Clock: deleting leap second 23:59:59 UTC\n");}break;case TIME_OOP:time_state = TIME_WAIT;break;case TIME_WAIT:if (!(time_status & (STA_INS | STA_DEL))) time_state = TIME_OK; }这里的clock_was_set() 调用对 xtime_lock 的读锁尴尬的是 现在 xtime_lock 还处于锁状态,死锁发生。在之后的patch 里面 Thomas Gleixner 在函数里去掉了 clock_was_set() 函数问题解决--- a/kernel/time/ntp.c+++ b/kernel/time/ntp.c@@ -122,7 +122,6 @@ void second_overflow(void)*/time_interpolator_update(-NSEC_PER_SEC);time_state = TIME_OOP;- clock_was_set();printk(KERN_NOTICE "Clock: inserting leap second ""23:59:60 UTC\n");}@@ -137,7 +136,6 @@ void second_overflow(void)*/time_interpolator_update(NSEC_PER_SEC);time_state = TIME_WAIT;- clock_was_set();printk(KERN_NOTICE "Clock: deleting leap second ""23:59:59 UTC\n");}解决办法。方法1:升级内核到高版本。避开以上可能出现问题的版本,一劳永逸。但是毋庸置疑,升级内核这种方法可能会带来一系列的问题。特别是升级内核后要重启服务器,有可能升级过程中遇到莫名的问题。生产系统没有必要冒这么大的风险。方法2:(推荐)因为单机并不受影响,因此,我们只需要在闰秒发生之前一天开始将NTP服务停掉。为什么是前1天,因为闰秒通知和闰秒处理不是同时进行处理的。不是前1分钟关上就可以的。# service ntpd stop过了闰秒的时间再开开。# service ntpd start方法3:(特殊情况使用)将NTP服务设置为 slew 模式原理为: slew 模式并不使用跳跃式修改时间。比如一次调整1秒。而是每秒调整 0.5ms 来缓慢修正时间。

c426225f0816e906a056b583837f05cc.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值