C # UDPClient плохая пропускная способность - PullRequest
4 голосов
/ 30 августа 2010

У нас есть производственная система, которая собирает данные телеметрии с удаленных устройств.Эти данные отправляются с разумной частотой, и мы получаем до тысячи сообщений в секунду в часы пиковой нагрузки.Полезная нагрузка составляет около 80 байтов на сообщение.Я начинаю проводить тестирование производительности различных механизмов хранения, но сначала подумал, что я попытаюсь увидеть, насколько быстро я смогу использовать UDP без какого-либо хранения данных.Я получаю примерно 70 000 сообщений в секунду при тестировании максимальной пропускной способности на моем локальном компьютере (похоже, примерно то же самое, если я использую другую машину для отправки тестовых данных).По моим грубым подсчетам, это намного ниже, чем я ожидал, учитывая пропускную способность сети.Отправитель зацикливается на отправке данных.Я полностью осведомлен обо всех проблемах с UDP re;потерянные пакеты и т. д. Я просто хочу получить представление о слабых местах наших систем.

Низкая ли пропускная способность из-за небольшого размера пакета?

Matt

private IPEndPoint _receiveEndpoint = new IPEndPoint(IPAddress.Any, _receivePort);
private Stopwatch sw = new Stopwatch();
private int _recievedCount = 0;
private long _lastCount = 0;
private Thread _receiverThread;
private bool _running = true;

_clientReceive = new UdpClient();
_clientReceive.Client.Bind(_receiveEndpoint);
_receiverThread = new Thread(DoReceive);
_receiverThread.Start();

  while (_running)
  {
    Byte[] receiveBytes = _clientReceive.Receive(ref _receiveEndpoint);

    _clientReceive.Receive(ref _receiveEndpoint);
    if (!sw.IsRunning)
      sw.Start();
    string receiveString = Encoding.ASCII.GetString(receiveBytes);
    _recievedCount = ++_recievedCount;
    long howLong = sw.ElapsedMilliseconds;
    if (howLong/1000 > _lastCount)
    {
      _lastCount = howLong/1000;
      Invoke(new MethodInvoker(() => { Text = _recievedCount + " iterations in " + sw.ElapsedMilliseconds + " msecs"; }));
    }
}

Ответы [ 2 ]

1 голос
/ 30 августа 2010

Множество маленьких пакетов UDP определенно приведет к более низкой пропускной способности сети, чем вы получили бы с более крупными пакетами, однако учитывали ли вы размеры заголовков IP и UDP в своих вычислениях?

Кроме того, 70 тыс. Сообщений в секунду очень и очень высоки, и определенно не то, что вы хотели бы, чтобы происходило через Интернет, если бы именно в этом случае приложение было в конечном итоге развернуто.Даже тысячи сообщений в секунду высоки, и если бы это был я, я бы попытался сделать общение с телеметрическим оборудованием менее разговорчивым, возможно, путем объединения нескольких показаний в одну передачу.

Если это не таквариант, и вы находитесь в частной сети, и вам нужно увеличить пропускную способность сети, возможно, вам придется начать смотреть на свою сетевую карту, ее драйвер, а затем точную настройку некоторых параметров сети Windows.Но что бы вы ни делали с сообщениями, вы почти наверняка попадете в тупик при любой обработке, которую вы выполняете с ними, особенно если это касается диска, прежде чем вы доберетесь до 70 000 сообщений в секунду (я был бы удивлен, если бы вы могли дажедо 10K / сек, когда вы делаете с ними что-нибудь полезное).

1 голос
/ 30 августа 2010

Да, вы должны выполнить измерения с различными размерами полезной нагрузки и посмотреть, какую пропускную способность вы получаете. Для небольших полезных нагрузок могут быть издержки с заголовками UDP / IP / Ethernet, которые могут снизить вашу пропускную способность.

Также см. Следующую статью о SO: Проблемы с достижением пропускной способности UDP 1 Гбит

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