Q1: Что я делаю не так?
Я думал, zmq
будет по крайней мере так же быстро, как tcp.
Код, ничего.
С точки зрения производительности, ZeroMQ - это фантастика, плюс у него так много функций, что tcp
не предоставляет и не будет предоставлять сразу из коробки:
Test-setup " Отправка одного байта ...", кажется, шагает прямо в левый край высокопроизводительной службы сообщений с низкой задержкой:
Давайте сначала поймем латентность и откуда она взялась:
Наблюдаемые итоговые значения задержки являются произведением общей суммы использования ресурсов (распределение ресурсов + операции по управлению пулами ресурсов + манипуляции с данными) и усилий по обработке (все, что мы попытаться сделать с данными, в том числе и со временем, которые наша задача должна была потратить в очереди на ожидание, из-за запланированного многозадачного планирования рабочих модулей, запланированного системным планировщиком, которые не соответствуют нашей нагрузке тестирования, но операционная система должна планировать и выполнить, в соответствии с политикой справедливого планирования и фактическими настройками приоритета процесса) и каналами связи транспортные задержки (связь E2E с задержкой транспорта)
Давайте теперь поймем, с чем мы пытаемся сравнить:
Разница между протоколом управления передачей (необработанный tcp
) и ZeroMQ zmq
каркас интеллектуальных масштабируемых формальных архетипов связи с богатым набором высокого уровня, распределенное поведение, примерно несколько больших галактик.
ZeroMQ был спроектирован как скорее инфраструктура сигнализации и обмена сообщениями , использующая некоторые из этих многофункциональных наборов поведений , которые совпадают друг с другом - часто изображается неким подобным человеку поведенческим архетипом:
Один PUSH
-ес, любое количество присоединившихся контрагентов PULL
Один REQ
-ест, кто-то из группы на другом конце телефона REP
-лис
Один, даже потенциально один из какой-то более крупной группы агентов, PUB
, - означает, что любое количество уже подписанных подписчиков получит такое сообщение SUB
.
За подробностями можно ознакомиться с кратким обзором основных концептуальных различий в иерархии [ ZeroMQ менее чем за пять секунд ] Раздел .
Это ничего, что TCP-протокол никогда не сможет обеспечить самостоятельно.
Это комфорт, который нравится платить за незначительное время ожидания. Незначительное? Да, пренебрежимо мало, если сравнивать с многолетним мастерством работы с программным обеспечением, которому каждый должен был бы заплатить за разработку другой, по крайней мере, такой же интеллектуальной системы обмена сообщениями, чтобы конкурировать с ZeroMQ.
Q2: Могу ли я сделать какую-либо настройку, чтобы сделать zmq
быстрее?
Может быть, да, а может и нет.
Обновление:
- попробуйте избежать управления идентификацией (tcp также не имеет такой вещи, поэтому измеренные RTT-s являются менее сопоставимыми или значимыми)
- попробуйте избежать способа блокировки HWM-конфигураций (у tcp такого тоже нет)
- может попытаться измерить то же самое по протоколу без протокола tcp (PAIR/PAIR
формальный масштабируемый коммуникационный архетип, лучше всего по сравнению с наименее сложными протокольными насосами данных, как inproc://
или ipc://
в случае, если ваш испытательный стенд SandBox должен по-прежнему храните распространенные нелокальные копии и т. д.) Внутренние накладные расходы экземпляра ZeroMQ context
, потраченные на .send()
соотв. .receive()
методы
- может попытаться немного увеличить производительность, используя больше потоков, доступных для Context
instance
(другие приемы, снижающие производительность, зависят от характера реального использования - как устойчивость к пропущенным сообщениям, возможность использовать режим операций с одинаковыми значениями, лучшее выравнивание буфера с O / S, приемы с нулевым копированием - все это представляет некоторый интересздесь, тем не менее, необходимо разрешить и поддерживать инфраструктуру Smart ZeroMQ с распределенным поведением в рабочем состоянии, что является гораздо более сложной задачей, чем тривиальная последовательная последовательность в противном случае слепых и изолированных операций на уровне байтов tcp-сокета, поэтому сравнение временвозможно, но сравнивать отдельные драконьи машины класса «драгстер» (ну, лучше автомобиль, даже не автомобиль) с чем-то вроде глобально работающей инфраструктуры распределенного поведения (например, Taxify или Uber, названной здесь просто для использования тривиального (dis-) сходство примерно той же шкалы величин) оставляет числа, сообщающие о явлениях, которые не обеспечивают аналогичного удобства, масштабируемости сценариев использования, почти линейного масштабирования производительности и надежности tиспользование в реальных условиях)
- может добавить больше детерминизма планирования, сделав соответствующий IoTHREADs
экземпляр *1114* жестко подключенным к соответствующему (ым) ядру (ям) ЦП, так что общая производительность ввода-вывода никогда не будетисключается из расписания ЦП и остается детерминированно сопоставленным / предварительно заблокированным даже для исключительно выделенных для ядра ЦП - зависит от уровня потребностей и административных политик, если попытаться добиться этого максимального снижения производительности
Для любой настройки производительности необходимо опубликовать MCVE + полностью описанный набор тестов производительности.Отчет с результатами теста на задержку ZeroMQ показывает:
Заключение
В контролируемой среде RDTSC
может использоваться инструкция для быстрого измерения времени.Это позволяет нам измерять задержку / плотность для отдельных сообщений, а не вычислять средние значения для всего теста.
Мы использовали этот подход для получения показателей производительности ядра облегченного обмена сообщениями ØMQ (версия 0.1), и мы получилиследующие результаты:
- В случае низкого объема задержка почти равна задержке базового транспорта (TCP): 50 микросекунд.
- Среднее дрожание задержки минимально: 0,225микросекунда.
- Пропускная способность на стороне отправителя составляет 4,8 млн. сообщений в секунду.
- Плотность на стороне отправителя в основном составляет около 0,140 мкс, однако при случайных пиках средняя плотность составляет 0,208 мкс.
- Пропускная способность на стороне получателя составляет 2,7 миллиона сообщений в секунду.
- Плотность на стороне получателя составляет в основном около 0,3 микросекунды.Приблизительно через каждые 100 сообщений поступает новая партия, в результате чего плотность увеличивается до 3-6 микросекунд.Средняя плотность составляет 0,367 микросекунды.
Если в конечной необходимости для латентного бритья можно попробовать nanomsg , младшую сестру ZeroMQ, созданную Мартином СУСТРИКОМ, со-отец ZeroMQ (в настоящее время поддерживается Afaik кем-то еще)