Обмен сообщениями с низкой задержкой / высокой производительностью в сети (Ethernet) - PullRequest
10 голосов
/ 04 января 2012

Фон

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

Цель тестов - увидеть, как конкретная система (компоненты OS + и т. Д.) Выполняет , когда речь идет о сетевом трафике. Это показано как машина А на рисунке ниже. Обратите внимание, что я не заинтересован в производительности сетевой инфраструктуры (коммутаторы, кабели и т. Д.) - я пытаюсь проверить производительность сетевого трафика внутри компьютера A (то есть от когда он попадает в сетевую карту, пока не достигнет пользовательского пространства)

Мы будем (пытаться) измерить все виды вещей, одна вещь - это полная передача сообщения в обоих направлениях, а также такие вещи, как задержка прерывания машины A, общие издержки драйвера и т. Д. Машина A будет системой реального времени. Но для поддержки этих тестов мне нужна отдельная машина, которая может возвращать сообщения и другими способами добавлять сетевые стимулы в тестируемую систему. Эта отдельная машина - это машина B на рисунке ниже, и именно об этом вопрос.

General overview of my test system

Моя проблема

Я хочу разработать приложение, которое может получать и возвращать эти сообщения с максимально постоянной (и предпочтительно низкой) задержкой. Я надеюсь получить задержки, которые не меняются в течение нескольких микросекунд. Для простоты я хотел бы сделать это в ОС общего назначения, такой как Windows или Linux, но я открыт для других предложений. На компьютере не будет другой нагрузки (ЦП или иным образом), кроме операционной системы и моего тестового приложения.

Я думал о следующих подходах:

  • Обычное приложение, работающее в пространстве пользователя с высоким приоритетом
  • Поток, работающий в пространстве ядра, чтобы избежать переходов пространства пользователя / пространства ядра
  • Готовое устройство, которое уже делает это (хотя я не нашел одно)

Вопросы

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

Ответы [ 2 ]

9 голосов
/ 04 января 2012

Вы упомянули, что хотите проверить внутреннюю производительность машины A, но «нужна отдельная машина»; тем не менее, вы не хотите тестировать производительность сетевой инфраструктуры.

Вы знаете намного больше о своих требованиях, чем я; однако, если бы я тестировал сетевую инфраструктуру на компьютере A, я бы настроил свой тест следующим образом:

Looped Machine

Для этого есть несколько причин:

  • Вы можете использовать петлевой кабель Ethernet для имитации функции «pong», выполняемой машиной B
  • Устранение транзита через инфраструктуру, которая вам не нужна, почти всегда является лучшим решением при измерении производительности

Если вы используете этот метод тестирования, обязательно обратите внимание на следующие моменты:

  • Ethernet выполняет проверку сигнала на шум на медном кабеле перед установкой соединения. Если вы изгибаете петлю слишком сильно, вы можете увеличить задержку, если Ethernet решит вернуться к более низкой скорости из-за перегибов в кабеле. Для медных сетей Ethernet минимальная длина отсутствует.
  • Как вы, наверное, знаете, комбинации сетевых карт / версий драйверов / ОС могут существенно повлиять на задержку внутри хоста. Я работаю на производителя сетевого оборудования, а один из сотрудников в офисе работал инженером приложений для SolarFlare . Он утверждает, что многие из торговых систем Уолл-стрит используют сетевые карты SolarFlare из-за низкой задержки инженеров SolarFlare, для которых их продукты; он также сказал, что драйверы SolarFlare предоставляют вам доступ к буферам NIC в пространстве пользователя. Предостережение: информация из третьих рук, и я не могу подтвердить себя.
  • Если вы зациклили кадры на машине A, установите mac-адрес источника и получателя на сожженный адрес на сетевой карте

Даже если вам нужно получить модифицированный кадр «pong» с машины B, вы все равно можете использовать эту топологию и просто переписать поля пакетов на принимающей стороне вашего кода на машине A. Поместите как можно больше (или меньше) инструментария. точки, которые вам нравятся в «модулях» машины А. для сравнения временных рамок кадра.

FYI:

Встраиваемые системы, о которых я упоминал в комментариях к вашему вопросу, предназначены для измерения задержки сетевой инфраструктуры, а не конечных хостов. Это лучший метод для определения задержки хоста.

4 голосов
/ 04 января 2012

В качестве готового решения я бы предложил взглянуть на Solace, Tibco и AMQP.Это все корпоративные среды обмена сообщениями, широко используемые в торговых приложениях. AMQP является открытым исходным кодом и может обрабатывать до 100 000 сообщений в секунду.Я не уверен в задержках других структур.Существует реализация Java или C ++ маршрутизатора сообщений AMQP.C ++ один, конечно, возвращает более высокую производительность.

Редактировать Я только что слышал о новом продукте под названием UltraMessaging , который может обеспечивать пропускную способность 7 000 000 сообщений в секунду с помощью клиентов Java, C ++ или C #.Crikey.

С уважением,

...