Низкая производительность широковещательной передачи UDP для нескольких процессов на одном ПК - PullRequest
1 голос
/ 08 ноября 2011

У нас есть приложение, которое передает данные по протоколу UDP с серверной системы на клиентские приложения, работающие на нескольких компьютерах с Windows XP.Это в локальной сети, обычно Gigabit.Это работало нормально в течение нескольких лет.

Теперь у нас есть требование, чтобы на каждом четырехъядерном ПК было запущено два (или более) клиентских приложения, причем каждый экземпляр приложения получал широковещательные данные.Метод, который я использовал для реализации этого, состоит в том, чтобы назначить каждому клиентскому ПК несколько IP-адресов.Затем каждое клиентское приложение подключается к серверу, используя тот же номер порта, но с другим IP-адресом.Это работает функционально, но производительность по какой-то причине очень низкая.Моя скорость передачи данных снижается примерно в 10 раз!

. Чтобы получить несколько IP-адресов, я попытался использовать оба адаптера NIC и назначить несколько IP-адресов одному NIC в расширенных сетевых свойствах TCP / IP.Оба метода, похоже, дают одинаково низкую производительность.Я также попытался использовать сетевые карты нескольких разных производителей, но это тоже не помогло.

Одна вещь, которую я заметил, это то, что данные кажутся более фрагментированными.Если на компьютере только один клиент, то если я отправляю клиенту 20 КБ данных, он почти всегда получает все это одним куском.Но при работе двух клиентов данные, как правило, поступают в блоках размером в кадр (1500 байт), поэтому мой код должен повторяться больше раз.Но я бы не ожидал, что это само по себе вызовет столь драматический удар по производительности.

Так что я думаю, что мой вопрос: кто-нибудь знает, почему производительность намного медленнее и можно ли что-нибудь сделать, чтобы ускорить ее?up?

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

1 Ответ

1 голос
/ 10 ноября 2011

Вместо создания одного IP-адреса для каждого клиента, попробуйте использовать setsockopt (), чтобы включить опцию SO_REUSEADDR для каждого из ваших сокетов. Это позволит всем вашим клиентам подключаться к одному и тому же порту на одном и том же адресе хоста и получать широковещательные данные. Должно быть проще в управлении, чем подход с несколькими NIC / IP-адресами.

SO_REUSEADDR позволит широковещательным и многоадресным сокетам использовать один и тот же порт и адрес. Для получения дополнительной информации см .: SO_REUSEADDR и поведение UDP в Windows а также Использование SO_REUSEADDR?

...