Скорость IPC и сравнение

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

Вот моя ситуация:

  • Я изолировал часть IPC, чтобы в будущем я мог изменить ее другими способами.
  • У меня есть 3 недели, чтобы внедрить еще одну более быструю версию. ;-(
  • IPC должен быть быстрым, но и сравнительно простым в использовании.

Я изучал различные подходы IPC: сокет, канал, разделяемая память. Однако у меня нет опыта работы с IPC, и я определенно не смогу провалить эту демонстрацию за 3 недели ... Какой IPC будет безопасным способом начать?

Спасибо. Лили


person Lily    schedule 18.05.2010    source источник


Ответы (4)


Я столкнулся с аналогичным вопросом.

Я нашел полезными следующие страницы - Производительность IPC: именованная труба против сокета (в частности) и Сокеты и именованные каналы для локального IPC в Windows ?.

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

person Arandia    schedule 01.06.2010

Наилучшие результаты вы получите с помощью решения Общая память.

Недавно я встретился с тем же эталонным тестированием IPC. И я думаю, что мои результаты будут полезны всем, кто хочет сравнить производительность IPC.

Контрольный показатель трубы:

Message size:       128
Message count:      1000000
Total duration:     27367.454 ms
Average duration:   27.319 us
Minimum duration:   5.888 us
Maximum duration:   15763.712 us
Standard deviation: 26.664 us
Message rate:       36539 msg/s

Тест FIFO (именованные каналы):

Message size:       128
Message count:      1000000
Total duration:     38100.093 ms
Average duration:   38.025 us
Minimum duration:   6.656 us
Maximum duration:   27415.040 us
Standard deviation: 91.614 us
Message rate:       26246 msg/s

Контрольный показатель очередей сообщений

Message size:       128
Message count:      1000000
Total duration:     14723.159 ms
Average duration:   14.675 us
Minimum duration:   3.840 us
Maximum duration:   17437.184 us
Standard deviation: 53.615 us
Message rate:       67920 msg/s

Тест общей памяти:

Message size:       128
Message count:      1000000
Total duration:     261.650 ms
Average duration:   0.238 us
Minimum duration:   0.000 us
Maximum duration:   10092.032 us
Standard deviation: 22.095 us
Message rate:       3821893 msg/s

Тест сокетов TCP:

Message size:       128
Message count:      1000000
Total duration:     44477.257 ms
Average duration:   44.391 us
Minimum duration:   11.520 us
Maximum duration:   15863.296 us
Standard deviation: 44.905 us
Message rate:       22483 msg/s

Тест сокетов домена Unix

Message size:       128
Message count:      1000000
Total duration:     24579.846 ms
Average duration:   24.531 us
Minimum duration:   2.560 us
Maximum duration:   15932.928 us
Standard deviation: 37.854 us
Message rate:       40683 msg/s

Тест ZeroMQ:

Message size:       128
Message count:      1000000
Total duration:     64872.327 ms
Average duration:   64.808 us
Minimum duration:   23.552 us
Maximum duration:   16443.392 us
Standard deviation: 133.483 us
Message rate:       15414 msg/s
person chronoxor    schedule 09.01.2019

В Windows вы можете использовать WM_COPYDATA, особый вид IPC на основе общей памяти. Это старый, но простой метод: «Процесс A» отправляет сообщение, которое содержит указатель на некоторые данные в его памяти, и ждет, пока «Процесс B» не обработает (извините) сообщение, например создает локальную копию данных. Этот метод довольно быстр и работает также в Windows 8 Developer Preview (см. Мой тест < / а>). Таким образом можно транспортировать любые данные, сериализовав их на отправителе и десериализовав на стороне получателя. Также просто реализовать очереди сообщений отправителя и получателя, чтобы сделать связь асинхронной.

person kol    schedule 12.10.2011
comment
согласно вашему тесту, мне просто интересно, почему у Win7 такая плохая производительность. - person stanleyxu2005; 22.05.2012
comment
потому что это нетбук с относительно медленным одноядерным процессором Atom - person kol; 25.05.2012

Вы можете проверить это сообщение в блоге https://publicwork.wordpress.com/2016/07/17/endurox-vs-zeromq/

По сути, он сравнивает Enduro / X, который построен на очередях POSIX (очереди ядра IPC), с ZeroMQ, который может доставлять сообщения одновременно на несколько разных транспортных классов, в т.ч. tcp:// (сетевые сокеты), ipc://, inproc://, pgm:// и epgm:// для многоадресной рассылки.

Из диаграмм вы можете увидеть, что в какой-то момент при больших пакетах данных Enduro / X, работающий в очередях, побеждает сокеты.

Обе системы работают хорошо с ~ 400 000 сообщений в секунду, но с сообщениями 5 КБ очереди ядра работают лучше.

Источник: https://publicwork.wordpress.com/2016/07/17/endurox-vs-zeromq/

(источник изображения: https://publicwork.wordpress.com/2016/07/17/endurox-vs-zeromq/)


ОБНОВЛЕНИЕ: еще одно обновление в качестве ответа на приведенный ниже комментарий. Я также повторно запустил тест, чтобы запустить ZeroMQ на ipc://, см. изображение:

Источник: https://publicwork.wordpress.com/2016/07/17/endurox-vs-zeromq/

Как мы видим, ZeroMQ ipc:// лучше, но снова в некотором диапазоне Enduro / X показывает лучшие результаты, и снова ZeroMQ берет верх.

Таким образом, я могу сказать, что выбор IPC зависит от работы, которую вы планируете выполнять.

Обратите внимание, что ZeroMQ IPC работает на каналах POSIX. Пока Enduro / x работает в очередях POSIX.

person Madars Vi    schedule 15.11.2016
comment
Позвольте мне спросить, заметили ли вы, указанный тест / сравнение не использует ZeroMQ в том же транспортном классе (пытается сравнить tcp:// с ipc://)? Сможете ли вы предоставить честные результаты сравнения яблок с яблоками, где и Enduro / X и ZeroMQ используют IPC? - person user3666197; 15.11.2016
comment
См. Выше, я повторно протестировал с ipc: // - person Madars Vi; 15.11.2016
comment
+1 за заботу. Как будет работать Enduro / X в сценариях, где большие двоичные объекты обрабатываются в распределенной системе со смешанными несколькими транспортными классами - tcp:// (для кластерных распределенных SIG) + inproc:// (для самой быстрой / минимальной задержки внутрипроцессной передачи сообщений) + epgm:// ( для финальной потоковой передачи контента)? Как работает масштабирование производительности - после добавления 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 одноранговых узлов при заданном количестве потоков ввода-вывода (механизм .Context() может работать)? - person user3666197; 15.11.2016
comment
Enduro / X использует TCP для соединения до 32 узлов кластерного сервера. Где каждый узел кластера выполняет локальный IPC (как на диаграмме выше) между процессами. Процессы - это отдельные исполняемые копии, контролируемые сервером приложений (что обеспечивает баланс нагрузки и отказоустойчивость в случае выхода из строя каких-либо двоичных файлов). Enduro / X не поддерживает многоадресную форму (кроме парадигмы событий подписки / публикации для сервисов XATMI). Таким образом, требуется многоадресная передача для конечных устройств, а затем разработчику необходимо создать сервер или клиент XATMI адаптера для самостоятельной потоковой передачи epgm. Ознакомьтесь с файлом readme здесь github.com/endurox-dev/endurox - person Madars Vi; 15.11.2016
comment
Для выполнения того, что просит user3666197, вы можете объединить Enduro / X в качестве сервера приложений, ipc: // и tcp: // transport. А для выполнения epgm: // вы можете использовать ZeroMQ. Обе системы поддерживают обработку больших двоичных объектов. - person Madars Vi; 15.11.2016