Назад | Перейти на главную страницу

Что такое NTP-дисперсия и как ею управлять?

Мы развертываем серверы Ubuntu 14.04 в изолированных сетях, на которых запущен ntpd 4.2.6p5, настроенный на использование нескольких серверов NTP, предоставленных клиентами (без доступа к pool.ntp.org). Наши немые терминальные клиентские устройства работают под управлением старой версии BusyBox (1.00-rc2) и ntpclient 2010 от Ларри Дулиттла.

Эта установка отлично работает в течение многих лет, но недавно мы столкнулись с препятствием с новым клиентом. Они предоставили нам 5 внутренних адресов NTP-серверов, которые, кажется, отлично работают сами по себе, насколько это возможно. ntpdate-debian касается сервера Linux. Однако на стороне BusyBox ntpclient жалуется на "Слишком высокая дисперсия". Из вывода отладки, ntpclient получает «1217163.1» от сервера NTP, но максимальное поддерживаемое значение является абсолютным (65536).

$ /usr/sbin/ntpclient -s -i 15 -h 10.17.162.250 -d
Configuration:
  -c probe_count 1
  -d (debug)     1
  -g goodness    0
  -h hostname    10.17.162.250
  -i interval    15
  -l live        0
  -p local_port  0
  -q min_delay   800.000000
  -s set_clock   1
  -x cross_check 1
Listening...
Sending ...
recvfrom
packet of length 48 received
Source: INET Port 123 host 10.17.162.250
LI=0  VN=3  Mode=4  Stratum=4  Poll=4  Precision=-20
Delay=60745.2  Dispersion=1346801.8  Refid=10.31.10.21
Reference 3668859928.942079
(sent)    3668859928.708371
Originate 3668859928.708371
Receive   3668859928.963271
Transmit  3668859928.963369
Our recv  3668859928.708371
Total elapsed:      0.00
Server stall:      93.09
Slop:             -93.09
Skew:          255443.94
Frequency:             0
 day   second     elapsed    stall     skew  dispersion  freq
42463 56728.708  rejected packet: abs(DISP)>65536

Все эти устройства находятся в одной локальной сети, поэтому, честно говоря, я ошеломлен. Даже в ужасе.

Вот ntpq -pn вывод с сервера Ubuntu 14.04:

user@host:~$ ntpq -pn
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 127.127.1.0     .LOCL.          10 l 1025   64    0    0.000    0.000   0.000
 10.17.162.249   10.17.6.10       5 u   23 1024   37    0.865  1381.07 697.260
 10.31.10.22     .LOCL.           1 u 1044 1024   17   29.586  -838.06 397.342
 10.17.6.10      10.31.10.21      4 u 1065 1024   17    0.366  105.245 402.999
*10.31.10.21     132.246.11.238   3 u    5 1024   37   29.418  794.292 616.796
 10.17.6.11      10.31.10.21      4 u 1038 1024   17    0.408  120.030 381.058

Мои вопросы:

  1. Что такое дисперсия и что может изменить ее ценность?
  2. Какие команды я могу запустить, чтобы получить более подробную информацию с серверов NTP?
  3. Может ли ошибка лежать на стороне сервера Ubuntu с неправильным ntp.conf? На самом деле ничего особенного там нет.
  4. Изменит ли в этом случае переход на хронику?

Я вижу некоторую путаницу в ответах здесь. Для начинающих, ntpclient, по крайней мере, в -s режим, не действует как полноценный клиент NTP, он только отправляет и принимает один пакет, поэтому нет "последних 8 полученных пакетов". На самом деле он вообще не оценивает собственную дисперсию.

Вместо этого значение, которое он печатает, представляет собой значение, называемое «корневой дисперсией» (rootdisp) в пакете, возвращаемом сервером, которое является оценкой общего количества ошибок / расхождений между этим сервером и правильным временем. Это вычисляется довольно просто: каждый NTP-сервер получает время либо от внешних часов (например, радио или GPS-приемника), либо от другого NTP-сервера. Если сервер получает свое время от внешних часов, его корневая дисперсия является расчетной максимальной ошибкой этих часов. Если он получает свое время от другого сервера NTP, его корневая дисперсия - это корневая дисперсия этого сервера. плюс рассеяние, добавленное сетевым соединением между ними.

Единственное замешательство здесь заключается в том, что, хотя ntpq и chrony отображают дисперсию и корневую дисперсию в секундах, на что люди привыкли смотреть, ntpclient отображает это в микросекунды. Тем не менее, значение 1217163 все еще довольно велико. Хороший NTP-сервер знает время за несколько миллисекунд; плохой в течение нескольких десятков или сотен миллисекунд. Ваш сообщает вам, что его времени можно доверять только с точностью до +/- 1,2 секунды.

Вы в любом случае можете заставить ntpclient синхронизироваться с этим сервером, передав -x 0 или -t опция (в зависимости от версии ntpclient), которая отключает проверки работоспособности NTP. Если вам нужно только приблизительное точное время (с точностью до нескольких секунд), этого может быть достаточно. Однако ntpclient довольно разумно отказывается синхронизироваться с таким плохим сервером. Ваш ntpq вывод на машине ubuntu показывает дрожание в сотни миллисекунд для всех его серверов, даже несмотря на то, что у них низкая задержка, что указывает либо на очень ненадежную сеть, либо на заговор все серверов, чтобы обеспечить нестабильное время или базовую проблему хронометража на самом сервере.

Меня также беспокоит, что сервер 10.31.10.22 рекламирует рефид LOCL (недисциплинированные местные часы), но имеют слой 1. Обычно локальные часы подделываются к слою из 10, так что они используются только в качестве источника синхронизации в крайнем случае, чтобы не дать стаду разойтись. Либо 10.31.10.22 неправильно настроен и предоставляет плохое время для остальной части сети, либо он дисциплинируется до хорошего времени какой-то программой вне контроля NTP, и в этом случае неправильная конфигурация просто заключается в том, что он рекламирует LOCL рефид; его следует переопределить, например, GPS или что бы там ни было.

Частичный ответ на вопрос «Что такое дисперсия?»:

Типичный обход NTP туда и обратно:

client |        | server
    t1 |------->| t2
    t3 |<-------| t4

Это дает два значения: смещение (разница во времени между клиентом и сервером) и задержка (существенно время прохождения сети) по следующим формулам:

offset= ((t4 - t3) + (t1 - t2)) / 2
delay = (t4 - t1) - (t3 - t2)

Клиент выбирает текущее смещение из последних 8 полученных пакетов, выбирая тот с наименьшей задержкой.

Те же 8 пакетов используются для расчета разброс путем выполнения средневзвешенного значения разницы этих 8 смещений с выбранным на последнем этапе, где задержка используется в качестве весового коэффициента, придавая больший вес меньшим задержкам. Это мера «разброса» значений, используемая для расчета качества сервера времени, особенно если у вас есть несколько вариантов на выбор.

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

Запустите ntpd и покажите ntpq -p от хоста с использованием всех пиров. Он выберет лучшие.

Согласно эта документация cisco, "разбросв секундах - это максимальная разница во времени, которая когда-либо наблюдалась между локальными часами и часами сервера ". С серверами ntp, которые не полностью сломаны, никогда не должно происходить сильного разброса. Единственный возможный сценарий - когда ваш клиент запускает ntp и пока доступны только его локальные часы. И даже тогда такая высокая дисперсия, как вы сообщаете, соответствует часам, которые отстают более чем на две недели.

Этого должно быть достаточно, чтобы убедиться, что локальные часы не слишком сильно отстают вначале (даже пара часов все еще будет приемлемой), либо путем настройки часов (и даже даты!) В BIOS, либо путем выдачи ntpdate один раз перед запуском ntpd на клиенте.