Производительность UDP Multicast под нагрузкой - PullRequest
6 голосов
/ 31 октября 2009

У меня есть простое приложение на C #, которое использует многоадресную передачу UDP в сценарии с одним получателем и одним отправителем. Цель состоит в том, чтобы доставить сообщение как можно быстрее в локальной сетевой среде.

Я использовал SocketAsyncEventArgs / SendAsync / ReceiveAsync, BeginSend / BeginReceive, Threads / Send / Receive и пробовал многоадресную передачу PGM и UDP.

Каждая попытка реализации работает нормально для повторной доставки сообщений примерно до 1000 сообщений с локальной отправкой, локальным получением. После этого производительность начинает падать в геометрической прогрессии. Если 1000 сообщений занимают несколько сотых секунды, 10000 сообщений могут занять от 2 до 10 секунд.

Кто-нибудь имеет опыт высокопроизводительной многоадресной передачи UDP / PGM? Каков наилучший дизайн для получения максимальной пропускной способности?

Обновление

На данный момент это всего лишь одна программа, работающая локально - 1 приложение с 1 отправителем и 1 получателем. Тестовые сообщения имеют размер 4 байта.

Ответы [ 2 ]

9 голосов
/ 05 ноября 2009

Попробуйте сделать буфер отправки или получения вашего сокета (сервер или клиент) достаточно большим, чтобы вместить ожидаемый объем трафика. Вот пример кода C # с моего собственного сервера / клиента многоадресной рассылки UDP на стороне сервера, где dataSock - это мой Socket, связанный с группой многоадресной рассылки UDP:

dataSock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveBuffer, (NumberOfPackets * PacketSize) + SmallEpsilonForExtraHeadroom);

Также убедитесь, что на клиентской стороне установлено значение SocketOptionName.SendBuffer, соответствующее размеру буфера, создаваемого вашим сервером.

Я бы также порекомендовал, если вы еще не знали, сделать размер вашего пакета меньше, чем MTU. По умолчанию для MTU установлено значение 1500 байт. (MTU - максимальный размер блока передачи)

Вы можете по-прежнему получать пропущенные пакеты, если вы также не снизите скорость отправки, чтобы ваши клиенты не отставали. Ваше сетевое оборудование, скорее всего, является , а не узким местом. См. Мой вопрос Требуется микросекундная задержка в приложении .NET для регулирования скорости многоадресной передачи UDP для ответа на эту проблему (использование Stopwatch в цикле while для задержек порядка микросекунд).

1 голос
/ 31 октября 2009

Я не эксперт в этом, но звучит так, будто вы столкнулись с пропускной способностью вашей сети. Возможно, вам придется обновить ваше оборудование, чтобы повысить пропускную способность. Но не зная размера пакетов, пропускной способности сети или количества машин, которые пытаются установить связь и т. Д., Это только предположение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...