
최신 윤초 삽입(2016-12-31 23:59:60) 이후 작업자 스레드가 작업 사이에 1초 동안 휴면 상태인 CentOS7 애플리케이션이 1초가 아닌 즉시 휴면 스레드를 깨우기 시작했다는 사실을 발견했습니다. 일반적으로 모든 수면은 예상 기상 시간보다 1초 앞서 깨어납니다.
가장 간단하고 효과적인 해결책은 상자를 재부팅하는 것입니다. 그러나 우리의 경우에는 그것이 바람직하지 않습니다. 재부팅하지 않고 해결할 수 있는 방법이 있나요?
추신. 참고로 다음은 문제를 재현하는 간단한 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
답변1
시스템 시간이 ntpd
또는 와 동기화되어 있습니까 ptp
? 그렇지 않은 경우 tzdata
패키지를 업데이트하세요.
ntpd 또는 ptp로 동기화되지 않은 시스템의 경우 12월 31일 윤초를 포함하는 업데이트된 tzdata 패키지가 필요합니다. 업데이트된 tzdata 패키지는 RHEA-2016-1982의 일부로 릴리스되었으며, ntpd 또는 ptp로 동기화되지 않은 RHEL 7을 사용하는 모든 시스템은 이 수정 사항을 받으려면 tzdata-2016g-2.el7 또는 이후 버전으로 업데이트해야 합니다.
답변2
Troy가 말한 것 외에도 윤초가 적용될 때까지 tzdata를 업데이트하지 않았고 ntpd를 실행하지 않는 RHEL7 시스템에서는 추가 단계가 필요합니다. 수동으로 시간을 1초 앞으로 설정한 다음 되돌립니다.
date -s "+1 sec"
date -s "-1 sec"