PTP-сервер дома. Часть 2

PTP-сервер дома. Часть 2

Семён сохраняет полезное_)

Сегодня продолжим разговор о самодельном PTP‑сервере дома. В прошлый раз я упомянул, что точность полученного решения была не лучшей после одного часа работы. Поэтому далее я решил улучшить точность.

Из‑за того что я живу неподалёку от стратегического объекта, точность часов периодами, когда «защитники отечества» включают «глушилку», скачет на 4–5 минут. Поэтому на машине, имитирующей клиента, я отключил Chrony, чтобы не было конфликта при измерении.

Для фиксации таких случаев я написал простой скрипт, который ходит на мой NTP‑сервер с GNSS‑модулем и на сервер NTP из пула, а затем отправляет данные в InfluxDB. В нём удобно смотреть графики.

Так, благодаря данным по Offset, можно увидеть, когда «глушилка» работает. Это ещё заметно по времени от NTP‑сервера: оно уходит на 4–5 минут (если уж точно — на 272–277 секунд). Ниже будет скриншот.

Также теперь все команды запуска строго выполняются с realtime priority:

sudo ts2phc -c enp6s0 -f /etc/ts2phc.conf &
sudo chrt -f 98 ptp4l -i enp6s0 -f /etc/ptp4l.conf -m

Далее рассмотрим конфиг ts2phc.conf на мастер‑машине:

cat /etc/ts2phc.conf

[enp6s0]
ts2phc.channel 0
ts2phc.extts_polarity both
ts2phc.pin_index 2

[global]
logging_level 6
first_step_threshold 1

ts2phcэто утилита из пакета linuxptp (Precision Time Protocol для Linux), которая синхронизирует системное время с аппаратными часами (PHC — PTP Hardware Clock) 

через сигналы таймстампов (timestamping) на сетевых интерфейсах.

Файл состоит из двух секций:

  • [enp6s0] — настройки для конкретного сетевого интерфейса;
  • [global] — глобальные параметры утилиты.

Секция [enp6s0] (настройки интерфейса)

  • ts2phc.channel 0 — указывает номер канала (индекс) для работы с таймстампами на интерфейсе.
  • ts2phc.extts_polarity both — определяет полярность внешних сигналов таймстампа (EXTTS).
  • both — учитывает оба фронта сигнала (подъём и спад).
  • Альтернативы: rising (только подъём), falling (только спад).
  • Полезно для интерфейсов, поддерживающих двустороннюю синхронизацию.
  • ts2phc.pin_index 2 — задаёт номер пина (вывода) на сетевой карте, к которому подключён внешний сигнал таймстампа.

Секция [global] (глобальные настройки)

  • logging_level 6 — уровень детализации логов.
  • 6 — максимально подробный вывод (отладка).
  • first_step_threshold 1 — пороговое значение (в секундах) для первого шага синхронизации.
  • Если разница между системными часами и PHC превышает 1 секунду, ts2phc выполнит коррекцию скачком (step).
  • При меньших расхождениях используется плавная подстройка (slew).
  • Значение 1 — компромисс между скоростью и плавностью синхронизации.

Эти параметры я взял из документации:

https://linuxptp.nwtime.org/documentation/configs/ts2phc-generic/

Единственное, я решил не ставить ts2phc.pulsewidth 100000000, ибо данная настройка некорректна. Лучше оставить значение, используемое по умолчанию (500 мс), и не описывать его.

Теперь рассмотрим конфиг для ptp4l:

cat /etc/ptp4l.conf

[global]

# Основные настройки
gmCapable 1                  # Устройство может быть Grandmaster (главным источником времени). 1 — включено; 0 — отключено.
priority1 248               # Приоритет 1‑го уровня (0–255). Чем меньше значение, тем выше приоритет.
priority2 248               # Приоритет 2‑го уровня (0–255). Чем меньше значение, тем выше приоритет.
clockClass 248              # Класс часов (0–255). Определяет «качество» источника времени.
clockAccuracy 0xFE           # Точность часов (в шестнадцатеричном формате).
offsetScaledLogVariance 0xFFFF # Масштабированная логарифмическая дисперсия смещения.
assume_two_step 1          # Использовать двухшаговый режим PTP (обмен сообщениями Sync + Follow_Up).
follow_up_info 1           # Отправлять дополнительную информацию в Follow_Up‑сообщениях.
transportSpecific 0x1        # Поле Transport Specific (в заголовке PTP). 0x1 — зарезервировано для специфичных транспортных механизмов.
network_transport L2       # Транспортный уровень: Ethernet (Layer 2).
delay_mechanism E2E          # Механизм измерения задержки: End‑to‑End (через сообщения Delay_Req/Delay_Resp).
ptp_dst_mac 01:80:C2:00:00:0E # MAC‑адрес назначения для PTP‑фреймов (стандартный групповой адрес для PTP over Ethernet).

# Фиксированный мастер
BMCA noop                  # Отключает алгоритм BMCA (Best Master Clock Algorithm). Устройство не будет участвовать в выборе Grandmaster — оно либо мастер, либо ведомый.
serverOnly 1               # Режим «только сервер» (мастер).
inhibit_announce 1         # Запрещает отправку Announce‑сообщений. Используется, когда мастер не должен участвовать в BMCA.
asCapable true              # Устройство поддерживает AS (Announce Suppression) — подавление избыточных Announce‑сообщений.
inhibit_delay_req 1      # Запрещает отправку Delay_Req‑сообщений. Актуально для мастера, который не измеряет задержки к ведомым.
path_trace_enabled 1      # Включает отслеживание пути (Path Trace) — запись списка узлов в PTP‑сообщениях.
logSyncInterval -3         # Логарифмический интервал отправки Sync‑сообщений (в секундах). -3 → 0,125 с (8 Sync‑сообщений в секунду). Чем меньше число, тем чаще отправляются Sync.
syncReceiptTimeout 3       # Таймаут ожидания Sync‑сообщений от мастера (в кратных интервалах logSyncInterval). Если за 0,375 с не получено Sync, считается потеря связи.
neighborPropDelayThresh 800 # Порог задержки (в наносекундах) для соседских узлов. Если задержка превышает 800 нс, могут активироваться механизмы коррекции.
min_neighbor_prop_delay -20000000 # Минимальная задержка (в наносекундах). Отрицательное значение (-20 000 000 нс = -20 мс) может использоваться для компенсации системных задержек.

Конфиг тестовый и ещё будет исправлен со временем. Но уже с этим конфигом я получил за 90 часов следующий результат:

Master offset: среднее = −0,00 нс, мин = −22 нс, макс = +18 нс
Freq:        среднее = 50 279,55 ppb, мин = 49 937 ppb, макс = 50 614 ppb
Path delay:   среднее = −8,56 нс, мин = −13 нс, макс = −5 нс

1. Master offset (смещение относительно мастера)

  • Среднее: −0,00 нс
  • Мин.: −22 нс
  • Макс.: +18 нс

Разброс ±22 нс — очень хороший результат для большинства применений:

  • Для телекома/5G часто требуют < 100 нс; здесь — в 2 раза лучше.

Вывод: смещение стабильно мало — отлично.

2. Freq (частота коррекции, в ppb — частях на миллиард)

  • Среднее: 50 279,55 ppb
  • Мин.: 49 937 ppb
  • Макс.: 50 614 ppb

Высокое среднее (50 тыс. ppb) говорит о значительном изначальном расхождении частот. Разброс ~677 ppb (50 614 − 49 937) — умеренная нестабильность. Для «обычного» железа — приемлемо.

3. Path delay (задержка пути)

Среднее: −8,56 нс

Мин.: −13 нс

Макс.: −5 нс

Оценка:

Разброс всего 8 нс (от −13 до −5) — очень стабильно.

Абсолютные значения малы (< 13 нс) — значит, сеть и оборудование работают предсказуемо. Задержка пути стабильна и мала — отлично.

Вывод и планы работ дальше

90 часов — неплохо, но для оценки дрейфа лучше смотреть 1–7 дней. Поэтому буду в основном тестировать на тесте 7 дней. Далее хочу добиться чтобы не нужно было отключать chrony и по сети шло точное время.




Report Page