Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 Межпроцессное взаимодействие - что быстрее?  [new]
13th
Member

Откуда:
Сообщений: 463
Какой самый быстрый способ межпроцессного взаимодействия в Windows? Надо передавать много (300..500) небольших сообщений из одного процесса в 3-5 других.
Интересует минимальная задержка и минимальная нагрузка на процессор.
Сейчас использую COM - предел производительности достигнут. Нужно что-то, что побыстрее.
30 мар 18, 12:48    [21299029]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
NekZ
Member

Откуда: Санкт-Петербург
Сообщений: 3194
13th,

Named Pipes
30 мар 18, 12:53    [21299052]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 2324
13th, если небольших сообщений, то можно попробовать Mailslots, а в общем случае - у memory-mapped файлов конкурентов нет.
30 мар 18, 12:55    [21299058]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
13th
Member

Откуда:
Сообщений: 463
NekZ
13th,

Named Pipes


Как и с чем сравнивал?
30 мар 18, 12:57    [21299064]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
13th
Member

Откуда:
Сообщений: 463
rdb_dev
13th, если небольших сообщений, то можно попробовать Mailslots, а в общем случае - у memory-mapped файлов конкурентов нет.

Сообщения от 20 до 50 байт.
А как в случае файлов происходит уведомление об изменении? Там какой-то callback или через Wait-функцию?
30 мар 18, 12:59    [21299066]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45275

13th
А как в случае файлов происходит уведомление об изменении?

Любым способом на который хватит больной фантазии. От "вообще никак" и критических секций
до отмашки флажками.

Posted via ActualForum NNTP Server 1.5

30 мар 18, 13:10    [21299104]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6202
13th
Какой самый быстрый способ межпроцессного взаимодействия в Windows? Надо передавать много (300..500) небольших сообщений из одного процесса в 3-5 других.
Интересует минимальная задержка и минимальная нагрузка на процессор.
Сейчас использую COM - предел производительности достигнут. Нужно что-то, что побыстрее.

Lock-free очередь через memory-mapped файл
30 мар 18, 14:18    [21299494]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45275

Anatoly Moskovsky
Lock-free очередь через memory-mapped файл

Поток сообщений у него, пожалуй, маловат для lock-free. Процессор будет зря грузиться.

Posted via ActualForum NNTP Server 1.5

30 мар 18, 15:46    [21299969]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
13th
Member

Откуда:
Сообщений: 463
Прошу прощенья, не совсем точно написал.
Надо передавать 300..500 сообщений В СЕКУНДУ.
30 мар 18, 16:45    [21300236]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45275

13th
Надо передавать 300..500 сообщений В СЕКУНДУ.

500 небольших сообщений по килобайту это полмегабайта в секунду. На этом вообще затыка
быть не может: TCP со всем его оверхэдом способно гнать мегабайты в секунду и ещё поспать
по ходу.

Posted via ActualForum NNTP Server 1.5

30 мар 18, 17:10    [21300310]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
13th
Member

Откуда:
Сообщений: 463
Dimitry Sibiryakov, 500 сообщений - это не не пол-мегабайта. 500 сообщений в 5 клиентов - это 3000 переключений контекстов процесса в секунду.
Я давно тебя просил не появляться в моих темах: у тебя поверхностный взгляд и неуместный апломб.
30 мар 18, 17:45    [21300406]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
13th
Member

Откуда:
Сообщений: 463
Anatoly Moskovsky, для lock-free нужен общий менеджер памяти. Для, для межпотокового взаимодействия - самое оно. Но есть реализации для межпроцесного взаимодействия? Я не в курсе этой темы, кинь, пожалуйста, пару ссылок, с чем работал ты.
30 мар 18, 17:47    [21300413]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 6762
13th
Dimitry Sibiryakov, 500 сообщений - это не не пол-мегабайта. 500 сообщений в 5 клиентов - это 3000 переключений контекстов процесса в секунду.
Я давно тебя просил не появляться в моих темах: у тебя поверхностный взгляд и неуместный апломб.

И что? 500,5,3000... для IP, а тем более loopback раз плюнуть

У меня на Descktop (1 проц, 2 ядра. 4 HT ядра) под 40-50 Mb/s в 200 байтных пакетах без проблем получалось. С натяжкой > 100 Mb/s. Т.е. пара сотен тысяч IP пакетов через loopback.

Общую память и lock free очереди используют когда надо под сотню миллионов сообщений в секунду передать. AFAIK

IP через Loopback в Windows давно оптимизировано для inter process communication. По реальному Etnernet (даже 10G) скорость будет существенно меньше.
30 мар 18, 17:53    [21300423]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45275

13th
для lock-free нужен общий менеджер памяти

MMF это и есть shared memory.

Posted via ActualForum NNTP Server 1.5

30 мар 18, 18:09    [21300452]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
13th
Member

Откуда:
Сообщений: 463
Leonid Kudryavtsev, а какая задержка на пакете получается?
Мне надо сделать, что бы работало как COM сейчас: сервер - подписчики, событие - отправил пакет - обработался в процессах А, Б, В, на каждое событие.
Если скорость достигается за счёт группировки, т.е. за счёт того, что call-back вызов дёргается один раз на несколько событий - тогда не годится.
30 мар 18, 18:42    [21300495]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6202
13th
500 сообщений - это не не пол-мегабайта. 500 сообщений в 5 клиентов - это 3000 переключений контекстов процесса в секунду.

Вообще если вы возьмете любой способ синхронизации, то спокойно сотни тысяч сообщений в секунду можно получить. Ради этих 500/s нет смысла морочиться с локфри.
Dimitry Sibiryakov
Поток сообщений у него, пожалуй, маловат для lock-free. Процессор будет зря грузиться.

Наверно да.
13th
ля lock-free нужен общий менеджер памяти.

Чаще всего не нужен. Обычно можно сообщения упаковывать в один непрерывный кусок памяти и просто скопировать его в очередь при отправке, а на принимающей стороне распаковать.
Сама очередь - это простой закольцованный буфер с двумя указателями - места чтения и записи.
30 мар 18, 19:18    [21300620]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
13th
Member

Откуда:
Сообщений: 463
Anatoly Moskovsky
Вообще если вы возьмете любой способ синхронизации, то спокойно сотни тысяч сообщений в секунду можно получить. Ради этих 500/s

Ну вот, взял такой:
Сделал memory-mapped файл, пишу в него, делаю Set эвенту, в клиенте читаю. Размер структуры - тривиальный, 8 байт.
Получается 20 тысяч в секунду. Процессор i5-4440. До сотен тысяч далеко.

код сервера:
	for (size_t i = 0; i < uCount; i++)
	{
		data.nNumber = (int)i;
		CopyMemory((PVOID)pBuf, &data, sizeof(SData));
		
		evWrite.Set();
		evRead.WaitOne();
		evRead.Reset();
	}


код клиента:
		do
		{
			evWrite.WaitOne();
			CopyMemory(&data, (PVOID)pBuf, sizeof(SData));
			evWrite.Reset();
			evRead.Set();
		} while (data.cmd != ECommand::eQuit);
30 мар 18, 19:28    [21300658]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45275

13th
До сотен тысяч далеко.

Потому что у тебя очередь из одного элемента и процесс не распараллеливается от слова
"вообще". При таком подходе нет смысла разносить код в разные приложения или потоки: он
выполняется строго последовательно.

Posted via ActualForum NNTP Server 1.5

30 мар 18, 20:14    [21300756]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6202
13th
Ну вот, взял такой:
Сделал memory-mapped файл, пишу в него, делаю Set эвенту, в клиенте читаю. Размер структуры - тривиальный, 8 байт.
Получается 20 тысяч в секунду. Процессор i5-4440. До сотен тысяч далеко.

Как выше уже написали здесь проблема в том что нет очереди.
Как только появляется очередь, то сигналы можно слать уже не на каждое сообщение, а только если очередь пуста/полна (а тогда и так одна из сторон простаивает и скорость сигналов не важна). А в промежутках между этим применяется обычный мьютекс.
Я в такой конфигурации получал не то что сотни тысяч - а даже миллионы в сек.
30 мар 18, 23:34    [21301097]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3069
Anatoly Moskovsky,

здесь проблема в

автор
Мне надо сделать, что бы работало как COM сейчас: сервер - подписчики, событие - отправил пакет - обработался в процессах А, Б, В, на каждое событие.
Если скорость достигается за счёт группировки, т.е. за счёт того, что call-back вызов дёргается один раз на несколько событий - тогда не годится.
как только требуется ждать ответа - приходит беленький пушистый зверёк.

Ему придётся весь код в асинхронный переделывать
31 мар 18, 00:45    [21301260]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
Малыхин Сергей
Member

Откуда: г. Курск
Сообщений: 677
А как же разделяемая память? [url=]https://www.google.ru/search?q=shared memory&oq=shared &aqs=chrome.2.69i57j0l5.10823j0j7&sourceid=chrome&ie=UTF-8[/url]
Что то быстрее сложно придумать =)
31 мар 18, 04:04    [21301352]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
Dima T
Member

Откуда:
Сообщений: 12250
ИМХО в пределах одной машины можно по UDP слать. При такой маленькой нагрузке потерь не должно быть.

Поизучай ZeroMQ - это легковесная очередь сообщений с различными стратегиями рассылки сообщений.
В форуме по дельфям ее подробно обсуждали.
31 мар 18, 08:01    [21301424]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
13th
Member

Откуда:
Сообщений: 463
Ближайшая аналогия: поток котировок. Ты должен доставить котировку в несколько модулей. Один модуль считает стратегию. Второй - баланс. Третий - отчёт. Поток котировок, естественно, идёт из одного потока. Задержка в 1..1,5ms терпима. Но пересылать группами по 100 штук - уже без варика. Так же нельзя менять порядок котировок - по понятным причинам.

Anatoly Moskovsky
Как выше уже написали здесь проблема в том что нет очереди.
Как только появляется очередь, то сигналы можно слать уже не на каждое сообщение, а только если очередь пуста/полна (а тогда и так одна из сторон простаивает и скорость сигналов не важна). А в промежутках между этим применяется обычный мьютекс.


Должно обрабатываться КАЖДОЕ сообщение. Никакой очереди быть не может. Если бы можно было бы группировать, я бы всё отправил один раз в секунду, и это заняло бы 10ms.
Каждое сообщение должно обрабатываться В СВОЮ ОЧЕРЕДЬ. Поэтому никакого распараллеливания отправки тоже быть не может. Клиенты и так работают параллельно.

Anatoly Moskovsky
Я в такой конфигурации получал не то что сотни тысяч - а даже миллионы в сек.

Можешь кусок кода показать?
31 мар 18, 12:36    [21301726]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
13th
Member

Откуда:
Сообщений: 463
Leonid Kudryavtsev
И что? 500,5,3000... для IP, а тем более loopback раз плюнуть

У меня на Descktop (1 проц, 2 ядра. 4 HT ядра) под 40-50 Mb/s в 200 байтных пакетах без проблем получалось. С натяжкой > 100 Mb/s. Т.е. пара сотен тысяч IP пакетов через loopback.

Ты имеешь ввиду обычный Winsock?
31 мар 18, 12:38    [21301731]     Ответить | Цитировать Сообщить модератору
 Re: Межпроцессное взаимодействие - что быстрее?  [new]
13th
Member

Откуда:
Сообщений: 463
Малыхин Сергей
А как же разделяемая память? [url=]https://www.google.ru/search?q=shared memory&oq=shared &aqs=chrome.2.69i57j0l5.10823j0j7&sourceid=chrome&ie=UTF-8[/url]
Что то быстрее сложно придумать =)

Тему прочти
31 мар 18, 12:40    [21301733]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / C++ Ответить