此时 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 来缓慢修正时间。
闰秒及其对计算机系统影响,闰秒原理及其对计算机系统影响
最新推荐文章于 2022-11-25 16:20:14 发布