В сучасних комп’ютерах використовується кварцовий генератор тактів, майже такий саме, як в звичайних годинках які висять на стіні.
Все дуже чудово, так як цей генератор економічний, дрібний за розміром та що головне, дуже дешевий. Усі ці переваги, дозволяють домогтися доброго відношення ціня-якість.
А тепер поговоримо про мінуси такого пристрою, це велика похибка, що призводить до відхилення часу від 1сек до 1 хвилини на день. А що ще гірше, ця похибка змінюється від температури середовища.
Як же виправити цю ситуацію?
На думку приходить тільки одне, замінити не точний генератор тактів.
Давайте так і зробимо 🙂
Як відомо, найточніший генератор тактів — це атомний. А якщо бути точним, цезієвий (використовується атом цезію). Його похибка складає 1 сек за 30 мільйонів років. Але такий генератор дуже великий, напевно він трохи дорогий та складний в обслуговуванні.
Як же отримати майже таку ж саму точність, без витрат?
“Все вже вкрадено до нас” ну в сенсі, все вже готово, і нам не треба винаходити велосипед.
У 1985 року, програміст Девід Л. Міллс в університеті штату Делавер, розробив протокол синхронізації часу який працює в комп’ютерній мережі, та має назву Network Time Protocol (NTP). Розробка протоколу продовжується по сьогодення.
NTP працює наступним чином. Існує атомний годинник, до нього підключено комп’ютер, на цьому комп’ютері працює програмне забезпечення під назвою NTPD, яке в свою чергу поширює точний час за допомогою протоколу NTP до інших комп’ютерів в мережі.
В термінології NTP, атомний годинник називають Stratum 0.
А комп’ютер який на пряму під’єднано до годинника називають Stratum 1.
Усі хто отримує час з першого Stratum за допомогою мережі, іменуються від 2 до 15 (так як час може поширювати і наступний комп’ютер за Stratum 1).
Stratum 0 — Атомні часи, до яких під’єднується Stratum 1
Stratum 1 – Сервер який отримує час від джерела (пристрою) точного часу (stratum 0), спосіб підключення до stratum 0 може бути різний, в тому числі радіо зв’язок, але все ще не протокол NTP.
Startum 2-15 – Сервери які отримують час від серверу з попереднім стратумом, через мережеве з’єднання (протокол NTP). Чим більше стратум тим більше відстань від джерела, та тим гірше точність (різниця до мілісекунд, але для деяких програм така точність достатня).
Startum 16 — Сервер який не постачає точний час, так як сам не синхронізується.
Primary server — пристрій який надає точний час (наприклад приймач GPS)
Reference clock — звідки взято час (постачальник)
PPM — Part Per Million (1 мікросекунда)
PPS — Pulse Peer Second
Наприклад в GPS за звичай використовується два сигнали, один кожну секунду сповіщає точний час, а другий сигнал називається PPS, він використовується як генератор частоти, від чого, підвішується точність до наносекунд (між секундами генерується рівномірні тіки).
TOY — чип який зберігає час, коли комп’ютер вимкнено.
Jitter — статистика відхилень та затримок зв’язку з сервером NTP, дозволяє відсікати одиничні сплески в мережі, та мати уяву про якість зв’язку з конкретним сервером.
Round-trip dalay — скільки часу витрачається на відправлення та отримання відповіді.
Dispersion — максимальна різниця (кількість помилок) між локальним часом, та referecne clock.
Offset — різниця часу між вашим годинником, та джерелом часу. Чим довше ви синхронізуєтесь с джерелом, тим менше різниця. Це значення можна вважати як точність вашого часу в цю мить.
Popcorn Spike — технологія яка обробляє несподівані стрибки в мережі, які довелося подавити, за допомогою статистики jitter. Ефективно проти одноразового стрибка, але не в змозі протистояти тривалій низки сплесків. Має автоматично змінний поріг стрибка, по якому відкидаються пакунки.
Noise gate — пригнічувач, який може боротись з більш суровими сплесками мережі. Але має фіксований поріг відкидання, корисно коли сервер працює з поганим провайдером мережі інтернет, чи ви використовуєте модемне з’єднання.
Розповсюджувачі точного часу (до них під’єднується сервер який стане першим стратумом):
- Супутники GPS, GOES та ГЛОНАСС (на цих супутниках встановлені атомні часи)
- CDMA (на базових станціях розміщені GPS приймачі, сигнал точного часу інкапсулюється в протокол CDMA та передається до споживачів). Затримка такої передачі (точність) гірше, ніж отримувати прямий сигнал GPS.
- WWVB радіо (США)
- WWV радіо (США)
- DCF77 радіо (Європа)
- MSF радіо (Великобританія)
- CHU радіо (Канада)
- LORAN-C
- Мережеві модеми (NIST та USNO (Америка), PTB (Німеччина), NPL (Великобританія))
Peer distance — це відстань (в мережі) до сервера NTP, з якого береться час, вимірюється секундами. Якщо ця відстань сягне 1.5сек , цей сервер буде вважатись не якісним (не буде обраний для синхронізації), наприклад якщо сервер не доступний, так як при таких затримках виконувати прийнятну поправку часу стає майже неможливо.
Буває важливим послідовність restrict директив (напевно це помилка програми).
Якщо при запуску, NTP виявіть, що локальний час відрізняється від віддаленого джерела більш ніж на 1000 секунд, програма не виконує поправку, та вимикається, створивши запис у журналі роботи. Поріг вимкнення називається panic threshold. Проблема коли сіла батарея CMOS, чи якщо залізяка не має чип TOY.
В тому випадку, коли при запуску NTPd час відхилився на біль ніж 1000 сек, щоб демон не зачинявся, а робив поправку часу (швидко та на велику відстань) треба запускати NTPd з ключем -g , що дозволить зробити першу поправку часу на будь-який крок.
Майте на увазі, деякі програми чутливі до різкої зміни часу, особливо бази даних. Як приклад, програма VoltDB при запуску записує в журнал роботи, максимально можливий зсув часу, цю інформацію можна використати при налагоджені NTPd.
Щоб NTP не виключався при великій різниці часу, використайте директиву:
tinker panic 0
Директива TOS (type of service) надає можливість налаштовувати системні змінні. Наприклад змінити стратум для режиму orphan з 16 на 5, встановити значення orphanwait з 300 сек до 60 та інше.
Директива FUDGE дозволяє змінювати параметри reference clock. Наприклад вручну вказати стратум джерела часу, така собі хитрість.
Директива burst використовується як прискорювач опитування серверу який вважається доступним (reachable), а iburst коли сервер не доступний (unreachable), їх можна використовувати одночасно.
NTP робить поправку часу дуже повільно, так як є деякі програми, які можуть сказитися, від великого стрибка часу. Максимальний зсув часу за замовченням сягає 500PPM що складає 1.8 секунди в час.
В звичайному режимі клієнт відсилає 9 запитів послідовно до серверу NTP з інтервалом 16 сек., якщо використати директиву burst відсилається одночасно 6 запитів, очікуються 2 секунди і відсилаються останні запити, це як мінімум, прискорить першу синхронізацію, та готовність NTP (в середньому не більш ніж 10сек), без burst перша синхронізація позводиться через 4 хвилини. Ще це корисно коли сервер відповідає, але відповідь приходить з затримками чи не послідовно.
Згідно з правилами, та зауваженням на сайті pool.ntp.org, використання burst вважається поганим тоном, тому що, основна кількість серверів NTP це сервери (http, mail, ftp, router) волонтерів, і зайве навантаження на ці сервери небажано. Але в локальній мережі, ви можете використовувати burst, так як самі контролюєте навантаження.
Можливо під час включення комп’ютера, перед запуском баз даних та самого NTPd, має сенс запускати ntpdate який буде підводити локальний годинник згідно з віддаленим сервером, так як сам NTPd не робить великих стрибків часу (це можна налаштувати), щоб не призвести до збою деяких програм, чутливих до стрибків в часі.
Для збору статистики використовується регістр в 9 біт. Кожний запит зсуває регістр на 1 біт, вносячи новий на пусте місце (1 відповідь була, 0 відповіді не було).
Якщо вишикувалися підряд 4 біти, від цього робиться помітка сервер (1111) reachable чи (0000) unreachable.
Назва джерела з мережі – peers
Способи обробки – драйвер
Драйвер Undisciplined Local Clock – було створено для того, щоб мати сервер “точного” часу в локальні мережі, в тих випадках коли не має доступу до мережі інтернет, або до інших джерел точного часу взагалі. На роль такого серверу підходять такі системи, в яких як наймога точніший генератор частоти, наприклад машина DEC краще підходить для утримання точного часу, ніж Sun.
В цьому випадку треба встановити для такого серверу, наприклад 5-й стратум, клієнти побачать наш сервер, який з гордістю сповіщає клієнтів, що він 5-й стратум (але на справді це маячня). Точність такого серверу насправді погана, так як, кварцовий генератор частоти, який використовується в сучасних комп’ютерах, має відхилення (в день він може відхилятися від точного часу на 1сек, а в деяких випадках навіть на 1 хвилину, особливо коли в приміщені змінюється температура, чи поганий блок живлення). Також треба розуміти, що відсутність більш точного джерела часу з яким можна було б зрівнювати локальний годинник, виключає можливість використання drift файлу, але, якщо надати можливість попрацювати NTP з точним джерелом часу, з включеним drift фалом, а потім перемикнути в режим локального годинника, то базуючись на зібраній статистиці, NTP зможе виконувати поправку згідно з фалом, так як в ньому записано унікальний відбиток зміщення тактового генератору.
Для використання цього драйверу в файлі налаштувань, використайте директиви:
server 127.127.1.0
fudge 127.127.1.0 stratum 10
Перша директива, додасть апаратний годинник як джерело часу. Друга директива змінить за допомогою модифікатора fudge стратум нашого постачальника.
В цьому режимі немає сенсу додавати зовнішні джерела, так як локальний годинник має статус prefer. Але якщо вручну встановити напроти якогось зовнішнього серверу значення prefer, то локальний годинник буде вибиратись, тільки як резервне джерело при недосяжності зовнішнього серверу.
Undisciplined Local Clock використовувався до версії 4.2.2 (2006-06-08).
В сучасних версіях NTP, пропонують режим OrphanMode (але попередній режим, все ще можна задіяти). Увага! використовувати обидва драйвера одночасно не можливо.
Драйвер OrphanMode — це сучасний режим роботи в мережі з відмовостійкістю. В цьому режимі можна задати від одного та більше серверів, які будуть один з одним синхронізуватись в рамках однієї мережі, що дозволяє постачати клієнтам “точний” час, навіть в умовах відсутності зовнішнього джерела часу.
Для реалізації цього режиму треба в усіх цих серверах вказати директиву:
tos orphan 5
та перерахувати один одного в файлі налаштувань, що означає включення режиму Orphan (за замовченням змінна orphan має значення 16) та присвоєння серверу 5-го стратума у випадку відсутності іншого джерела часу.
Ще одна умова, кожен сервер повинен мати список інших серверів локальної мережі. Це дозволить серверу у якого більше немає зв’язку з зовнішніми серверами часу, продовжувати стягувати більш точний час з серверів локальної мережі, у яких є доступ до більш точних часів (якщо їх стратум буде нижчий 5-го). В результаті, усі учасники обміну часу, будуть до останнього моменту мати найточніший час, та зможуть рівномірно обслуговувати клієнтів.
Якщо в списку серверів не знайдено кандидатів для синхронізації, NTP чекає 5 хвилин (300 сек) , та виставляє собі 5-й стратум (щоб можна було продовжувати обслуговувати клієнтів).
Для зміни час очікування, можна скористатися директивою:
tos orphanwait 60
Архітектура цього режиму може тримати дуже важке навантаження локальної мережі, так-як вам потрібно мати, сервер який має доступ до точного часу (orphan parent) від цього серверу отримує час сервер (orphan child) який не має доступу до зовнішніх серверів часу, та роздає час клієнтам. Серверів orphan parent та child може бути як по декілька екземплярів, які синхронізуються між собою, так і взагалі це може бути всього один сервер.
Рекомендовано використовувати DNS імена серверів, для можливості зміни IP адреси серверу NTP без повідомлення клієнтів.
Не використовуйте директиву server для DNS імен, які вертають у відповідь лист з IP адресами, для цього є директива pool (інакше при директиві restrict default ignore з великою вірогідністю заблокує сервер синхроніхції). Це в першу чергу стосується регіональних серверів, наприклад:
pool 0.ua.pool.ntp.org
pool 1.ua.pool.ntp.org
pool 2.ua.pool.ntp.org
pool 3.ua.pool.ntp.org
Біля директиви pool можна також використовувати server, для вказання додаткових серверів.
В тому випадку, коли ви використовуєте замість IP адрес, DNS імена, то NTP створює ще один процес, який займається резолвінгом імен в адреси. Якщо DNS сервер не відповідає, то резолвінг відкладається, та очікує відповіді від DNS серверу.
Якщо ви не користуєтесь пулом адрес, а підбираєте собі в ручну найліпші сервери, використовуйте програму traceroute для вивчення затримок та довжини шляху.
Одна з зручних функцій списків серверів в однієї DNS адресі, це то що ви можете створити свій список, який адмініструвати будете самі, тим самим для зміни джерел, вам не доведеться облазити усі свої ntp сервери та клієнти.
Використовувати сервери зі стратумом 1, можна лише тим клієнтам, які за собою мають велику мережу, тобто є сервером 2 стратума наприклад на підприємстві, але за використання першого стратума в іншому випадку, вас ніхто не накаже.
Апартаний годинник вашого комп’ютера краще налаштовувати на роботу в UTC, так як в мережеві пакунки додається час відправки tcp timestamp, а цей час береться з апаратного годинника.
Приклад файлу /etc/ntp.conf на сервері для внутрішньої мережі організації Х:
[code]server 62.149.0.30
server 31.28.161.71
server 212.115.229.130
server 109.251.219.181
pool 0.ua.pool.ntp.org
pool 1.ua.pool.ntp.org
pool 2.ua.pool.ntp.org
pool 3.ua.pool.ntp.org
tos orphan 10
tinker panic 0
driftfile /etc/ntpd.drift
logfile /var/log/ntp.log
pidfile /var/run/ntpd.pid
restrict default ignore
restrict 127.0.0.1
restrict 192.168.0.0 mask 255.255.0.0 nomodify notrap
restrict 62.149.0.30 notrap noquery nomodify
restrict 31.28.161.71 notrap noquery nomodify
restrict 212.115.229.130 notrap noquery nomodify
restrict 109.251.219.181 notrap noquery nomodify
restrict 0.ua.pool.ntp.org noquery notrap
restrict 1.ua.pool.ntp.org noquery notrap
restrict 2.ua.pool.ntp.org noquery notrap
restrict 3.ua.pool.ntp.org noquery notrap[/code]
А налаштування клієнта:
[code]server 192.168.68.200 iburst burst
tinker panic 0
driftfile /etc/ntpd.drift
logfile /var/log/ntp.log
pidfile /var/run/ntpd.pid
restrict default ignore
restrict 127.0.0.1
restrict 192.168.68.200 noquery notrap[/code]
В цій статті пропущено дуже багато інформації, тому я рекомендую спеціалізовану літературу:
1) The Network Time Protocol on Earth and in Space
2) Crystal Oscillator Design and Temperature Compensation
Згодом я буду доповнювати інформацію стосовну точного часу на комп’ютері.