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

相关文章

在Linux上编写运行C语言程序,经常会遇到程序崩溃、卡死等异...
git使用小结很多人可能和我一样,起初对git是一无所知的。我...
1. 操作系统环境、安装包准备 宿主机:Max OSX 10.10.5 虚拟...
因为业务系统需求,需要对web服务作nginx代理,在不断的尝试...
Linux模块机制浅析 Linux允许用户通过插入模块,实现干预内核...
一、Hadoop HA的Web页面访问 Hadoop开启HA后,会同时存在两个...