В сфере высокочастотной торговли зачастую борются за любое уменьшение сетевой задержки, ведь это дает возможность получить информацию об изменении цены инструмента раньше остальных и отправить заявку на исполнение быстрее конкурентов по более выгодным условиям. Нередко можно встретить такие решения, как отказ от промежуточного сетевого оборудования в виде сетевого коммутатора, который мог бы обеспечить использование торгового подключения несколькими серверами сразу. Но зачем подключать каждый сервер напрямую к инфраструктуре биржи, если можно платить за один аплинк и подключить его в классический ToR(Top-of-rack) коммутатор? Конечно для уменьшения сетевой задержки, ведь современный сетевой коммутатор внесет лишние 200-500 наносекунд задержки.

Конечно можно обратиться к low-latency коммутаторам, базирующимся на FPGA матрицах, таким как серия Cisco Nexus 3550 Fusion (в прошлом Exablaze ExaLINK Fusion) или Arista 7130 Series (в прошлом Metamako MetaMux). За счет использования коммутации на уровне layer 1 (модели OSI) отходящей от канонов классических сетевых протоколов, можно добиться понижения сетевой задержки коммутатора до единиц нс (3-5нс) в случае fan-out, то есть раздачи поступающей биржевой информации на коммутатор сразу в несколько исходящих портов, или десятков нс (~39нс) в случае мультиплексирования (Muxing) входящих сообщений на постановку заявок на биржу со стороны торговых серверов для их отправки в один исходящий аплинк в сторону биржи. Однако такое решение может стоить вам до нескольких десятков тысяч долларов на каждую стойку. Стоит упомянуть что каждый лишний метр оптического кабеля добавит вам еще порядка ~5нс. А, ну и на каждый оптический SFP трансивер вам добавит еще по ~500 пикосекунд.

Безусловно стоит обратиться к правилам конкретной биржи, она может явно запрещать вам подключение биржевого линка напрямую в ваш торговый сервер, кое где явного запрета нет, и разрешенное оборудование к подключению ограничивается формулировками «сетевое оборудование». Мне кажется PCI сетевой адаптер может быть категоризован как «сетевое оборудование», да? Конечно тут стоит задать прямой вопрос вашему брокеру или представителю биржи, ведь за нарушение правил могут последовать совсем нешуточные санкции. Однако, есть биржи, которые явно не запрещают такого подключения.

В таком случае единственным нюансом будет являться необходимость настроить на стороне вашего торгового сервера общение через один физический сетевой интерфейс с разных IP адресов, чтобы ближайший к вам L3 коммутатор биржи мог обменяться с вами маршрутами (например по BGP протоколу) и поддерживать вашу BGP сессию в Established статусе, удерживая соседство с коммутатором биржи, а торговый IP адрес мог быть использован вашим торговым алгоритмом. Эту ситуацию мы и рассмотрим в статье на примере настройки сетевого стека Ubuntu Server 20.04, netplan и BGP демона bird v.1.6.8.

С помощью netplan добавить несколько IP адресов довольно просто, для этого в файле конфигурации /etc/netplan/01-netcfg.yaml для интерфейса enp1s0d1 достаточно перечислить их:

network:

version: 2

renderer: networkd

ethernets:

...

enp1s0d1:

addresses:

- 10.2.2.42/30 # адрес, который был дан для свича с нашей стороны

- 10.1.1.2/26 # наш торговый IP адрес

То что касается конфигурации IP роутинг демона bird с исходным открытым кодом, тут обычно нужна примерно следующая конфигурация в файле конфигурации /etc/bird/bird.conf для конфигурации BGP:

router id 10.2.2.42; # адрес, который был дан для свича с нашей стороны

protocol kernel {

scan time 20;

export all; # Actually insert routes into the kernel routing table

}

...

protocol static static_bgp {

route 10.1.1.2:255.255.255.255 via 10.2.2.42; # Роут который мы передаем соседу по BGP к нашему торговому IP 10.1.1.2 через наш адрес свича

}

protocol bgp {

import all;

export where proto = "static_bgp";

local as 65001; # Номер АС который нам дала биржа

neighbor 10.2.2.41 as 64512; # IP адрес соседского свича и его АС номер.

password "%your_password_here%"; # используем данный нам пароль для установления BGP сессии

}

Для проверки состояния bird нужно открыть консоль управления демона birdc , и проверить статус сессии bgp1 с помощью команды show protocols, он должен быть Established:

bird> show protocols

name proto table state since info

kernel1 Kernel master up 2022-12-10

device1 Device master up 2022-12-10

static_bgp Static master up 2022-12-10

bgp1 BGP master up 2022-12-10 Established

Ну и конечно команда show route должна показывать маршрут который мы отдаем соседу, а также маршруты, которые приезжают от него:

bird> show route

10.1.1.2/32 via 10.2.2.42 on enp1s0d1 [static_bgp 2022-12-10] ! (200)

172.16.21.0/23 via 10.2.2.41 on enp1s0d1 [bgp1 2022-12-10] * (100) [AS65xxx?]

172.16.22.0/23 via 10.2.2.41 on enp1s0d1 [bgp1 2022-12-10] * (100) [AS65xxx?]

...

Так как в случае если бы у нас действительно был свич, исходящие пакеты, перенаправляемые им с торговых IP адресов на выходе в сторону биржи имели бы source MAC адрес порта коммутатора, в который подключен аплинк до биржи, то никакого конфликта быть не должно. Единственное что, стоит помнить, что все пакеты, отправляемые в сторону сетей, которые известны нам благодаря работе BGP, по умолчанию, без указания source IP, используя правила маршрутизации из таблицы main, будут отсылаться с IP нашего «виртуального» коммутатора. Поэтому в ПО, которое должно слать заявки на биржу, нужно в явном виде будет указывать source IP, и чтобы собрать корректный исходящий пакет нам также потребуется MAC адрес соседнего биржевого свича, но его легко посмотреть в нашей ARP табличке, ведь наш виртуальный свич уже корректно коммуницирует с ним.

Arista L1+ Muxing 
(c) Arista
Arista L1+ Muxing (c) Arista

Похожую настройку придется делать и для варианта с установкой промежуточного L1 свича от Cisco, но в таком случае для отправки корректных пакетов там придется узнать MAC-адрес порта свича, который смотрит в сторону биржи. Тогда как на свичах Arista 7130 Series в мультиплексор (коммутирующую матрицу) подключен логический интерфейс коммутатора, который может осуществлять BGP пиринг и также подписываться по PIM (Protocol Independent Multicast) на интересующие вас потоки биржевых данных. Что в некоторых случаях может быть удобно, учитывая заявленную задержку мультиплексирования от 39нс у обоих производителей.

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


  1. ivankudryavtsev
    00.00.0000 00:00
    +5

    Я думаю, что ваши статьи бы стоило начинать с ликбезов о влиянии лишней мс на результативность торговли, потом двигаться от java к C++, от низкочастотных cpu к вымокочастотным, к отключению ядер и гипертрединга, управлению профилем энергоэффективности. А так склпдывается впечатление, что вы умеете что-то экономить, а для чего не знаете. И мы нпюе узнаем. И как же в Nasdaq воткнуться проводом? Может с этого стоило начать? Или с того, что Nasdaq чаржит клиентов по 200-500$ в час за обслуживание продуктов их инженерами. Я с трудом могу представить сколько будет стоить воткнуться туда проводом, а Вы о каких-то пикосекундах. Здесь 99.9% Arista cut-through в глаза не видели, а вы про превращение свича в хаб...


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

      Иван, безусловно, выбор языка, оптимизации кода, тюнинг ядра ОС, выбор CPU и оверклокинг - все это также неотъемлемые части этой битвы за снижение задержки. И о них можно много писать. О том как встать в колокации бирж и об их инфраструктуре и прайсинге можно тоже не один пост написать. Но конкретно в этой заметке я выбрал такой формат, где я затронул зону своего интереса в этой тематике, надеюсь, для кого-то он тоже будет интересен.


      1. ivankudryavtsev
        00.00.0000 00:00

        Просто все это не близко на фоне непонимания сути проблемы.


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

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


          1. ivankudryavtsev
            00.00.0000 00:00

            Ну автор Вы. Я просто хотел Вам помочь сделать ваши статьи интереснее. Так-то не возбраняется. Интересно, кто-нибудь на Xilinx-овых FPGA-бордах с интерфейсам сетевыми торгует, чтобы уж по хардкору, точно фиксированный рилтайм?

            А что с OpenVswitch и прочим оффлоадингом на базе карт Silicom и иных очень ускоренных NIC с развитой логикой преобработки и фильтрации потоков?

            BGP можно и с хоста вещать, там на latency пофиг. Кстати, зачем вы пишете про BGP в рамках данной тематики - это вроде как непрофильный топик. Никак особо не влияет, кроме технического подключения для маршрутизации...


            1. Petrufel Автор
              00.00.0000 00:00

              При использовании Xilinx FPGA плат можно тоже отдать в систему весь этот сервисный трафик (BGP, PIM). Ну а торговую логику реализовывать на FPGA. Статья касается именно сервисного трафика, так как обычно эти протоколы BGP/PIM обслуживаются на сетевом оборудовании, а тут вынуждено на хосте. Кстати, есть также смежное решение типа Xilinx Alveo, где на плате есть еще ARM ядра, но увы, они не так быстры как современные десктопные/серверные процессоры.


              1. ivankudryavtsev
                00.00.0000 00:00

                Ну так используют или нет?))


                1. Petrufel Автор
                  00.00.0000 00:00

                  Ну раз Xilinx даже делает специальные решения для HFT, конечно используют :)


          1. ivankudryavtsev
            00.00.0000 00:00

            Я могу ошибаться, но для большинства здесь находящихся - 1мс, минимальный ощутимый (tangible) квант времени. Было бы интересно понять весь "стек" экономии времени, где можно сколько сэкономить, переходя от технологии X к технологии Y.


            1. Petrufel Автор
              00.00.0000 00:00

              Согласен, интересная тематика. Про разницу в сотни мс я тут писал, в своей статье в песочнице: https://habr.com/ru/post/715452/


              1. atd
                00.00.0000 00:00

                Вы там написали про 100милли клок-дрифта, а не тик-ту-трейда. Ну и обе статьи выглядят как написанные профессиональным сетевым инженером, но ни разу не торговавшим в реальном сетапе...


                1. Petrufel Автор
                  00.00.0000 00:00

                  да, клок дрифта. Ну моя ответственность больше в сетевой части и есть, так что про то и пишу.


    1. atd
      00.00.0000 00:00
      +1

      потом двигаться от java к C++, от низкочастотных cpu к вымокочастотным, к отключению ядер и гипертрединга, управлению профилем энергоэффективности


      Это всё базовые вещи. Но внезапно они оказываются тоже бесполезны, когда конкурент имеет доступ к более «правильному» гейту, или вообще имеет инсайд (в техническом плане). Увы, такое является не редкостью и поныне...

      P.S.: > Cisco Nexus 3550 Fusion (в прошлом Exablaze ExaLINK Fusion ... Arista ... в прошлом Metamako

      Как быстро меняется этот мир, а соларфларь ушла к зайлинксам, а те к амуде... мелланокс теперь нвидия. Только успевают копирайты в исходниках править...


  1. vvpoloskin
    00.00.0000 00:00
    +1

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


    1. atd
      00.00.0000 00:00
      +3

      для таких задач задержка в среднем должна быть N наносекунд

      В трейдинге только один критерий: задержка должна хотя-бы на пол-шишечки быть ниже, чем у конкурента. И не важно, боретесь вы 1 микро против 900 нано, или 100 милли против 99999 мкс

      Это как анекдот про то, с какой скоростью надо убегать от медведя.


      1. vvpoloskin
        00.00.0000 00:00

        Понятно, что чем меньше тем лучше. Но интересно в среднем в каком диапазоне она у участников. И какими улучшениями она достигается (порт на оптическом кроссе - столько то нс, 1 км ВОЛС на улице - столько-то нс и тд).


        1. atd
          00.00.0000 00:00

          (порт на оптическом кроссе - столько то нс, 1 км ВОЛС на улице - столько-то нс и тд).

          эти данные есть в школьном учебнике физики.

          в каком диапазоне она у участников

          а этими никто добровольно делиться не будет, более того, много кто считает коммерческой тайной (хотя по факту это секрет полишинеля, но для каждой биржи свой, могут отличаться на порядки)


  1. nkretov
    00.00.0000 00:00

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

    тип если так важна минимизация задержки то проще захардкодить роуты чем поднимать для этого демона.
    да и вообще, если смычка между биржей прорабатывается в терминах долей мс, то имеет наверное смысл вообще отказаться от л3 ?


    1. Petrufel Автор
      00.00.0000 00:00

      Без объявления обратного роута к вашему «клиенту» с ним не будет коммуницировать биржа, на биржевом коммутаторе только /30 сетка для пиринга с клиентским коммутатором. Так что это требование биржи.


    1. ivankudryavtsev
      00.00.0000 00:00

      Для ядра что статик, что bgp route одинаковы с точки зрения рутинговых затрат.


    1. atd
      00.00.0000 00:00
      +1

      отказ от л3 полезен только для субмикро, для всего остального и так сойдёт