2010-07-22 6 views
0

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

+0

Какова пропускная способность линии связи между двумя машинами? Уверены ли вы, что у вас нет узкого места процессора (т. Е. Вы не работаете на 100% процессоре)? – adamk

+0

пропускная способность 1 Гбит/с. нет .. cpu находится на 30% ~ – EricBenDavid

ответ

4

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

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

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

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

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

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

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

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

1

использования сеть 1Gbps и обновить сетевое оборудование ...

+3

Он явно не использует сеть 100 Мбит или он не получит 400 Мбит/с ... – adamk

+0

100MByte network! = 100MBit network :) – ariso

0

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

Поэтому вы можете попробовать несколько потоков блокирующих вызовов.

+0

им ограничен одним конкретным портом отправки и получения. как я знаю, вы не можете открыть 2 гнезда на том же порту .. – EricBenDavid

2

Некоторые вещи, чтобы посмотреть на:

  • Connected UDP сокетов (some info) контекстных несколько операций в ядре, так быстрее (см Stevens ОНП книга для подробностей).
  • Оправа отправлять и получать буферы - играть с SO_SNDBUF и SO_RCVBUF параметров сокета, чтобы сбалансировать шипы и пакет падение
  • Смотрите, если вы можете поднять ссылку MTU и использовать jumbo frames.
0

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

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

1

Test предел пакета вашего оборудования с уже проверенной кусок кода, такие как Iperf:

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

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

Скорее ваша сетевая карта не работает хорошо, попробуйте серверный адаптер Intel Gigabit:

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