6

Для проекта, описанного в разделе «Применение этого вопроса», мне нужна наилучшая возможная точность часов, и одним из решений является точная синхронизация часов реального времени компьютера.

  1. Какова задокументированная точность выполнения синхронизации с настройкой даты / времени в Windows 7 > Интернет-время> Изменить параметры> Обновить сейчас ...?

  2. Точнее, компенсирует ли он пинг сервера времени?

    Пример:

    • сервер времени отправляет пакет, чтобы сказать, что это точно 12: 00: 00.000
    • скажем, средний пинг с моего компьютера на сервер времени составляет 93 мс (средний пинг, рассчитанный, скажем, в последнюю минуту)
    • пакет от сервера времени достигнет моего компьютера в 12: 00: 00.093, верно?
    • тогда Windows должна установить время 12: 00: 00.093, а не 12: 00: 00.000, верно?
  3. Если нет, то существует ли программное обеспечение Windows, которое может выполнять синхронизацию часов реального времени с компенсацией пинга или другим видом повышенной точности?

2 ответа2

6

Очень интересный вопрос, поэтому я покопался в нескольких источниках.

Статья II: Регулировка системного времени Арно Лентфера от 2012 года (PDF), содержит много измерений и говорит следующее:

Синхронизация Windows с сетевым эталоном времени оказалась не очень точной. В частности, версии Windows VISTA и 7, похоже, утратили некоторые возможности по неизвестной причине. К сожалению, по этому вопросу не так много информации, и мало доступной информации, в основном, говорит о том, что не следует ожидать, что синхронизация времени Windows будет более точной, чем несколько секунд, и что в поведении SetSystemTimeAdjustment может произойти сбой в отношении значения значения dwTimeAdjustment. Только Windows 8 теперь преодолела эти недостатки, и ее системное время работает так же, как в Windows XP.

В статье отмечается, что в системные часы встроены небольшие ошибки, которые в целом не сохраняют точное время. Анализ показывает, что при использовании исследуемого оборудования системное время может увеличиться на 0,0448 мс / с по сравнению с реальными часами.

В статье Microsoft « Граница поддержки для настройки службы времени Windows для высокоточных сред» делается вывод о том, что лучшее, на что вы можете надеяться, это 1 миллисекунда с использованием Windows 10 и Windows Server 2016 в жестко контролируемой среде. Документация Microsoft детализирует требования для точности в 1 секунду, 50 мс и 1 мс, в то время как старые операционные системы пытаются удержаться в течение нескольких секунд.

В отличие от этого, Domain Time II достигает доказуемой точности менее миллисекунды и при использовании протокола точного времени IEEE 1588-2008 (PTP) может достигать низкой точности с точностью до двузначного микросекунды.

Статья Microsoft обрисовывает в общих чертах требования для данной точности:

Точность цели: 1 секунда (1сек)

  • Целевая система должна работать под управлением Windows 10, Windows Server 2016.
  • Целевая система должна синхронизировать время с высокоточным источником времени NTP
  • Системы Windows в иерархии NTP должны быть правильно настроены
  • Совокупная задержка односторонней сети между целью и источником не должна превышать 100 мс.

Целевая точность: требования 50 миллисекунд

  • Целевой компьютер должен иметь время ожидания сети более 5 мс между источником времени.
  • Целевая система должна быть не дальше, чем пласт 5 от высокоточного источника времени
  • Целевая система должна быть в пределах 6 или менее сетевых прыжков от высокоточного источника времени
  • Среднесуточная загрузка ЦП на всех уровнях не должна превышать 90%
  • Для виртуализированных систем средняя загрузка ЦП хоста за один день не должна превышать 90%.

Примечание: Запустите w32tm /query /status из командной строки, чтобы увидеть стратум.

Точность цели: 1 миллисекунда

  • Целевой компьютер должен иметь задержку сети не более 0,1 мс между источником времени
  • Целевая система должна быть не дальше, чем пласт 5 от высокоточного источника времени
  • Целевая система должна быть в пределах 4-х или менее сетевых скачков от высокоточного источника времени
  • Среднее использование ЦП в течение одного дня в каждом слое не должно превышать 80%
  • Для виртуализированных систем средняя загрузка ЦП хоста за один день не должна превышать 80%.

Если вам интересно, что такое слой, важно понимать, что NTP является иерархической, полуслойной системой уровней часов. Следующая диаграмма взята из статьи Network Time Protocol (NTP). Насколько она точна? Дэйв Голт (PDF):

Иерархия NTP

В статье также перечислены факторы, которые могут отрицательно повлиять на качество отображаемого времени:

  • Скорость (задержка) интернет-соединения.
  • Страты серверов времени, выбранных для синхронизации.
  • Расстояние сигнала от серверов (включая и с орбитальных спутников).
  • Качество и сложность используемого программного алгоритма.
    • Использует ли он более одного сервера?
    • Вычисляет ли задержка туда-обратно?
    • Это компенсирует систематический уклон?
    • Сообщает ли он о точности синхронизации?

Это вышло так долго, как я хотел. Но чтобы ответить на ваши вопросы:

Какова задокументированная точность выполнения синхронизации с настройкой даты / времени в Windows 7> Интернет-время> Изменить параметры> Обновить сейчас ...?

Это зависит от того, какое из требований для вышеуказанной целевой точности применимо к вашей установке. Если ни одно из вышеуказанных требований не применимо, ваше время может быть на 2 секунды меньше реального времени. Сервер времени NTP также может иметь неточность, в зависимости от его слоя. Также обратите внимание, что при использовании часов реального времени компьютера вы будете испытывать постоянный дрейф, который вы можете измерить (или который можно получить у производителя).

Точнее, компенсирует ли он пинг сервера времени?

Ответ - нет. Это зависит от вас, помните, что время пинга не может оставаться постоянным.

Вывод: если вам нужна большая точность времени, чем это обеспечивают серверы времени в Интернете, вам необходимо приобрести и использовать специализированное устройство синхронизации.

Интересно прочитать статью «Алгоритмическая торговля» Precision Timekeeping в Windows, в которой объясняется, как Microsoft улучшила свои внутренние функции хронометража и насколько точны системные часы:

образ

Полезные инструменты для установки или проверки времени компьютера

Если вы хотите синхронизировать время вашего компьютера с низкоуровневыми серверами через Интернет, вы можете использовать бесплатный продукт Dimension 4 :

В Dimension 4 используется низкоуровневый интернет-протокол, называемый SNTP, для соединения со специальными интернет-серверами времени, которые поддерживают оставшуюся часть времени в Интернете в течение последних 20+ лет. Эти серверы времени обычно имеют прямой доступ к своему собственному источнику времени или напрямую подключены к другим серверам времени в Интернете.

В указанном вами интервале Dimension 4 подключается к одному из этих серверов времени в Интернете, который вы можете выбрать из полного списка, встроенного в Dimension 4. Затем сервер времени отправляет правильное время обратно на ваш компьютер, где Dimension 4 использует сложные алгоритмы для правильной настройки часов вашего компьютера с точностью до нескольких миллисекунд реального времени.

Вы также можете проверить свои компьютерные часы по веб-сайту time.is :

образ

1

Это попытка установки времени в Python, согласно NTP-серверу, с компенсацией времени прохождения пакета между сервером времени и мной (см. Алгоритм синхронизации часов):

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)

Пример вывода:

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

Замечания:

  • Вместо этого мы могли бы использовать ntplib , но здесь преимущество в том, что мы узнали, как он работает внутри, и код все равно не длинный!

  • В случае t1 == t2 (это всегда было верно во время моих тестов), тогда t3 + offset = t1 + (t3 - t0)/2 , и это вычисление дает тот же результат, что и предыдущее редактирование этого ответа tcompensated = t + (now-start) / 2 .

  • ((t1 - t0) + (t2 - t3)) / 2 действительно дает смещение между локальными часами и часами сервера NTP. В самом деле, давайте назовем trip в одностороннее время для отправки пакета с локального компьютера на NTP-сервер. Тогда t1 = t0 + offset + trip и t3 = t2 - offset + trip . Тогда ((t1 - t0) + (t2 - t3)) / 2 = (offset + trip + offset - trip) / 2 = offset .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .