Максимизация производительности на UDP - PullRequest
0 голосов
/ 22 июля 2010

Я работаю над проектом с двумя клиентами, одним для отправки, а другим для получения дейтаграмм udp, между двумя машинами, подключенными напрямую друг к другу. каждая датаграмма имеет размер 1024 байта и отправляется с помощью winsock (блокировка). они оба работают на очень быстрых машинах (отдельно). с 16-Гбайт оперативной памятью и 8 процессорами, с дисками raid 0.
я ищу советы, чтобы максимизировать мою пропускную способность, советы должны быть на уровне winsock, но если у вас есть другие советы, было бы здорово.
В настоящее время я получаю скорость передачи 250-400 Мбит. я ищу больше.
спасибо.

Ответы [ 6 ]

4 голосов
/ 22 июля 2010

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

Максимизируйте размер пакета, который вы отправляете, когда используете надежное соединение. Для 100 Мбит Ethernet максимальный пакет составляет 1518, Ethernet использует 18 из этого, IPv4 использует 20-64 (обычно 20, подумано), а UDP использует 8 байтов. Это означает, что обычно вы должны иметь возможность отправлять 1472 байта полезной нагрузки UDP на пакет.

Если вы используете оборудование Gigabit Ethernet, которое поддерживает его, размер вашего пакета увеличивается до 9000 байт (гигантских кадров), поэтому отправка чего-то ближе к этому размеру должна ускорить процесс.

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

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

Отключите как можно больше пользователей сети. Если вы используете коммутатор Ethernet, вам следует сконцентрироваться на вещах, которые будут вводить трафик к компьютерам / сетевым устройствам, на которых запущены ваши приложения, и использовать их (в том числе широковещательные сообщения, например, многие запросы ARP). Если это концентратор, вы можете отключить всю сеть. Windows имеет тенденцию посылать постоянный поток мусора в сети, что во многих случаях бесполезно.

Могут быть установлены ограничения на пропускную способность сети, которую может иметь одно приложение или пользователь. Или могут быть ограничения на пропускную способность сети, которую ОС будет использовать самостоятельно. Вероятно, их можно изменить в реестре, если они существуют.

Чипы сетевого интерфейса нередко фактически не поддерживают максимальную пропускную способность сети все время. Существуют микросхемы, которые могут пропускать пакеты, потому что они заняты обработкой предыдущего пакета, а также некоторые, которые просто не могут отправлять пакеты настолько близко, насколько позволяют спецификации Ethernet. Кроме того, остальная часть системы может не справиться, даже если это так.

2 голосов
/ 22 июля 2010

На что посмотреть:

  • Подключенные UDP-сокеты ( некоторая информация ) позволяют выполнять несколько операций в ядре, поэтому они выполняются быстрее (подробности см. В книге Стивенса UnP).
  • Сокет буферы отправки и получения - играть с опциями сокетов SO_SNDBUF и SO_RCVBUF, чтобы сбалансировать пики и отбрасывание пакетов
  • Посмотрите, можете ли вы увеличить ссылку MTU и использовать большие кадры .
1 голос
/ 28 июля 2010

Проверьте ограничение пакета вашего оборудования с помощью уже проверенного фрагмента кода, такого как iperf:

http://www.noc.ucf.edu/Tools/Iperf/

Я связываю сборку Windows, это может быть хорошей идеейзагрузить Linux LiveCD и попробовать сборку Linux для сравнения стеков IP.

Скорее всего, ваша сетевая карта работает неэффективно, попробуйте адаптер Gigabit Server Intel:

http://www.intel.com/network/connectivity/products/server_adapters.htm

1 голос
/ 22 июля 2010

использовать сеть 1 Гбит / с и модернизировать сетевое оборудование ...

0 голосов
/ 23 июля 2010

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

Если вы ищете надежную передачу данных, рассмотрите UDT .

0 голосов
/ 22 июля 2010

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

Так что вы можете попробовать несколько потоков блокировки вызовов.

...