Wie genau ist die Zeitserver-Synchronisationsgenauigkeit von Windows? (und kompensiert es die Pingzeit?)

1123
Basj

Für das in Anwendung dieser Frage beschriebene Projekt brauche ich die bestmögliche Zeituhrgenauigkeit. Eine Lösung besteht darin, die Echtzeituhr des Computers präzise zu synchronisieren .

  1. Wie hoch ist die dokumentierte Genauigkeit einer Synchronisierung mit Windows 7 Datum / Uhrzeit anpassen> Internetzeit> Einstellungen ändern> Jetzt aktualisieren ... ?

  2. Kompensiert es insbesondere den Ping des Zeitservers?

    Beispiel:

    • Der Zeitserver sendet ein Paket, um zu sagen, dass es genau 12: 00: 00,000 ist
    • Nehmen wir an, der durchschnittliche Ping von meinem Computer zum Zeitserver beträgt 93 ms (durchschnittlicher Ping, der beispielsweise während der letzten Minute berechnet wurde).
    • Das Paket vom Zeitserver erreicht meinen Computer um 12: 00: 00.093, oder?
    • dann sollte Windows die Uhrzeit auf 12: 00: 00.093 und nicht auf 12: 00: 00.000 einstellen, oder?
  3. Wenn nicht, gibt es eine Windows-Software, die eine solche Echtzeituhrsynchronisation mit Ping-Kompensation oder einer anderen verbesserten Genauigkeit durchführen kann?

6
Windows ist so genau wie die NTP-Zeitquelle. Ihre eigentliche Frage ist also, wie genau im Durchschnitt `time.nist.gov` ist. Es gibt GPS-Hardware, die für extrem genaue Zeitquellen verwendet werden kann, und eine hohe Ping-Zeit kann dazu führen, dass eine Systemuhr driftet. Wenn Sie einen hohen Ping zu einer bestimmten NTP-Quelle haben, sollten Sie ihn in eine andere ändern. Ping! = Latenzzeit. Ein hoher Ping, der einen bestimmten Pakettyp verwendet, bedeutet nicht, dass ein Paket eines anderen Typs dieselbe Zeit in Anspruch nimmt. Es ist fast garantiert, dass es nicht geht. Ramhound vor 5 Jahren 0
@Ramhound Ich denke mal, dass ein so bekannter Zeitserver eine super gute Präzision in sich haben wird. Die Frage ist: Wird die Ping-Zeit vom Server oder von Windows oder nicht kompensiert? Basj vor 5 Jahren 0
Kommen Sie in Root Access. Diese Diskussion hat den Kommentarbereich überschritten. Ein hoher Ping allein verursacht KEIN Problem mit NTP. Ramhound vor 5 Jahren 0
Lesezeit: [# 1] (https://serverfault.com/q/379739), [# 2] (https://en.wikipedia.org/wiki/Network_Time_Protocol#Windows_Time_service), [# 3] (https: //docs.microsoft.com/de-de/windows-server/networking/windows-time-service/support-boundary) guest-vm vor 5 Jahren 0
Danke @ guest-vm. Nr. 2 sagt: Microsoft sagt, der W32Time-Dienst kann die Synchronisierungszeit nicht zuverlässig im Bereich von 1 bis 2 Sekunden aufrechterhalten. Wenn eine höhere Genauigkeit gewünscht wird, empfiehlt Microsoft die Verwendung einer anderen NTP-Implementierung.` über Server 2003 & Vista. `Windows Server 2016 unterstützt jetzt unter bestimmten Betriebsbedingungen eine Zeitgenauigkeit von 1 ms.` Was ist Ihrer Meinung nach für Windows 7 wahr? Basj vor 5 Jahren 0
In # 3 heißt es: "Zielgenauigkeit: [...] 50 Millisekunden, um eine Genauigkeit von 50 ms zu erreichen" [...] Der Zielcomputer muss zwischen seiner Zeitquelle eine Latenz zwischen 5 ms und 5 ms haben. "Wow, das ist für mich unmöglich ... Ich habe keinen 5-ms-Ping an den Windows-Zeitserver ... Wer hat einen 5-ms-Ping an diesen Server @ guest-vm? Basj vor 5 Jahren 0
Gibt es nicht eine Windows-Drittanbieter-Freeware, die ich installieren könnte und die all dies richtig erledigt? Basj vor 5 Jahren 0
@Basj haben Sie * den Windows-Zeitdienst * oder können Sie stattdessen `ntp` für Windows verwenden? user3788685 vor 5 Jahren 0
@ user3788685 Ich kann "ntp" für Windows verwenden (falls verfügbar in Binärdateien für Windows 7) und wenn es eine gute Synchronisation + Ping-Kompensation beherrscht (ermöglicht eine Genauigkeit von <50 ms). Basj vor 5 Jahren 0
Überprüfen Sie meine [Nachrichten] (https://chat.stackexchange.com/transcript/message/44933091). guest-vm vor 5 Jahren 0

2 Antworten auf die Frage

6
harrymc

Sehr interessante Frage, also habe ich einige Quellen gesucht.

Der Artikel Teil II: Anpassung der Systemzeit von Arno Lentfer aus dem Jahr 2012 ( PDF ) enthält viele Messungen und sagt dazu:

Die Windows-Synchronisierung auf eine Netzwerkzeitreferenz hat sich als nicht sehr genau erwiesen. Insbesondere die Windows-Versionen VISTA und 7 scheinen aus unbekannten Gründen einige der Funktionen verloren zu haben. Leider gibt es nicht viele Informationen zu diesem Problem, und die wenigen verfügbaren Informationen besagen im Wesentlichen, dass die Windows-Zeitsynchronisierung nicht genauer als einige Sekunden sein sollte und dass das Verhalten von SetSystemTimeAdjustment in Bezug auf die Bedeutung möglicherweise falsch ist des Wertes von dwTimeAdjustment. Nur Windows 8 hat diese Nachteile nun überwunden und die Anpassung der Systemzeit funktioniert wie unter Windows XP.

Der Artikel stellt fest, dass in der Systemuhr kleine Fehler enthalten sind, die im Allgemeinen nicht die genaue Zeit einhalten. Die Analyse zeigt, dass mit der untersuchten Hardware die Systemzeit gegenüber der realen Uhr um 0,0448 ms / s zunehmen kann.

Der Microsoft-Artikel Support-Grenze zum Konfigurieren des Windows-Zeitdiensts für Umgebungen mit hoher Genauigkeit schlussfolgert, dass das Beste, was Sie sich erhoffen können, 1 Millisekunde bei Verwendung von Windows 10 und Windows Server 2016 in einer streng kontrollierten Umgebung ist. In der Microsoft-Dokumentation werden die Anforderungen für 1-Sekunden-, 50-ms- und 1-ms-Genauigkeiten beschrieben, während ältere Betriebssysteme nur wenige Sekunden benötigen.

Im Gegensatz dazu erreicht Domain Time II eine nachgewiesene Genauigkeit von unter einer Millisekunde, und bei Verwendung des Precision Time Protocol (PTP) nach IEEE 1588-2008 kann eine Genauigkeit im zweistelligen Mikrosekundenbereich erzielt werden.

Der Microsoft-Artikel beschreibt die Anforderungen für eine bestimmte Genauigkeit:

Zielgenauigkeit: Anforderungen von 1 Sekunde (1s)

  • Das Zielsystem muss Windows 10, Windows Server 2016 ausführen.
  • Das Zielsystem muss die Zeit von einer hochgenauen NTP-Zeitquelle synchronisieren
  • Windows-Systeme in der NTP-Hierarchie müssen korrekt konfiguriert sein
  • Die kumulative Einweg-Netzwerklatenz zwischen Ziel und Quelle darf 100 ms nicht überschreiten.

Zielgenauigkeit: 50 Millisekunden-Anforderungen

  • Der Zielcomputer muss zwischen seiner Zeitquelle mehr als 5 ms Netzwerklatenz haben.
  • Das Zielsystem darf nicht weiter als Schicht 5 aus einer hochgenauen Zeitquelle sein
  • Das Zielsystem muss innerhalb von 6 oder weniger Netzwerk-Hops von der hochgenauen Zeitquelle entfernt sein
  • Die durchschnittliche CPU-Auslastung von einem Tag in allen Strategien darf 90% nicht überschreiten.
  • Bei virtualisierten Systemen darf die durchschnittliche CPU-Auslastung des Hosts an einem Tag 90% nicht überschreiten.

Hinweis: Führen Sie w32tm /query /statusdie Befehlszeile aus, um die Schicht anzuzeigen.

Zielgenauigkeit: 1 Millisekunden-Anforderungen

  • Der Zielcomputer muss zwischen seiner Zeitquelle eine Netzwerklatenz von mehr als 0,1 ms aufweisen
  • Das Zielsystem darf nicht weiter als Schicht 5 aus einer hochgenauen Zeitquelle sein
  • Das Zielsystem muss innerhalb von 4 oder weniger Netzwerk-Hops von der hochgenauen Zeitquelle entfernt sein
  • Die durchschnittliche CPU-Auslastung an einem Tag in jeder Schicht darf 80% nicht überschreiten.
  • Bei virtualisierten Systemen darf die durchschnittliche CPU-Auslastung des Hosts an einem Tag 80% nicht überschreiten.

Wenn Sie sich fragen, was Schicht ist, ist es wichtig zu wissen, dass NTP ein hierarchisches, halbschichtiges System von Taktebenen ist. Das folgende Diagramm stammt aus dem Artikel Network Time Protocol (NTP). Wie genau ist es? von Dave Gault ( PDF ):

NTP-Hierarchie

Der Artikel listet auch die Faktoren auf, die die Qualität der angezeigten Zeit beeinträchtigen können:

  • Geschwindigkeit (Latenz) der Internetverbindung.
  • Schichten der für die Synchronisation ausgewählten Zeitserver.
  • Signalentfernung von den Servern (einschließlich zu und von Satelliten im Orbit).
  • Die Qualität und Komplexität des verwendeten Softwarealgorithmus.
    • Verwendet es mehr als einen Server?
    • Berechnet es die Umlaufverzögerung?
    • Kompensiert sie systematische Vorurteile?
    • Gibt es Berichte über die Genauigkeit der Synchronisierung?

Dies erschien länger als ich beabsichtigt hatte. Aber um deine Fragen zu beantworten:

Wie hoch ist die dokumentierte Genauigkeit einer Synchronisierung mit Windows 7 Datum / Uhrzeit anpassen> Internetzeit> Einstellungen ändern> Jetzt aktualisieren ...?

Dies hängt davon ab, welche der Anforderungen für die obige Zielgenauigkeit für Ihre Installation gelten. Wenn keine der oben genannten Anforderungen erfüllt ist, kann Ihre Zeit um bis zu 2 Sekunden von der Echtzeit abweichen. Der NTP-Zeitserver kann je nach Schicht auch Ungenauigkeiten aufweisen. Beachten Sie außerdem, dass Sie eine konstante Zeitverschiebung feststellen, wenn Sie die Echtzeituhr des Computers verwenden, die Sie möglicherweise messen können (oder die möglicherweise vom Hersteller erhältlich ist).

Kompensiert es insbesondere den Ping des Zeitservers?

Die Antwort ist nein. Es liegt an Ihnen zu messen, dass die Ping-Zeit nicht konstant bleibt.

Fazit: Wenn Sie mehr Zeitgenauigkeit benötigen als von den Internet-Zeitservern angegeben, müssen Sie ein spezielles Uhrgerät erwerben und verwenden.

Interessante Lektüre ist der Algorithmic Trading-Artikel Precision Timekeeping unter Windows, in dem erklärt wird, wie Microsoft seine internen Zeitnehmungsfunktionen verbessert hat und wie genau die Systemuhr ist:

Bild

Nützliche Tools zum Einstellen oder Überprüfen der Computerzeit

Wenn Sie möchten, dass Ihr Computer über das Internet mit Low-Stratum-Servern synchronisiert wird, können Sie das kostenlose Produkt Dimension 4 verwenden :

Dimension 4 verwendet ein Low-Level-Internetprotokoll (SNTP), um sich mit speziellen Internet-Zeitservern zu verbinden, die den Rest des Webs seit mehr als 20 Jahren pünktlich halten. Diese Zeitserver haben normalerweise direkten Zugriff auf ihre eigene Zeitquelle oder sie sind direkt mit anderen Internet-Zeitservern verbunden, die dies tun.

In einem von Ihnen angegebenen Intervall stellt Dimension 4 eine Verbindung zu einem dieser Internet-Zeitserver her, die Sie aus einer umfassenden Liste auswählen können, die direkt in Dimension 4 erstellt wird. Der Zeitserver sendet dann die korrekte Zeit an Ihren Computer zurück, wo Dimension 4 anspruchsvoll verwendet Algorithmen, um die Uhr Ihres Computers auf wenige Millisekunden Echtzeit einzustellen .

Sie können auch Ihren Computer Uhr gegen die Website überprüfen time.is :

Bild

Vielen Dank für Ihre ausführliche Antwort. Gut zu wissen, dass der Zeitaktualisierungsdienst von Windows möglicherweise bis zu 2 Sekunden deaktiviert ist! (Ich habe keine bessere Latenzzeit als 5 ms für die Zeitquelle, ich glaube, ich bin sogar weit davon entfernt!) Basj vor 5 Jahren 0
2) Ich bin nicht sicher, ob tatsächlich ein spezielles Hardwaregerät benötigt wird: Der eingebettete Echtzeit-Chip (RTC) meines Computers ist für meine Anwendung gut genug: In einem 2-Tage-Fenster bin ich fast sicher, dass die Zeitverschiebung <50 sein wird Millisekunden, das reicht mir. Basj vor 5 Jahren 0
3) Das einzige Problem für meine Anwendung besteht also darin, einen Weg zu finden, um die Zeit von einer Netzwerkquelle genau einzustellen. Ich kann die durchschnittliche Ping-Zeit selbst messen und diese subtrahieren usw. Gibt es eine Open-Source-Methode zum Herstellen einer Verbindung zu einem Zeitserver, möglicherweise mit Python? Basj vor 5 Jahren 0
Die 2 Sekunden sind immer noch nicht garantiert, sofern nicht alle Parameter in Ordnung sind. Wenn wir die oben gemessene Systemtaktdrift von 0,0448 ms / s als Beispiel nehmen, dauert eine Drift um 50 ms nur 1116 Sekunden = 18,6 Minuten. Einen Zeitserver in Python finden Sie unter [this] (https://stackoverflow.com/questions/12664295/ntp-client-in-python). harrymc vor 5 Jahren 0
0,0448 ms / s scheint ziemlich groß zu sein, dies würde eine Abweichung von 3,8 Sekunden pro Tag bewirken, wodurch der RTC in einem Monat um fast 2 Minuten, in einem Jahr um 23 Minuten verkürzt würde! Ich habe das noch nie erlebt, selbst mit meinem ersten 286-Computer in den 90ern;) Basj vor 5 Jahren 1
Der Computer wird nach jedem Neustart oder mindestens einmal pro Tag neu synchronisiert, sodass sich keine enorme Drift ergibt. harrymc vor 5 Jahren 0
In den 90er Jahren hatte ich kein Internet und manuell nur einmal oder zweimal manuell synchronisiert, die Drift war nicht mehr als 2 Minuten pro Jahr (IIRC). Basj vor 5 Jahren 1
Dieser Artikel wurde im Jahr 2012 verfasst. Seitdem haben sich die CPUs inzwischen beschleunigt, sicherlich seit den 90er Jahren. Bei viel mehr Taktschritten pro Sekunde häufen sich die Fehler möglicherweise schneller an. Andererseits ist es auch möglich, dass die heutige Uhrenhardware ausgereifter ist als im Jahr 2012 und die Drift automatisch verarbeitet. Ich kenne jedoch keine relevanten Daten. Microsoft ist stolz auf eine viel bessere Taktgenauigkeit mit Windows 10 / Server 2016. Dies könnte zum Teil auf eine bessere Hardware zurückzuführen sein, ähnlich wie wenn Microsoft UEFI bei allen Herstellern mit Windows 10 erzwungen hat. harrymc vor 5 Jahren 0
Ich habe einen Verweis auf einen Artikel hinzugefügt, der die Genauigkeit der Systemuhr unter Windows beschreibt (was mit Ihren eigenen Beobachtungen übereinstimmt), sowie einen zweiten Teil für ein Tool, das die Uhr korrekt halten soll, und ein weiteres Tool zur Überprüfung des Uhrenfehlers. harrymc vor 5 Jahren 0
1
Basj

Dies ist ein Versuch der Zeiteinstellung in Python gemäß einem NTP-Server mit Kompensation der Auslösezeit des Pakets zwischen dem Zeitserver und mir (siehe Taktsynchronisationsalgorithmus ):

NTPSERVER, PORT = 'pool.ntp.org', 123  from contextlib import closing from socket import socket, AF_INET, SOCK_DGRAM, SOCK_STREAM import struct, time, sys, datetime import win32api # pip install pywin32  t0 = time.time() with closing(socket(AF_INET, SOCK_DGRAM)) as s: s.sendto('\x23' + 47 * '\0', (NTPSERVER, PORT)) # see https://stackoverflow.com/a/26938508 msg, address = s.recvfrom(1024) # and https://stackoverflow.com/a/33436061 t3 = time.time()  unpacked = struct.unpack("!12I", msg[0:struct.calcsize("!12I")]) # ! => network (= big-endian), 12 => returns 12-tuple, I => unsigned int  t1 = unpacked[8] + float(unpacked[9]) / 2**32 - 2208988800L # see https://tools.ietf.org/html/rfc5905#page-19 t2 = unpacked[10] + float(unpacked[11]) / 2**32 - 2208988800L # and https://tools.ietf.org/html/rfc5905#page-13  offset = ((t1 - t0) + (t2 - t3)) / 2 # https://en.wikipedia.org/wiki/Network_Time_Protocol#Clock_synchronization_algorithm roundtrip = (t3 - t0) - (t2 - t1)  print "Local computer time (t0) %.3f" % t0 print "NTP server time (t1, receive timestamp) %.3f" % t1  print "NTP server time (t2, transmit timestamp) %.3f" % t2 print "Local computer time (t3) %.3f" % t3 print "Offset %.1f ms" % (offset * 1000) print "Local -> NTP server -> local roundtrip time %.1f ms" % (roundtrip * 1000) print "New local computer time %.3f" % (t3 + offset)  dt = datetime.datetime.utcfromtimestamp(t3 + offset) win32api.SetSystemTime(dt.year, dt.month, dt.isocalendar()[2], dt.day, dt.hour, dt.minute, dt.second, dt.microsecond / 1000) 

Beispiel für die Ausgabe:

Local computer time (t0) 1528290913.275 NTP server time (t1, receive timestamp) 1528290913.297 NTP server time (t2, transmit timestamp) 1528290913.297 Local computer time (t3) 1528290913.340 Offset -10.5 ms Local -> NTP server -> local roundtrip time 65.0 ms New local computer time 1528290913.330 

Hinweis:

  • Wir hätten ntplib auch verwenden können, aber hier ist der Vorteil, dass wir gelernt haben, wie es intern funktioniert, und der Code ist sowieso nicht lang!

  • In diesem Fall t1 == t2(das war während meiner Tests immer der Fall ), t3 + offset = t1 + (t3 - t0)/2ergibt diese Berechnung genau das gleiche Ergebnis wie bei der vorherigen Bearbeitung dieser Antwort tcompensated = t + (now-start) / 2.

  • ((t1 - t0) + (t2 - t3)) / 2 gibt wirklich den Versatz zwischen lokaler Uhr und NTP-Serveruhr an. In der Tat nennen wir die Einwegzeit tripfür ein Paket, um vom lokalen Computer zum NTP-Server zu gelangen. Dann t1 = t0 + offset + tripund t3 = t2 - offset + trip. Dann ((t1 - t0) + (t2 - t3)) / 2 = (offset + trip + offset - trip) / 2 = offset.

Es ist zu beachten, dass die Fähigkeit des Betriebssystems, die Zeit in ms zu berichten, stark variiert. Ein einzelner Tick in Windows kann beispielsweise zwischen 10 und 30 ms liegen. Wenn Sie also in einer Schleife readtime `t0 = time.time ()` aufgerufen haben, sollte die gemeldete Zeit zwischen zwei Aufrufen gleich bleiben und dann vorwärts springen. Dies hängt von der Anzahl der Schleifen ab, die Python innerhalb der Tick-Anzahl des Betriebssystems abschließen konnte. HackSlash vor 5 Jahren 1
@HackSlash Netter Fang! \ @Basj Kein Wunder, dass Ihre Verzögerungen in [Vielfachen von 16ms] liegen (https://stackoverflow.com/q/1938048/#comment10567994_1938096) (32 & 65 in Revision 1 & 2). guest-vm vor 5 Jahren 0
Es ist in verschiedenen Windows-Versionen unterschiedlich. Sieht aus, als wäre es in Linux konfigurierbar: https://elinux.org/Kernel_Timer_Systems HackSlash vor 5 Jahren 0