
Ich habe festgestellt, dass unsere CentOS7-Anwendung, bei der die Arbeitsthreads zwischen den Jobs 1 Sekunde lang schlafen, nach der letzten Einfügung der Schaltsekunde (31.12.2016, 23:59:60) begonnen hat, die schlafenden Threads sofort und nicht erst nach einer Sekunde zu wecken. Im Allgemeinen werden alle schlafenden Threads 1 Sekunde vor der erwarteten Weckzeit geweckt.
Die einfachste und funktionierendste Lösung ist ein Neustart der Box. Aber das ist in unserem Fall nicht wünschenswert. Gibt es eine Möglichkeit, das Problem ohne Neustart zu beheben?
PS. Als Referenz finden Sie hier ein einfaches Programm in C++, das das Problem reproduziert.
#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;
}
Gebäude:
g++ sleep_test.cpp -Wl,-Bstatic -lboost_thread -lboost_system -lboost_date_time -Wl,-Bdynamic -rdynamic -pthread
Antwort1
Ist Ihre Systemzeit mit ntpd
oder synchronisiert ptp
? Wenn nicht, aktualisieren Sie Ihr tzdata
Paket.
Für Systeme, die nicht per ntpd oder ptp synchronisiert werden, ist ein aktualisiertes tzdata-Paket erforderlich, das die Schaltsekunde vom 31. Dezember enthält. Das aktualisierte tzdata-Paket wurde als Teil von RHEA-2016-1982 veröffentlicht. Alle Systeme, die RHEL 7 verwenden und nicht per ntpd oder ptp synchronisiert werden, sollten auf tzdata-2016g-2.el7 oder eine spätere Version aktualisieren, um diesen Fix zu erhalten.
Beheben von Schaltsekundenproblemen in Red Hat Enterprise Linux
Antwort2
Zusätzlich zu dem, was Troy gesagt hat, ist auf RHEL7-Systemen, die tzdata zum Zeitpunkt der Anwendung der Schaltsekunde nicht aktualisiert hatten und auf denen ntpd nicht ausgeführt wird, ein zusätzlicher Schritt erforderlich: Stellen Sie die Zeit manuell eine Sekunde vor und stellen Sie sie dann wieder zurück:
date -s "+1 sec"
date -s "-1 sec"