В документации NTP говорится:
В обычных условиях ntpd регулирует часы небольшими шагами, чтобы шкала времени была фактически непрерывной и без разрывов - http://doc.ntp.org/4.1.0/ntpd.htm
Однако на практике я заметил совсем другое. Если я вручную изменю системное время назад или вперед на 5 или 10 секунд, запустите ntpd
, Я заметил, что он настраивает часы одним выстрелом.
Например, с этим кодом:
#!/usr/bin/env python
import time
last = time.time()
while True:
time.sleep(1)
print time.time() - last
last = time.time()
Когда я впервые меняю время, я замечаю что-то вроде:
1.00194311142 8.29711604118 1.0010509491
Затем, когда я запускаю NTPd, я вижу что-то вроде:
1.00194311142 -8.117301941 1.0010509491
Есть ли способ заставить ntpd
вносить корректировки более мелкими шагами?
Проходящий ntpd -x
при запуске демон сохранит очень небольшие изменения: не будет шага часов. Конечно, установка поворота означает только то, что на корректировку больших промежутков может потребоваться время, если вы начнете с очень далекого от правильного времени времени. Цитирование нескольких абзацев со страницы руководства
В обычных условиях ntpd регулирует часы небольшими шагами, чтобы шкала времени была непрерывной и без разрывов. В условиях экстремальной перегрузки сети джиттер задержки приема-передачи может превышать три секунды, а расстояние синхронизации, равное половине задержки приема-передачи плюс условия бюджета ошибок, может стать очень большим. Алгоритмы ntpd отбрасывают смещения выборки, превышающие 128 мс, если интервал, в течение которого смещение выборки не меньше 128 мс, не превышает 900 с. Первый отсчет после этого, независимо от смещения, переводит часы на указанное время. На практике это снижает частоту ложных тревог, когда часы идут по ошибке, до исчезающе низкого уровня.
Поскольку вы настроили свои часы на 10 секунд, вы определенно превысили область того, что ожидал увидеть NTP, то есть шаг.
В результате такого поведения, после того, как часы были установлены, они очень редко отклоняются более чем на 128 мс, даже в крайних случаях перегрузки сетевого пути и джиттера. Иногда, в частности при первом запуске ntpd, ошибка может превышать 128 мс. Иногда это может привести к тому, что часы будут переведены в обратном направлении, если местное время в будущем будет больше 128 секунд относительно сервера. В некоторых приложениях такое поведение может быть неприемлемым. Если параметр -x включен в командную строку, часы никогда не будут шагать, и будут использоваться только корректировки нарастания.
Перед тем, как принять решение об использовании опции -x, необходимо внимательно изучить проблемы. Максимально возможная скорость нарастания ограничена 500 частями на миллион (PPM) как следствие принципов корректности, на которых основаны протокол и алгоритм NTP. В результате локальным часам может потребоваться много времени, чтобы прийти к приемлемому смещению, около 2000 с за каждую секунду, когда часы выходят за пределы допустимого диапазона. В течение этого интервала локальные часы не будут согласованы с другими сетевыми часами, и система не может использоваться для распределенных приложений, которым требуется правильно синхронизированное сетевое время.
Бег ntpdate
перед запуском основных служб, а затем запуском ntpd -x
после этого может быть хорошим комбинированным решением, чтобы убедиться, что какие-либо важные шаги выполняются до того, как потребуется бесшаговое хронометрирование.
Если это код, который вы хотите написать, это может быть ответ, который вы ищете: https://stackoverflow.com/questions/1205722/how-do-i-get-monotonic-time-durations-in-python