2009-10-31 3 views
6

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

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

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

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

Update

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

ответ

9

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

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

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

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

Вы по-прежнему можете получить упавшие пакеты, если вы не снижаете скорость отправки, чтобы ваши клиенты не отставали. Скорее всего, ваше сетевое оборудование не является узким местом здесь. См. Мой вопрос Need microsecond delay in .NET app for throttling UDP multicast transmission rate для ответа на эту проблему (с использованием Stopwatch в цикле while для задержек порядка микросекунд).

+0

Спасибо за продуманную информацию. – Anton

+0

Нет проблем. В настоящий момент я тоже в траншеях с этим материалом. :) –

1

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

Смежные вопросы