...или как измерить задержки вашего HFT‑сетапа не привлекая санитаров.

Эта статья является развернутым ответом на комментарий. Дело в том, что во многих статьях любят показать модное оборудование за триллиарды долларов, или выпендриться какими‑то крутыми новинками.

Я хочу показать, что всё это можно сделать из говна и палок дешёвых старых компонентов. И ответить на несколько типичных вопросов, первый из которых, сколько времени задержки добавляет лишняя длина кабеля. В биржевой инфраструктуре обычно используется 10G сеть, и для любых нетривиальных расстояний (более 3м, за пределы стойки) это будет оптика. Итак, мы будем измерять скорость света в оптическом кабеле, то есть в стекле.

Из школьного курса физики мы знаем, что скорость света это самая большая скорость во вселенной. Но она такая только в вакууме. А вот в любой прозрачной среде она зависит от показателя преломления, причём зависит достаточно просто: V = \frac{C}{n} , где V — скорость света в нашей среде, C — скорость в вакууме (≈3×10⁸м/c), n — показатель преломления (для стекла обычно ≈1.5). Значит V ≈ 200 тыс. км/c, давайте убедимся, что нас нигде не обманывают.

Итак, для эксперимента нам понадобится:

  • стеклянный провод, в котором собственно мы и будем гонять свет (у меня было несколько MM патч‑кордов разной длины);

  • лазеры и фотодиоды, а точнее, обычные SFP+трансиверы, которые будут отправлять свет в провод (и принимать его);

  • сетевая карта, которая будет управлять трансиверами (сами‑то они не сообразят когда и что делать);

  • ещё одна сетевая карта (а точнее, карта захвата), чтобы записывать, когда мимо неё пролетел свет;

  • способ отвести немного пролетающего мимо света из длинного кабеля (оптический сплиттер).

Для всего этого мы не будем использовать лабораторное оборудование, или специальные low‑latency свитчи. Попробуем пройтись по самому дну eBay и поймать что‑то там. Вот что у меня вышло:

  1. MM LC‑LC провода бывают в очень разную цену, мне как‑то удалось урвать 3шт 20-метровых кабелей всего за $15. Короткие кабели китайцы продают за 1–2$;

  2. SFP+трансиверы мультимод на 10г сейчас продаются за $5, иногда идут в комплекте с сетевухами, или даже на авито можно найти не сильно дороже;

  3. сетевые карты: Solarflare, простите, Xilinx, AMD предыдущих поколений (sfn6122f/sfn7122f) стоят в районе $20 за штуку, либо старый добрый Mellanox Nvidia mcx312a чуть дороже (за $30–40);

  4. оптический сплиттер (он же fiber tap) за $15 (полно вариантов производства NetOptics ixia Keysight);

  5. карта захвата фирмы Endace — самое дорогое оборудование в этом списке, $50.

$110 лута с eBay
$110 лута с eBay

Как оказалось, «модные» карты для HFT (даже SF или Mlnx, что уж говорить про всякий интел), совершенно не умеют засекать маленькие интервалы времени. Для этого и была приобретена карта захвата. Но с ней другой прикол: без набора софта она абсолютно бесполезна (именно по этой причине на ебее они продаются сильно дешевле своей List Price). Для Solarflare или Mellanox базовые драйвера уже есть в ядре линукса (а к некоторым картам присутствуют и в стандартной поставке винды), а вот для Endace нам внезапно помогут итальянские хакеры, а точнее не они сами, а факт того, что они обделались в далёком 2015-м году и устроили незапланированный распределённый бэкап своих репозиториев, в одном из которых можно найти полный комплект нужного нам софта (правда, под очень древний линукс, ну штош...). Да, пришлось покопаться в софтовых окаменелостях, зато используемая карта даёт погрешность всего‑лишь +-7.5ns, а мелланокс вообще интервалы меньше 200ns не видит.

собираем несложную конструкцию
собираем несложную конструкцию
Если месиво проводов на картинке выше не очень понятно, то вот схема

Дальше мы просто отправляем одинокий пинг, а в это время записываем трафик через tcpdump dagsnap. После того, как проделаем эту операцию несколько раз с кабелями разной длины, составим итоговую таблицу, скорость посчитаем с учётом того, что внутри сплиттера есть 30–50 см «лишнего» кабеля, а точность измерения времени ±7.5нс:

длина кабеля, м

время, нс

скорость, тысяч км/c

1

7, 7, 8, 7, 7, 7, 8

93..

5

29, 30, 30, 30, 30

145..235

7

30, 38, 44, 38, 38, 30

168..240

20

111, 105, 111, 104, 105

183..208

40

201, 201, 201, 202, 201

194..208

60

298, 298, 298, 305, 306, 298

194..206

120

603, 604, 603, 604, 604, 604

197..201

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

А что там с HFT? А с ним всё просто. Тем же немудрёным способом, и тем же дешёвым железом можно измерить задержку от пакета с рыночными данными и до пакета выставления заявки.

Очень часто в рекламных буклетах есть заявления вида «лейтенси нашей вундер‑вафли составляет Х микросекунд! *» и * — измерено софтом. Рекомендуется всегда уточнять так называемый wire latency, да и измерить собственный тоже не помешает. В некоторых случаях результат может вас неприятно удивить...

«Классические» 5нс/метр оптики мы получили выше экспериментальным путём, но уже изобретено более быстрое волокно — hollow core fiber или photonic crystal fiber, в которых обещают что свет будет передаваться со скоростью света. Если у кого‑нибудь есть такое на тест, то с радостью приму;)

Комментарии (21)


  1. d33
    00.00.0000 00:00

    Тем самым вы измерили скорость света в световоде оптического кабеля, которая в любом случае меньше, чем скорость света в вакууме.


    1. atd Автор
      00.00.0000 00:00
      +16

      Да, об этом несколько раз упоминается в тексте.


    1. Balling
      00.00.0000 00:00
      -1

      В любом случае? А это что?

      https://en.wikipedia.org/wiki/Cherenkov_radiation


      1. Gutt
        00.00.0000 00:00
        +2

        Это движение заряженных частиц со скоростью, большей скорости света в данной среде. Так что да, в любом случае.



  1. Rinat111
    00.00.0000 00:00
    +2

    110$ дороговато, для простого домашнего эксперимента.


    1. atd Автор
      00.00.0000 00:00
      +6

      List Price этого железа, когда оно было новое (лет ~10 назад), была больше $5k, так что можно считать что вполне бюджетненько ))


  1. Dynasaur
    00.00.0000 00:00
    +8

    Ого! По-моему это очень круто! И оригинально.

    Даже не верится что результат так точно совпал с теоретическим.


  1. valvalva
    00.00.0000 00:00

    Здравствуйте! Расскажите про dagsnap, ну и прочие подробности, какими командами пользовались?


    1. atd Автор
      00.00.0000 00:00
      +1

      Если погуглите то, что в сноске, то всё найдётся )

      Например, мануал.

      Я использовал:

      modprobe dagmem dsize=128M
      dagload
      dagconfig -d0 default
      dagsnap -d0 -v -o dump.erf


  1. YDR
    00.00.0000 00:00
    +2

    я делал простенькую установку для измерения задержки распространения в логических элементах на основе генератора 20-100(?) МГц и фазового детектора на основе одного элемента 74АС86 и RC-цепочки (и вольтметра).

    Измерения проводились на ряде частот, типа 20-25-30-35-..., затем строилась зависимость напряжения от частоты (вида "пила"), и из нее вычислялось время задержки.

    Если заменить логический элемент на оптический передатчик и приемник, пусть даже медленный, даже 100 мегабит, то можно построить зависимость задержки от длины кабеля.


    1. atd Автор
      00.00.0000 00:00
      +1

      Да, кстати, надо попробовать с лазерной указкой и фотодиодом. Частота кварца на той плате 133.33 мгц, это вполне реально сделать на отдельных элементах или простенькой фпга.


  1. me21
    00.00.0000 00:00
    +8

    А я помню на Ютюбе видео, там внутрь микроволновки без поворотного столика клали шоколадку, чтобы она лежала на месте. Включали микроволновку, пока шоколад не начинал плавиться. Мерили расстояние между расплавленными пятнами на шоколаде и определяли длину волны. Частоту знаем. Считаем скорость)

    Примерно так, если мне память не изменяет.


  1. Dynasaur
    00.00.0000 00:00
    +1

    Только что подумалось, что можно ведь измерить скорость света (в воздухе или стекле) ещё проще: Ставим зеркало подальше , шлём на него импульсы светодиодным лазером и принимаем отражённый сигнал фотодиодом. Если точно замерить разницу между отправленным импульсом и принятым сигналом - то вот оно. В принцпе, так работает лидар, то есть можно залезть в электронику готового лидара и считать оттуда задержку. В общем, я ничего не изобрёл :-)


    1. Javian
      00.00.0000 00:00
      +2

      На маленьких расстояниях надо фазу измерять.


  1. rPman
    00.00.0000 00:00
    +4

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

    Более сложная схема, ее можно упростить благодаря лазерной указке


    настраивается прибор таким образом чтобы пока колесо не вращается, луч света проходит дважды через него и виден глазу, затем необходимо вращать колесо с такой скоростью, чтобы луч света перестал мигать и погас (т.е. пока он двигается до зеркала и обратно, колесо должно провернуться минимум на один зуб), соответственно вычислять скорость света через расстояние до зеркала и скорость смены зуб/отверстие (фактически количество зубьев и обороты в секунду)


  1. zanzack
    00.00.0000 00:00
    +3

    получили значение, очень похожее на правду

    Похоже на что? Погрешность у этого измерения есть?
    Может там получилось 197 тыс км/с  ± 100 тыс?


    1. atd Автор
      00.00.0000 00:00
      +1

      197..201 это как раз с учётом заявленной погрешности в ±7.5нс (если записать по-другому, то получилось 199±2)


    1. Dynasaur
      00.00.0000 00:00

      Это измерение скорости света В СТЕКЛЕ (а не в вакууме). Она как раз такая


      1. Balling
        00.00.0000 00:00
        -2

        Она такая без эффекта Черенкова. С ним может быть ближе к вакуумной.


        1. Dynasaur
          00.00.0000 00:00
          +4

          Не понял при чём тут эффект Черенкова, касающийся торможения релятивистских частиц в прозрачной среде. Поясните, что вы имеете в виду?