我发现,在最新的闰秒插入(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
您的系统时间是否与ntpd
或ptp
同步? 如果没有,请更新您的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"