如何解决闰秒睡眠问题,无需重新启动

我发现,在最新的闰秒插入(2016-12-31 23:59:60)后,我们的CentOS7应用程序的工作线程在作业之间hibernate1秒,开始立即唤醒睡眠线程,而不是一秒钟。 一般而言,所有的睡眠都比预期的醒来时间提前1秒醒来。

最简单的工作解决scheme是重新启动盒子。 但在我们的情况下这是不可取的。 有没有办法解决这个问题,而无需重新启动?

PS。 作为参考,这里是一个简单的C ++程序,它重现了这个问题。

#include <boost/date_time.hpp> #include <boost/thread.hpp> #include <iostream> using namespace std; // this has to be run in a thread to be able to detect the issue void check_thread() { size_t expected_delay = 1000; cout << "Expected delay: " << expected_delay << " ms" << endl; boost::posix_time::ptime t1 = boost::posix_time::microsec_clock::universal_time(); boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); boost::posix_time::ptime t2 = boost::posix_time::microsec_clock::universal_time(); size_t actual_delay = (t2 - t1).total_milliseconds(); cout << "Actual delay: " << actual_delay << " ms" << endl; if (abs(expected_delay - actual_delay) > 900) { cout << "Too big delay difference: " << (expected_delay - actual_delay) << endl; cout << "Possible leap second issue" << endl; } else { cout << "No issues found" << endl; } } int main() { boost::thread_group g; g.create_thread(check_thread); g.join_all(); return 0; } 

build造:

 g++ sleep_test.cpp -Wl,-Bstatic -lboost_thread -lboost_system -lboost_date_time -Wl,-Bdynamic -rdynamic -pthread 

您的系统时间是否与ntpdptp同步? 如果没有,请更新您的tzdata软件包。

对于未通过ntpd或ptp进行同步的系统,需要包含12月31日闰秒的更新的tzdata软件包。 更新后的tzdata软件包是作为RHEA-2016-1982的一部分发布的,任何使用RHEL 7的系统,如果未通过ntpd或ptp进行同步,则应更新到tzdata-2016g-2.el7或更高版本,以接收此修复程序。

解决红帽企业Linux中的第二个问题

除了Troy所说的,在RHEL7系统上,在应用闰秒的时候还没有更新tzdata,而不运行ntpd,需要额外的步骤 – 手动将时间设置为1秒,然后恢复:

 date -s "+1 sec" date -s "-1 sec"