- PVSM.RU - https://www.pvsm.ru -
В этой статье мы приводим значения задержек, измеренных для двух типов окружений — устройство на основе FPGA CEPappliance [1] (“железка”) и компьютер с сетевой платой Solarflare в режиме TCPDirect, рассказываем как мы эти замеры получили — описываем методику измерения и ее техническую реализацию. В конце статьи есть ссылка на GitHub с полученными результатами и некоторыми исходниками.
Как нам кажется, полученные нами результаты могут быть интересны высокочастотным трейдерам, алготрейдерам и всем неравнодушным к обработке данных с малыми задержками.
Схема измерительного стенда выглядит так:
SUT (System Under Test) — либо CEPappliance, либо сервер с Solarflare (характеристики тестируемых систем см. ниже).
У CEPappliance и Solarflare есть общая сфера применения — высокочастотный и алгоритмический трейдинг. Поэтому мы взяли за основу сценарий из этой сферы, измеряя величину задержки от момента отправки тестовым драйвером последнего байта пакета с рыночными данными (tick) до момента получения им первого байта пакета с заявкой (trade) на биржу (задержка MAC и PHY уровней драйвера одинакова для обоих тестовых сред и вычтена из результирующих значений, приведенных ниже) — так называемая задержка tick-to-trade. Замеряя время от момента отправки драйвером последнего байта, мы исключаем влияние скорости приема/передачи данных, завясящую от физического уровня.
Измерять задержку можно и по другой методике — как время от момента отправки драйвером первого байта до момента получения им первого байта от измеряемой системы. Такая задержка будет больше и может быть расчитана на основе наших измерений по формуле:
latency1-1 = latencyN-1 + 6.4 * int((N + 7) / 8),
где latencyN-1 — измеренная нами задержка (от момента отправки драйвером последнего байта до момента получения им первого байта), N — длина Ethernet фрейма в байтах, int(x) — преобразование к целому, отбрасываением дробной части вещественного числа.
Вот схема обработки, время выполнения которой составляет интересующую нас задержку:
Что из себя представляют стадии тестирования?
Подготовка:
Тестирование:
Обработка результатов тестирования:
В качестве SUT выступает сервер с материнской платой Asus P9X79 WS, процессором Intel Core i7-3930K CPU @ 3.20GHz и сетевой картой SFN8522-R2 Flareon Ultra 8000 Series 10G Adapter, поддерживающей TCPDirect.
Для этого стенда была написана С-программа, которая получает UDP пакеты через Solarflare TCPDirect API, разбирает их, строит книгу заявок, формирует и отправляет сообщение на покупку по протоколу FIX.
Разбор сообщения, построение стакана формирование сообщения с заявкой закодированы “жестко” без поддержки каких-либо вариаций и проверок, чтобы обеспечить минимальную задержку. С кодом можно ознакомиться на GitHub [3].
В качестве SUT выступает CEPappliance или “железка”, как мы ее называем, — это плата DE5-Net с FPGA чипом Altera Stratix V, вставленная в PCIe слот сервера, через который она получает питание и больше ничего. Управление и обмен данными с платой осуществляется через 10G Ethernet подключение.
Мы уже рассказывали [1], что наша прошивка для FPGA чипа содержит много разных компонентов, в том числе все необходимое для реализации сценария тестирования, описанного здесь.
Программа сценария для CEPappliance содержится в двух файлах. В одном файле [4] программа логики обработки данных, которую мы называем схемой. В другом файле [5] описание адаптеров, через которые схема (или “железка” ее выполняющая) взаимодействует с внешним миром. Вот так просто!
Для CEPappliance мы реализовали две версии схемы и для каждой версии сделали замеры. В одной версии (CEPappliance ALU) логика реализована на встроенном языке высокого уровня (см. строки 47- [6]67 [7]). В другой (CEPappliance WIRE) — на Verilog’е (см. строки 47- [8]54 [9]).
Измеренные значения tick-to-trade задержки в наносекундах:
SUT | min | avg | max | stddev | 95% | 97% | 99% | 99,9% |
---|---|---|---|---|---|---|---|---|
Solarflare TCPDirect | 1411 | 1637 | 2638 | 150 | 2022 | 2116 | 2303 | 2619 |
CEPappliance ALU | 1050 | 1125 | 1620 | 45 | 1251 | 1320 | 1415 | 1549 |
CEPappliance WIRE | 561 | 640 | 1163 | 45 | 768 | 825 | 907 | 1087 |
Чуда не произошло и “железка”, реализованная на основе FPGA, оказалась быстрее, чем решение на основе сервера с Solarflare TCPDirect. Чем выше перцентиль, тем заметнее разница в скорости. Одновременно с этим скорость работы решения на CEPappliance имеет дисперсию на порядок ниже.
Вариант для CEPappliance, когда логика обработки данных реализована на Verilog, быстрее на 60-70%, чем реализация того же алгоритма на встроенном языке CEPappliance.
Мы разместили почти весь исходный код, участвовавший в тестировании, открытым на GitHub в этом репозитории [10].
Закрытым оставили только код тестового драйвера, так как есть надежда его монетизировать. Ведь он позволяет очень точно измерить скорость реакции системы. А без этой информации сделать качественное HFT-решение почти невозможно.
Было бы логично выяснить имеет ли значение выявленная разница в задержках различных решений, например, при торговле на Московской бирже. Про это будет в следующей статье. Но забегая вперед, скажем, что даже полмикросекунды имеет значение!
Автор: cepappliance
Источник [11]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/fpga/265225
Ссылки в тексте:
[1] CEPappliance: https://habrahabr.ru/post/334574/
[2] X-OLR-CURR: http://ftp.moex.com/pub/FAST/ASTS/template/FIX50SP2-2017-Mar.xml
[3] GitHub: https://github.com/cepappliance/tick-to-trade-latency/tree/master/src/solarflare
[4] одном файле: https://github.com/cepappliance/tick-to-trade-latency/blob/master/src/cepappliance/cepappliance-alu.schema.xml
[5] другом файле: https://github.com/cepappliance/tick-to-trade-latency/blob/master/src/cepappliance/adapters.xml
[6] 47-: https://github.com/cepappliance/tick-to-trade-latency/blob/3641835d89362374b0008913004285cafd55c04e/src/cepappliance/cepappliance-alu.schema.xml#L47
[7] 67: https://github.com/cepappliance/tick-to-trade-latency/blob/3641835d89362374b0008913004285cafd55c04e/src/cepappliance/cepappliance-alu.schema.xml#L67
[8] 47-: https://github.com/cepappliance/tick-to-trade-latency/blob/3641835d89362374b0008913004285cafd55c04e/src/cepappliance/cepappliance-wire.schema.xml#L47
[9] 54: https://github.com/cepappliance/tick-to-trade-latency/blob/3641835d89362374b0008913004285cafd55c04e/src/cepappliance/cepappliance-wire.schema.xml#L54
[10] этом репозитории: https://github.com/cepappliance/tick-to-trade-latency
[11] Источник: https://habrahabr.ru/post/339702/
Нажмите здесь для печати.