linux – 如何在不重启的情况下修复闰秒睡眠问题

前端之家收集整理的这篇文章主要介绍了linux – 如何在不重启的情况下修复闰秒睡眠问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我发现在最新的闰秒插入后(2016-12-31 23:59:60),我们的CentOS7应用程序让工作线程在作业之间休眠1秒钟,开始立即唤醒睡眠线程而不是一秒钟.
通常,所有睡眠都在预期唤醒时间之前1秒唤醒.

最简单和有效的解决方案是重启盒子.但在我们的案例中,这是不可取的.
有没有办法解决这个问题而无需重启?

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;
}

建造:

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

解决方法

您的系统时间是否与ntpd或ptp同步?如果没有,请更新您的tzdata包.

For systems not synchronized by ntpd or ptp an updated tzdata package
that contains the December 31st leap second is required. The updated
tzdata package was released as part of RHEA-2016-1982,and any systems
using RHEL 7 that are not synchronized by ntpd or ptp should update to
tzdata-2016g-2.el7,or a later version,to receive this fix.

Resolve Leap Second Issues in Red Hat Enterprise Linux

原文链接:https://www.f2er.com/linux/397313.html

猜你在找的Linux相关文章