NVIDIA на прошедшем Netdev 0x19 выступила с докладом, где исследовала проблему синхронизации времени внутри ДЦ.Суть в том, что NTP их не устраивает по причине своей медлительности. Задержки в миллисекунды внутри распределенных инфраструктур, различных баз данных или, например, в недавно построенной
Сфере в Лас Вегасе, по их словам непозволительная роскошь.
Пошли изучать, нашли 3 варианта:
1. PTPНу тут и говорить особо нечего, всем известный и широко используемый протокол внутри провайдеров для синхронизации времени. Умеет то, что не умеет NTP. Точность до наносекунд.
Всё бы хорошо, но часто бывает когда у эндпоинта несколько карточек, либо к одной карточке подвязано несколько эндпоинтов (докер, кубер и т.д.), то соответственно возникает большое количество клиентов PTP и приходится поддерживать stateful для каждого, а это проблема.
Поэтому был предложен следующий вариант 👇
2. Клиент-серверный IEEE 1588, он же CSPTP.Собственно практически тот же самый PTP, только проще.
Стандарт вот, но там как обычно у ieee с доступом какие-то приколы, в общем если найдёте, кидайте в комментарии - https://standards.ieee.org/ieee/1588.1/11644/.
Реализаций немного и есть вот такие:
SPTP - вариант, который предложили инженеры FB, являющиеся соавторами данной презентации;
FlashPTP - автор работает в Meinberg, немецкая компания специализирующаяся на разработке и производстве оборудования для синхронизации времени;
NTP-over-PTP - драфт от инженеров Red Hat, который поддерживается теперь и в chrony -
https://chrony-project.org/doc/4.6.1/chrony.conf.html#ptpport.
В целом, все три варианта в той или иной степени по всей видимости очень даже рабочие и если я правильно понял, то первый - SPTP - сейчас и является основным внутри ДЦ FB.
Исходя из доклада, данный метод имеет одну существенную проблему - это нагрузка при масштабировании. Да, она ниже чем у PTP, за счет отказа от stateful, но всё также требует общения с CPU при каждом взаимодействии. Поэтому инженеры пошли дальше и решили поискать какой-то альтернативный вариант, и тут уже нашлось вообще иное решение 👇
3. Hermóðr - новый подход. Опирается на оценку времени через корреляцию с CPU таймером.
Немного оффтопа 🙂
Если что, слово Hermóðr, или Хермод, оказывается является именем скандинавского бога скорости, аналог греческого Hermes, или Гермес, прикольно то, что у них и имена очень даже совпадают. К слову об уникальности каждого пантеона 🙂
Документации к сожалению нет, только опираться на презентацию и доклад.
Сама суть данного метода, как я понял, заключается в том, что добавляется демон, который получает время из двух источников, один из которых PCIe device, а второй CPU clock. После этого он проводит некоторое вычисление и результат складывает в shared memory. Дальше отдельная библиотека, libhermod, идёт в эту область памяти и забирает последние данные, плюс тоже идёт в CPU clock, и на основе полученной информации экстраполирует точное время. Таким образом, вы обращаетесь к PCIe только один раз, а дальше время обновляется уже без этого взаимодействия, т.е. не требуется постоянного обращения в /dev/ptpX, что сильно ускоряет результат работы и позволяет добиться снижения задержек в 80-100 раз по сравнению с CSPTP.
В общем, пока что выглядит всё так, что этот метод действительно может стать основным для подобных задач.
Ссылки вот тут:
ПрезентацияВидео