Какова точность синхронизации сервера времени Windows? (и компенсирует ли это время пинга?)

1363
Basj

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

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

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

    Пример:

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

6
Windows так же точен, как источник времени NTP. Таким образом, ваш фактический вопрос в том, насколько точен в среднем «time.nist.gov». Существует оборудование GPS, которое можно использовать для чрезвычайно точных источников времени, а большое время пинга может привести к смещению системных часов. Если у вас высокий пинг к определенному источнику NTP, вы должны изменить его на другой. Пинг! = Латентность. Высокий пинг, при котором используется пакет определенного типа, не означает, что пакет другого типа займет одинаковое количество времени. Почти гарантировано, что это НЕ БУДЕТ. Ramhound 6 лет назад 0
@ Ramhound Я думаю, такой известный сервер времени будет иметь очень хорошую точность. Вопрос в том, компенсируется ли время пинга сервером или Windows или нет? Basj 6 лет назад 0
Войдите в Root Access. Это обсуждение превысило раздел комментариев. Высокий пинг сам по себе НЕ вызовет проблемы с NTP. Ramhound 6 лет назад 0
Время чтения: [# 1] (https://serverfault.com/q/379739), [# 2] (https://en.wikipedia.org/wiki/Network_Time_Protocol#Windows_Time_service), [# 3] (https: //docs.microsoft.com/en-us/windows-server/networking/windows-time-service/support-boundary) guest-vm 6 лет назад 0
Спасибо @ guest-vm. # 2 говорит: `Microsoft говорит, что служба W32Time не может надежно поддерживать время синхронизации в диапазоне от 1 до 2 секунд. Если требуется более высокая точность, Microsoft рекомендует использовать другую реализацию NTP. О Server 2003 и Vista. Также «Windows Server 2016 теперь поддерживает точность времени 1 мс при определенных условиях работы». Что является верным для Windows 7 по вашему мнению? Basj 6 лет назад 0
№ 3 заявляет `Точность цели: 50 миллисекунд [...] требований для достижения точности 50 мсек. [...] Целевой компьютер должен иметь время задержки в сети между источниками времени, превышающее 5 мсек. Вау, это невозможно для меня ... У меня не будет пинга 5 мс до сервера времени Windows ... У кого есть пинг 5 мс до этого сервера @ guest-vm? Basj 6 лет назад 0
Разве нет стороннего бесплатного программного обеспечения для Windows, которое я мог бы установить, который обрабатывает все это правильно? Basj 6 лет назад 0
@Basj * вам * нужно * использовать службу времени Windows или вместо нее вы могли бы использовать `ntp` для окон? user3788685 6 лет назад 0
@ user3788685 Я могу использовать `ntp` для Windows (если он доступен в двоичных файлах для Windows 7), и если он обрабатывает хорошую синхронизацию + компенсацию ping (с точностью <50 мс) Basj 6 лет назад 0
Проверьте мои [сообщения] (https://chat.stackexchange.com/transcript/message/44933091). guest-vm 6 лет назад 0

2 ответа на вопрос

6
harrymc

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

Статья Часть 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 hierarchy

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

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

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

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

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

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

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

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

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

image

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

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

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

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

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

image

Спасибо за ваш подробный ответ. Полезно знать, что служба обновления времени Windows может быть отключена до 2 секунд! (У меня не больше 5 мс задержки в сети к источнику времени, я думаю, что я даже далек от этого!) Basj 6 лет назад 0
2) Я не уверен, что специализированное аппаратное устройство действительно необходимо: встроенный чип реального времени моего компьютера (RTC) достаточно хорош для моего приложения: в двухдневном окне я почти уверен, что смещение времени будет <50 миллисекунд, мне этого достаточно. Basj 6 лет назад 0
3) Поэтому единственная проблема для моего приложения - найти способ точно установить время из сетевого источника. Я сам могу измерить среднее время пинга, вычесть это и т. Д. Есть ли способ с открытым исходным кодом для подключения к серверу времени, возможно, с помощью Python? Basj 6 лет назад 0
2 секунды все еще не гарантированы, если все параметры не являются достаточно хорошими. Если мы возьмем в качестве примера вышеупомянутый измеренный дрейф системных часов 0,0448 мс / с, дрейф на 50 мс займет всего 1116 секунд = 18,6 минут. Сервер времени в Python см. В [this] (https://stackoverflow.com/questions/12664295/ntp-client-in-python). harrymc 6 лет назад 0
0,0448 мсек / с кажется довольно большим, он будет дрейфовать по 3,8 секунды в день, делая RTC почти на 2 минуты в 1 месяц, на 23 минуты в 1 год! Я никогда не испытывал этого, даже с моим первым компьютером 286 в 90-х;) Basj 6 лет назад 1
Компьютер повторно синхронизируется после каждой перезагрузки или, по крайней мере, один раз в день, поэтому у вас не будет огромного накопленного дрейфа. harrymc 6 лет назад 0
В 90-х у меня не было Интернета, и я выполнял повторную синхронизацию вручную один или два раза в год, дрейф не превышал> 2 минут в год IIRC. Basj 6 лет назад 1
Эта статья была написана в 2012 году. Процессоры теперь ускорились с тех пор, и, конечно, с 90-х годов. При большем количестве тактовых импульсов в секунду ошибка может накапливаться быстрее. С другой стороны, также возможно, что сегодняшнее аппаратное обеспечение для часов более изощренно, чем в 2012 году, и автоматически обрабатывает отклонения, но я не знаю каких-либо соответствующих данных. Microsoft гордится гораздо лучшей тактовой частотой с Windows 10 / Server 2016, и это может быть частично из-за лучшего оборудования, почти так же, как когда Microsoft навязывала UEFI всем производителям с Windows 10. harrymc 6 лет назад 0
Я добавил ссылку на статью, описывающую точность системных часов в Windows (которая согласуется с вашими собственными наблюдениями), а также вторую часть, посвященную инструменту, который поможет сохранить правильные часы, и еще один инструмент для проверки ошибки часов. harrymc 6 лет назад 0
1
Basj

Это попытка установки времени в 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.

Следует отметить, что способность ОС сообщать время в мс варьируется. Например, один тик в Windows может быть между 10-30 мс. Поэтому, если вы вызвали readtime `t0 = time.time ()` в цикле, вы должны увидеть, что сообщаемое время остается неизменным между двумя вызовами, а затем переходить вперед. Это зависит от количества циклов, которые Python может выполнить за счет тактов ОС. HackSlash 6 лет назад 1
@HackSlash Отличный улов! \ @Basj Неудивительно, что ваши задержки в [кратны 16 мс] (https://stackoverflow.com/q/1938048/#comment10567994_1938096) (32 и 65 в редакции 1 и 2 соответственно). guest-vm 6 лет назад 0
Это отличается в разных версиях Windows. Похоже, что это настраивается в Linux: https://elinux.org/Kernel_Timer_Systems HackSlash 6 лет назад 0