Я создаю движок FIX на C ++, но у меня нет ссылки, чтобы узнать, что можно считать хорошим показателем производительности. Принимая во внимание время сети и время разбора FIX, каково было бы хорошее время в микросекундах для отправки клиентом сообщения FIX на сервер? Также кто-нибудь знает текущие минимально возможные задержки, ожидаемые для этого простого FIX-сообщение-из-клиент-сервер операция?
Это будет зависеть от того, насколько быстро ваш движок FIX может анализировать байты в FixMessage
объект и, что более важно, о том, как быстро ваш сетевой код. Вы тоже пишете сетевой стек? Написание движка FIX выглядит просто снаружи, но на самом деле это сложная задача со слишком большим количеством угловых случаев и функций, которые вы должны охватить. Вы собираетесь поддержать ретрансляцию? Асинхронный аудит-логирование? FIX таймеры сессии? Повторяющиеся группы внутри повторяющихся групп? Вам следует рассмотреть возможность использования открытого или коммерческого движка FIX.
Что касается задержек, которые вы должны ожидать, я не знаю ни о каком механизме FIX, который может опускаться ниже 4,5 микросекунд. Это одностороннее общее время, чтобы написать FixMessage
возражать против ByteBuffer
Передача ByteBuffer по сети на сервер, затем сервер читает ByteBuffer из сети и анализирует его обратно FixMessage
объект. Если вы используете механизм снижения FIX, узким местом будет сетевой ввод-вывод, а не разбор FIX.
Чтобы дать вам некоторые цифры, вот эталон для CoralFIX, который является движком FIX, написанным на Java. Если вы можете пойти ниже этого, пожалуйста, дайте мне знать 🙂
Messages: 1,800,000 (one-way)
Avg Time: 4.774 micros
Min Time: 4.535 micros
Max Time: 69.516 micros
75% = [avg: 4.712 micros, max: 4.774 micros]
90% = [avg: 4.726 micros, max: 4.825 micros]
99% = [avg: 4.761 micros, max: 5.46 micros]
99.9% = [avg: 4.769 micros, max: 7.07 micros]
99.99% = [avg: 4.772 micros, max: 9.481 micros]
99.999% = [avg: 4.773 micros, max: 24.017 micros]
отказЯ один из разработчиков CoralFIX.
Для принципиально низких достижимых чисел не забудь проверить ASIC
/ FPGA
— основанные на FIX-протоколе решения. Любая последовательная / параллельная последовательная обработка имеет трудные времена, чтобы стать быстрее, чем решение с параллельным кремниевым двигателем.
Можно достичь не намного глубже, чем о 25 ns
разрешение по измерению на основе кода aStopwatch.start();callProcessUnderTest();aStopwatch.stop()
но реальные проблемы и проблемы находятся где-то еще.
Чтобы иметь некоторое сравнение по этому вопросу, 20 ns
задержка составляет всего 5 м AOC / активных оптических кабелей в межсоединениях 120 Гбит / с в колокейшн-центрах / кластерах HPC.
Настройка производительности и минимизация задержки являются одновременно захватывающими и замечательными усилиями.
На первый взгляд, спрашивая мир о «Наименьшем возможном» что-нибудь«звучит привлекательно, если не сексуально, как это часто слышно в недавних СМИ, однако любая серьезная попытка ответить на сказанное «Самый низкий возможный» трудно без надлежащего ухода, потраченного на устранение неоднозначности проблемы (если даже не демистификация (особенно во избежание сгенерированных MAR / COM обещаний получить Ответы до того, как кто-то спросит / Instant Kharma / Eternal Heaven и др., вы знаете их достаточно хорошо, чтобы упоминать их больше)).
Под солнцем нет ничего нового, что именно по этой причине МСЭ-Т / МСЭ-R и более поздние IETF приложили огромные усилия для систематической заботы об определении спецификаций, чтобы избежать любого потенциального недопонимания, тем меньше неправильных толкований (будь то в определения стандартов или процедур приемочного тестирования или спецификации минимальных эксплуатационных характеристик, которым должен соответствовать продукт / услуга, чтобы они были полностью совместимыми).
Так прежде чем принимать любую фигуру, будь то в [мс], [нас] или [нс], быть конечно есть ли у всех нас та же справочная установка System-Under-TЕсть и быть дважды уверил для которых две опорные точки [FROM]-[TO]
представленная цифра была фактически измерена.
________________________________________________________________________
+0 [us]-[__BaseLINE__] a decision to send anything is made @ <localhost>
|
|- <localhost> process wishes to request
| a FIX-MarketData
| Streaming Updates
| for a single item EURCHF
| during LON session opening time
|
|- <localhost> process wishes to request
| a FIX-MarketData
| Single FullRefresh
| for an itemset of:
| { EURUSD, GBPUSD, USDJPY,
| AUDUSD, USDCAD, USDCHF }
| during LON session opening time
|
+ [us]-o======< REFERENCE POINT[A] >===================================
|
|- transfer all DATA to a formatting / assembly process-entity
|
+ [us]-o======< REFERENCE POINT[B] >===================================
|
|- completed a FIX-message payload to be sent
|
+ [us]-o======< REFERENCE POINT[C] >===================================
|
|- completed a FIX-message Header/Trailer/CRC to dispatch
|
+ [us]-o======< REFERENCE POINT[D] >===================================
|
|- inlined SSH/DES/AES cryptor communication service processing
|
+ [us]-o======< REFERENCE POINT[E] >===================================
|
|- L3/2 transport service protocol SAR / PMD
|
+ [us]-o======< REFERENCE POINT[F] >===================================
|
|- L2/1 PHY-device wire-on/off-load process ( NIC / FPGA )-engine
|
+ [us]-o======< REFERENCE POINT[G] >===================================
|
|- E2E transport xmit/delivery processing / latency
|
+ [us]-o======< REFERENCE POINT[H] >===================================
|
|- L1/2 PHY-device on "receiving"-side wire-on/off-load process
|
+ [us]-o======< REFERENCE POINT[I] >===================================
|
|- L2/3 transport recv/handshaking processing / latency
|
+ [us]-o======< REFERENCE POINT[J] >===================================
|
|- inlined SSH/DES/AES decryptor processing
|
+ [us]-o======< REFERENCE POINT[K] >===================================
|
|- incoming FIX-message Header/Trailer/CRC check-in
|
+ [us]-o======< REFERENCE POINT[L] >===================================
|
|- authentication / FIX-Protocol message-counter cross-validation
|
+ [us]-o======< REFERENCE POINT[M] >===================================
|
|- FIX-message requested service content de-mapping
|
+ [us]-o======< REFERENCE POINT[N] >===================================
|
|- FIX-message requested service execution / handling
|
+ [us]-o======< REFERENCE POINT[O] >===================================
|
|- FIX-message requested service response pre-processing / assy
|
+ [us]-o======< REFERENCE POINT[P] >===================================
|
[__FinishLINE__] Ready To Send anything back to <localhost>
|
+ [us]-o======< REFERENCE POINT[Q] >===================================
________|_______________________________________________________________
: SUBTOTAL BEFORE A REQUESTED SERVICE'S RESPONSE-DELIVERY STARTS
________________________________________________________________________
В качестве вдохновения попытайтесь представить что-то похожее на единую структуру отчетов о задержках для всех поставщиков (или для ваших внутренних разработчиков / команд тестирования проекта), как этот пример.
Если вам нужны минимальные задержки, клиент FIX и сервер FIX должны находиться на одном сервере, даже в одном приложении, используя решение IPC, такое как разрушитель
Я присутствовал на презентации Сингапурской фондовой биржи несколько лет назад. Они недавно приобрели платформу Nasdaq OMX и заявили, что наименьшее время совпадения составило около 8 микросекунд, если сообщения отправлялись по собственному протоколу. Затем они сказали, что поддерживают FIX, что приведет к 2-3 микросекундам сверх времени сопоставления …
Я полагаю, вы можете использовать это число 2-3 микросекунды как своего рода минимальные накладные расходы FIX, которых может достичь биржа, претендующая на самый быстрый результат 🙂